Php Zend框架中的表单处理
我开始学习Zend_表单组件,并了解它的大部分方面。我知道如何添加表单元素并为它们设置配置选项,如何应用表单装饰器,如何添加验证器和过滤器。。。但是今天我被卡在了那些表格的处理上 有一件事让我很困惑。我将用一个尽可能简单的例子来说明它 首先,我们将表单创建为一个单独的类。这里没有什么特别的,只有一个用户名和密码字段和一个提交按钮。我们还将添加一个标签以及一些过滤器和验证器Php Zend框架中的表单处理,php,zend-framework,zend-form,Php,Zend Framework,Zend Form,我开始学习Zend_表单组件,并了解它的大部分方面。我知道如何添加表单元素并为它们设置配置选项,如何应用表单装饰器,如何添加验证器和过滤器。。。但是今天我被卡在了那些表格的处理上 有一件事让我很困惑。我将用一个尽可能简单的例子来说明它 首先,我们将表单创建为一个单独的类。这里没有什么特别的,只有一个用户名和密码字段和一个提交按钮。我们还将添加一个标签以及一些过滤器和验证器 class Login_Form extends Zend_Form { public function init(
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\u Form类中定义的),因此我应该使用getValues()
从表单对象获取它们。在调用$form对象上的isValid()
后,$form对象会发生变化,这让我觉得非常奇怪(它只返回一个布尔值,不会改变$form对象)。在此方面的任何帮助都将不胜感激 您应该像这样获得过滤后的值:
$filtered_values = $form->getValidValues ($_POST);
Zend_Form对象的工作原理如下:您需要将提交的实际数据传递给它,它不会从自身的某个地方获取数据。这是因为数据的来源可能不同。一个应用程序总是使用POST,有人想验证GET参数,而另一个完全不同的应用程序甚至没有HTTP请求,但确实想验证来自命令行的输入
我想知道为什么你的代码似乎有效。首先,您的表单甚至没有定义一个方法-肯定会失败。其次,在您的控制器中,我希望$form->getValue('username')可以工作,但对属性的访问不应该工作-我在Zend_表单源代码中没有看到任何设置公共属性的代码。表单确实定义了一个方法,您会注意到,在Login_表单类的顶部,我使用了setMethod()。我还更改了作为属性访问表单元素的代码行。它现在使用$form->getValue('username')。尽管如此,我还是不明白为什么只有在我对表单调用isValid()后才会生成输出。好的,您修复了代码错误。:)除此之外:值仅在调用
isValid()
后可用,因为这是表单了解值的唯一方式。你必须这样使用它,这是故意的。我知道我哪里弄错了,我很清楚为什么akond下面的答案是有效的。但是,我查看了Zend_Form::isValid()方法,据我所知,它不会以任何方式改变Form对象…Zend_Form::isValid()
调用每个元素的Zend_Form\u元素::isValid()
。第一个命令是:Zend\u Form\u Element::setValue()
——因此元素存储要验证的值。之后,所有表单元素都知道它们的当前值。