我开始研究 Zend_Form 组件并了解它的大部分方面。我知道如何添加表单元素并为它们设置配置选项,如何应用表单装饰器,如何添加验证器和过滤器......但是今天我卡在了这些表单的处理上。
有一件特别的事情让我感到困惑。我将用一个尽可能简单的例子来说明它。
首先,我们将表单创建为一个单独的类。这里没什么特别的,只有一个用户名和密码字段以及一个提交按钮。我们还将向它们添加标签以及一些过滤器和验证器。
class Login_Form extends Zend_Form
{
public function init()
{
$this->setaction('/user/login')
->setMethod('post');
$username = new Zend_Form_Element_Text('username');
$username->setLabel('Username:')
->setRequired(true)
->addFilter('StringToLower')
->addValidator('NotEmpty');
$password = new Zend_Form_Element_Password('password');
$password->setLabel('Password:')
->setRequired(true);
$submit = new Zend_Form_Element_Submit('submit');
$submit->setValue('Submit');
$this->addElements(array(
$username,
$password,
$submit
));
return $this;
}
}
接下来,我们将创建一个带有“登录”操作方法的“用户”操作控制器。在这里,我想检查表单是否已提交(如果没有,则应显示)并验证它。注意两行相同的代码。虽然 $form 对象同时没有改变,第一个没有输出,第二个有。
class UserController extends Zend_Controller_Action
{
public function loginAction()
{
$form = new Login_Form;
// Check if form got submitted
if ($this->getRequest()->isPost())
{
// This does not produce output
echo 'Username: ' . $form->getValue('username');
if ($form->isValid($_POST))
{
// This does produce output (same line of code as above)
echo 'Username: ' . $form->getValue('username');
}
else
{
echo $form;
}
}
else
{
echo $form;
}
}
}
如果我只想要未过滤的值,我可以从请求对象中获取它们$this->getRequest()->getPost()
。我想要过滤后的值(过滤器是在 Login_Form 类中定义的),所以我应该从带有getValues()
. 我发现调用isValid()
它后 $form 对象发生了变化(它只返回一个布尔值并且不改变 $form 对象),这非常奇怪。对此的任何帮助将不胜感激!