【问题标题】:Zend: Redirect from form without validationZend:从表单重定向而不验证
【发布时间】:2013-04-18 16:12:03
【问题描述】:

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

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

    $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”-image 或“btnSave”-image 调用的可能性,如果源是'btnBack'-图像。
我只是认为应该有一个更好的解决方案来直接从表单重定向并规避再次调用 /admin/creategroup

编辑2:
我的视图脚本:

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

【问题讨论】:

  • @RockyFord:对不起?您的评论似乎表明人们只看一眼这个问题,我的问题已经解决,事实并非如此。我仍在寻找解决方案。
  • 'btnback' 应该只重定向到一个 url,这可以使用锚点 &lt;a&gt; 来完成,或者它可以作为来自控制器的重定向来完成。我对 javascript 不太了解,所以我无法评估您当前的方法,但您可以尝试使用 url 助手代替 js &lt;?php echo $this-&gt;url(array('controller'=&gt;'admin', 'action'=&gt;'groupoverview'));
  • 如果您发布了一个视图脚本,可能还有一个合适的控制器会有所帮助。
  • 感谢您的回复。不幸的是,我不知道如何在表单中使用 url-helper - Zend 说“url”方法在表单 php 文件中不可用。我还按照您的建议从管理控制器添加了视图脚本和相应的方法。

标签: forms validation zend-framework redirect


【解决方案1】:

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

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

注意:要使这种类型的流程起作用,您必须给按钮元素一个标签。该标签用作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;
}

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

【讨论】:

    【解决方案2】:

    我尝试为我的图片添加标签,但没有成功。

    我还尝试在我的 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;
     }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多