Zend:从表单重定向而不进行验证

时间:2013-04-07 12:17:18

标签: forms validation zend-framework redirect

我有一个用于创建新“组”的表单。我现在添加了一个小的“返回”图像,用户应该可以返回一步。我不知道为什么,但是当我点击这个新图像时,使用HTTP POST设置再次调用我想要离开的表单( / admin / creategroup )的控制器和操作。因此,表单验证已完成,我在此表单中停留并显示验证错误。

这是我的表单中带有两个图像按钮的代码片段。我不想“回去” - 图像将我重定向到指定的控制器而不验证表格

    $this->addElement('image', 'btnBack', array (
        'name' => 'btnBack',
        'id'   => 'btnBack',
        'label' => '',
        'title' => 'Go back',
        'alt' => 'Go back',
        'src' => '/img/undo.png',
        'onClick' => "window.location='/admin/groupoverview'"
    ));

    $this->addElement('image', 'btnSave', array (
        'name' => 'btnSave',
        'id'   => 'btnSave',
        'label' => '',
        'title' => 'Save this new group',
        'alt' => 'Save this new group',
        'src' => '/img/save.png',
        'onClick' => "document.forms[0].submit();"
    ));

编辑:
我已经考虑过检查 / admin / creategroup 是否有可能从“btnBack”图像或“btnSave”图像调用它并跳过表单验证并正确重定向,如果源是“btnBack'图像。
我只是认为应该有一个更好的解决方案直接从表单重定向并绕过再次调用 / admin / creategroup

EDIT2:
我的查看脚本:

<div id="createGroupMask">
    <br/>
    Use the form below to create a new group
    <?php
        $this->form->setAction($this->url());
        echo $this->form;
    ?>
</div>

我在控制器中的操作

public function creategroupAction()
{
    $form = new Application_Form_CreateGroup();
    $request = $this->getRequest();

    if ($request->isPost()) {
        if ($form->isValid($request->getPost())) {
            // Data for new group is valid
            ...
        } else {
            // Form data was invalid
            // => This is where I land when pressing the 'back' image
            // No further code here
        }
    }
    $this->view->form = $form;
}

3 个答案:

答案 0 :(得分:0)

现在可以使用:

isValid()循环不正确,你的表单永远不会评估为你所呈现的元素的inValid,你永远不会得到其他。

public function creategroupAction()
{
    $form = new Application_Form_CreateGroup();
    $request = $this->getRequest();

    if ($request->isPost()) {
        if ($form->isValid($request->getPost())) {
            // Data for new group is valid
            ...
        } else {
/* This is incorrect */
            // Form data was invalid
            // => This is where I land when pressing the 'back' image
            // No further code here
        }
    }
    $this->view->form = $form;
}

我的问题是,我不确定从你的表单提交什么,我不是很熟悉你使用“onClick”和我认为是javascript的方式。看起来元素 btnBack 应该在点击时重定向,而元素 btnSave 应该 POST 。然而,这似乎并没有发生。

我在PHP和ZF中使用提交按钮完成了这种类型的操作,也许我所做的流程将有所帮助:

注意:要使此类型的流程起作用,您必须为按钮元素指定标签。该标签用作submit value

//psuedoCode
public function creategroupAction()
{
    $form = new Application_Form_CreateGroup();
    $request = $this->getRequest();

    if ($request->isPost()) {
        if ($form->isValid($request->getPost())) {
            //I would probably opt to perform this task with a switch loop
            if ($form->getValue('btnBack') === some true value) {
               $this->_redirect('new url');
            }
            if ($form->getValue('btnSave') === some true value) {
               //Process and save data
            }

        } else {
            //Display form errors
    }
    $this->view->form = $form;
}

我认为,当你说完所有问题的关键是你没有给你的按钮元素一个标签。

答案 1 :(得分:0)

我尝试为我的图片添加标签,但这不起作用。

我也尝试在我的btnBack-image上使用isChecked()方法,如下所示:

if ($form->btnBack->isChecked()) {
    // 'Go back' image was clicked so this is no real error, just redirect
}

这也不起作用。

我终于能够通过Zend form: image as submit button中回答的以下方法检查点击了哪个图像:

public function creategroupAction()
{
     $form = new Application_Form_CreateGroup();
     $request = $this->getRequest();

     if ($request->isPost()) {
         if ($form->isValid($request->getPost())) {
             // Data for new group is valid
             ...
         } else {
             // Form data was invalid

             if (isset($this->_request->btnBack_x)) {
                 // 'Go back' image was pressed, so this is no error
                 // -> redirect to group overview page
                 $this->_redirect('/admin/groupoverview');
             }
         }
     }
     $this->view->form = $form;
 }

我想这并没有完全回答原来的问题,因为验证仍在进行中,我只是检查这个“特殊情况”,其中点击了“返回”图像,但我会将其标记为已回答反正。

答案 2 :(得分:0)

Tim Fountain在我的一些相关问题中建议采用更清洁的方法: Zend forms: How to surround an image-element with a hyperlink?