Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend框架中的表单处理_Php_Zend Framework_Zend Form - Fatal编程技术网

Php Zend框架中的表单处理

Php Zend框架中的表单处理,php,zend-framework,zend-form,Php,Zend Framework,Zend Form,我开始学习Zend_表单组件,并了解它的大部分方面。我知道如何添加表单元素并为它们设置配置选项,如何应用表单装饰器,如何添加验证器和过滤器。。。但是今天我被卡在了那些表格的处理上 有一件事让我很困惑。我将用一个尽可能简单的例子来说明它 首先,我们将表单创建为一个单独的类。这里没有什么特别的,只有一个用户名和密码字段和一个提交按钮。我们还将添加一个标签以及一些过滤器和验证器 class Login_Form extends Zend_Form { public function init(

我开始学习Zend_表单组件,并了解它的大部分方面。我知道如何添加表单元素并为它们设置配置选项,如何应用表单装饰器,如何添加验证器和过滤器。。。但是今天我被卡在了那些表格的处理上

有一件事让我很困惑。我将用一个尽可能简单的例子来说明它

首先,我们将表单创建为一个单独的类。这里没有什么特别的,只有一个用户名和密码字段和一个提交按钮。我们还将添加一个标签以及一些过滤器和验证器

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()
——因此元素存储要验证的值。之后,所有表单元素都知道它们的当前值。