在 CakePHP 3 中返回被调用页面

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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);
    

【讨论】:

以上是关于在 CakePHP 3 中返回被调用页面的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 获取动作名称

在AWS S3上存储CakePHP库以用于多个应用程序

CakePHP 3 - beforeSave 回调在编辑时不起作用

登录后如何返回 CakePHP 中的引用页面

Apple iphone导致按钮在网站上被压扁

jQuery ajax 调用无法从 CakePHP 3.8 读取 json 编码数据(获取一个空数组)