1

我开始研究 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 对象),这非常奇怪。对此的任何帮助将不胜感激!

4

2 回答 2

0

Zend_Form 对象是这样工作的:您需要将提交给它的实际数据传递给它,它不会从某个地方获取它本身。这是因为数据的来源可能会有所不同。一个应用程序总是使用 POST,有人也想验证 GET 参数,而一个完全不同的应用程序甚至没有 HTTP 请求,但确实想验证来自命令行的输入。

我想知道为什么您的代码似乎有效。首先,您的表单甚至没有定义方法 - 肯定会失败。其次,在您的控制器中,我希望 $form->getValue('username') 可以工作,但是对属性的访问不应该工作 - 我没有看到 Zend_Form 源代码中设置公共属性的任何代码。

于 2012-10-13T19:34:19.837 回答
0

您应该得到过滤后的值,如下所示:

$filtered_values = $form->getValidValues ($_POST);
于 2012-10-13T18:44:54.880 回答