【问题标题】:Return to the called page in CakePHP 3在 CakePHP 3 中返回被调用页面
【发布时间】:2016-07-21 02:06:18
【问题描述】:

我有一个动作 /controller/edit,可以从多个位置(例如 /controller/index 和 /controller/view)单击它。

一旦用户完成编辑记录并点击保存,我希望他们返回到他们来自的地方(分别是 /controller/index 或 /controller/view)。

起初我尝试将用户访问的每个页面存储在他们的会话中(例如主页>索引>编辑),然后重定向到该列表中的倒数第二个条目 - 直到他们打开另一个条目为止都可以正常工作标签。如果在他们编辑记录时打开另一个选项卡并离开其他地方,他们的会话变量会继续构建(主页 > 索引 > 编辑 > 帮助 > 帮助页面),并且当需要重定向第二个到-last 条目不再包含正确的操作。

我的编辑操作 /controller/edit 如何在保存时将用户重定向回他们来自的引荐页面以到达那里,而与用户在其他选项卡中所做的任何事情无关?

编辑:保存后我不能使用referrer,因为过程是这样的:

  1. 用户在 /controller/index 或 /controller/view 上
  2. 用户点击进入 /controller/edit(引用者是 /controller/index 或 /controller/view)
  3. 用户对记录进行更改并点击保存,将哪个表单提交给/controller/edit(引用者为/controller/edit)
  4. 我现在想将它们重定向到 /controller/index 或 /controller/view,但它不再在引荐来源网址中

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    用于返回您来自的任何地方

    return $this->redirect($this->referer());
    

    【讨论】:

    • 在控制器中时,例如/controller/edit,然后单击保存按钮,表单将提交给自身。所以referrer是/controller/edit,页面简单刷新。
    • 是的,它会重定向到同一页面,此时您想重定向到另一个页面,您可以使用 "return $this->redirect(['controller'=>'controllerName','action' =>'actionName']);"
    • 问题在于我不知道控制器或动作名称应该是什么,因为用户可以从多个位置获得 /controller/edit 屏幕的第一个渲染
    【解决方案2】:

    我不得不处理同样的问题,我这样做了:

    1) 在我的控制器中,在 GET 部分中,将引用者设置为如下视图变量:

    $this->set('redirect', $this->referer());
    

    2) 在表单中,设置一个名为“redirect”的隐藏控件:

    echo $this->Form->hidden('redirect', ['value' => $redirect]);
    

    3)在控制器中,处理完POST请求后,重定向到隐藏输入的值:

    if (isset($this->request->data['redirect'])) {
        $this->redirect($this->request->data['redirect']);
    }
    

    当然,这可以被抽象成一个组件并可能使用会话,但这种方法对我有用。

    【讨论】:

    • 其实第1步是多余的:可以在第2步使用echo $this->Form->hidden('redirect', ['value' => $this->getRequest()->referer()]);
    【解决方案3】:

    您可以使用return $this->redirect($this->referer());重定向到引用页面

    根据Documentation,它会将您重定向到引荐页面。

    【讨论】:

    • 在控制器中时,例如/controller/edit,然后单击保存按钮,表单将提交给自身。所以referrer是/controller/edit,页面简单刷新。
    【解决方案4】:

    这是@DanielCoturel 答案的扩展。步骤 1. 在他的回答中是多余的(见我的评论)。我通过覆盖AppController.php 中的redirect() 函数来更全面地做到这一点(仍然必须向所有表单添加“重定向”输入):

    public function redirect($url, $status = 302)
        {
            if ($this->request->getData('redirect', '')) {
                return parent::redirect($this->request->getData('redirect'), $status);
            }
            return parent::redirect($url, $status);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 2012-12-19
      • 2010-09-07
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多