在 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 中返回被调用页面的主要内容,如果未能解决你的问题,请参考以下文章