gpt4 book ai didi

Yii2:从 '$this->goBack()' 排除特定的 Controller Action

转载 作者:行者123 更新时间:2023-12-04 21:37:30 25 4
gpt4 key购买 nike

我有来自各种 Controller 操作的 View ,这些操作只能从放置在另一个 View 中的 iframe 运行。

目前,当 iframe 加载时,我去登录页面登录,登录 Controller (使用 yii2 用户模块)成功调用 $this->goBack() ,将我重定向到 iframe 源 URL(因为它是访问的最后一页),而不是包含 iframe 的原始页面。

基本上,我想在 $this->goBack() 时排除特定的 Controller 操作被设置为返回 URL。叫做。如果 iframe 中加载的所有操作都自动从 $this->goBack() 中排除,则可加分.

最佳答案

好的,我会试试这个!此代码完全未经测试!您的问题是该操作无法知道它是否是从 iframe 调用的,除非您给它一个。因此,我尝试回答的基础是 iframe 的所有 url 都应该有一个额外的 get 参数。让我们称之为caller .所以每个 iframe 应该看起来像

<iframe url="index.php?r=controller/action&caller=this-controller/action</iframe>

现在您可以随时测试请求 url 以查看它是否是从 iframe 调用的。此外,iframe 中的每个链接都应在其 url 中添加此参数。

所以,现在我们至少有两个问题。一、如何自动添加 caller作为 get参数,无需重新编写每个url,其次,如何重新配置​​ goBack()方法,因此它知道两种类型的请求之间的区别。

第一个问题可以通过在 Controller 和你想要的 View 之间添加另一个 View 层来相对容易地解决,我称之为 iframe。 .所以在你的 Controller Action 中,添加这个;
$view = 'The name of the view you want to render';
$this->render('iframe', 'view' => $view);//Add in any other parameters you want to pass

您的 iframe View 文件应包含以下内容;
<iframe src="<?php Url::to(['however you generate the url for your iframe', 'caller' => Url::to($this->context->route)]); ?>">
<?php $this->render($view); ?>//Pass additional parameters to the view if needed
</iframe>

现在我们有一种方法可以测试 controller/action打电话来看看它是否是由 iframe 请求的。 caller参数很重要,因为它允许我们提取字符串以用作 goBack() 的值。和其他方法。

接下来,我们需要扩展 UrlManager , 和所有 request , response , Url:to()goBack()方法和类最终使用 UrlManager完成生成url的方法。

因此,创建一个新的 UrlManager。我们将从现有的 UrlManager 中复制大部分代码,只是添加一些我们自己的辣味。我的存储在 commands ,但将您的放在您喜欢的位置并相应地更改命名空间。
<?php

namespace app\commands;

use Yii;
use yii\web\UrlManager;

class CustomUrlManager extends UrlManager {

public function createUrl($params){
$request = Yii::$app()->request;
$caller = $request->get('caller');
if ($caller && !$params['caller']){
$params['caller'] = $caller;
}
return parent::createUrl($params);
}

}

所以现在,iframe 生成一个 caller参数,并且 iframe 中的每个链接也将有 caller附加为参数,只要您使用过 Url::to() (或该方法的变体)或 Yii::$app->UrlManager生成您的链接。

现在我们需要做的就是自定义 Controller 的 goBack() 方法,以将任何 goBack() 请求发送到原始源 iframe。
public function goBack($defaultUrl = null)
{
$caller = Yii::$app->request->get('caller');
if ($caller){
return Yii::$app->getResponse()->redirect($caller);
}
return Yii::$app->getResponse()->redirect(Yii::$app->getUser()->getReturnUrl($defaultUrl));
}

最后,您需要在配置文件中配置 Yii 以使用新的 UrlManager;
'components' => [
'urlManager' => [
'class' => 'app/commands/CustomUrlManager'
]
]

我很想知道这是否有效,这是一个有趣的挑战!

关于Yii2:从 '$this->goBack()' 排除特定的 Controller Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com