0

我有一个简单的 Zend 表单,其中包含一个带有 setRequired(TRUE) 和其他验证器的文本框以及 IndexController 中的一个简单提交按钮。

我的问题是,是否有可能另一个控制器将处理和验证我的帖子表单?

登录.php

<?php

class Application_Form_Login extends Zend_Form
{

    public function init()
    {
        $username = $this->createElement('text', 'username');
        $username->setLabel('Username:');
        $username->setRequired(TRUE);
        $username->addValidator(new Zend_Validate_StringLength(array('min' => 3, 'max' => 10)));
        $username->addFilters(array(
                new Zend_Filter_StringTrim(),
                new Zend_Filter_StringToLower()
                )
        );
        $this->addElement($username);

        // create submit button
        $this->addElement('submit', 'login',
                array('required'    => false,
                'ignore'    => true,
                'label'     => 'Login'));
    }}

索引控制器.php

<?php

class AttendantController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $loginForm = new Application_Form_Login();
        $loginForm->setAction('/Auth/process');
        $loginForm->setMethod('post');
        $this->view->loginForm = $loginForm;
    }
}

AuthController.php

class AuthController extends Zend_Controller_Action
{
    public function processAction()
    {
        // How to validate the form posted here in this action function?
        // I have this simple code but I'm stacked here validating the form

        // Get the request
        $request = $this->getRequest();
        // Create a login form
        $loginForm = new Application_Form_Login();
        // Checks the request if it is a POST action
        if($request->isPost()) {
            $loginForm->populate($request->getPost());
            // This is where I don't know how validate the posted form
            if($loginForm->isValid($_POST)) {
                // codes here
            }
        }
    }
}
4

2 回答 2

0

你很接近。在流程操作中,您创建登录表单的新实例(您正在执行此操作),并将 POST 数据传递给isValid()该表单的方法以进行验证。所以:

public function processAction()
{
    $request = $this->getRequest();

    $loginForm = new Application_Form_Login();
    if($request->isPost()) {
        if($loginForm->isValid($request->getPost)) {
            // codes here
        } else {
            // assign the login form back to the view so errors can be displayed
            $this->view->loginForm = $loginForm;
        }
    }
}

通常在同一个动作中显示和处理表单更容易,并且在提交成功时重定向。这是 Post/Redirect/Get 模式 - 请参阅http://en.wikipedia.org/wiki/Post/Redirect/Get。这使您不必在两个不同的操作中创建相同表单的实例,并且在出现错误时更容易重新显示表单。

于 2012-11-28T10:28:13.043 回答
0

你正在用吗 ' ?

更改 $loginForm->setAction(/Auth/process);$loginForm->setAction('/auth/process');

您可以从 processAction 中删除$login->populate($request->getPost());

于 2012-11-28T10:28:29.907 回答