1

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

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

    $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;
}
4

3 回答 3

0

现在有一些东西可以使用:

isValid() 循环不正确,您的表单永远不会针对您提供的元素评估为 inValid,您将永远不会到达 else。

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 中使用提交按钮完成了此类事情,也许我所做的流程会有所帮助:

注意:要使这种类型的流程起作用,您必须给按钮元素一个标签。标签用作提交值

//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;
}

我认为,说到底,问题的症结在于你没有给按钮元素一个标签。

于 2013-04-17T07:48:55.193 回答
0

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

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

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

这也不起作用。

我终于能够通过Zend 表单中回答的以下方法检查单击了哪个图像:图像作为提交按钮

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;
 }

我想这并没有彻底回答原始问题,因为验证仍在完成,我只检查单击“返回”图像的这种“特殊情况”,但无论如何我都会将其标记为已回答。

于 2013-04-18T07:57:49.920 回答
0

Tim Fountain 在我的一些相关问题中提出了一种更简洁的方法: Zend forms: How to around an image-element with a hyperlink?

于 2013-04-18T08:12:03.713 回答