Yii2:从“$this->goBack()”中排除特定的控制器操作
Yii2: exclude specific controller actions from '$this->goBack()'
我有来自各种控制器操作的视图,这些视图完全是 运行 来自放置在另一个视图中的 iframe。
目前,当 iframe 加载时,我转到登录页面登录,成功后登录控制器(使用 yii2 用户模块)调用 $this->goBack()
,将我重定向到 iframe 源 URL(因为它是最后访问的页面),而不是包含 iframe 的原始页面。
基本上,我想在调用 $this->goBack()
时排除特定的控制器操作被设置为 return URL。如果 iframe 中加载的所有操作都自动从 $this->goBack()
.
中排除,则可获得加分
好的,我会试试看的!此代码完全未经测试!您的问题是该操作无法知道它是否是从 iframe 调用的,除非您给它一个。因此,我尝试回答的基础是 iframe 的所有 urls 都应该有一个额外的 get 参数。让我们称之为 caller
。所以每个 iframe 应该看起来像
<iframe url="index.php?r=controller/action&caller=this-controller/action</iframe>
现在您可以随时测试请求 url 以查看它是否是从 iframe 调用的。此外,iframe 中的每个 link 都应该将此参数添加到它的 url.
所以,现在我们至少有两个问题。首先,如何自动添加 caller
作为 get
参数,而不必重新编写每个 url,其次,如何重新配置 goBack()
方法,使其知道两种请求的区别。
第一个问题可以通过在控制器和你想要的视图之间添加另一个视图层来相对容易地解决,我称之为 iframe
。所以在你的控制器动作中,添加这个;
$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 视图文件应包含如下内容;
<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
完成生成 urls.
的方法
因此,创建一个新的 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 中的每个 link 也会附加 caller
作为参数,只要你使用过Url::to()
(或该方法的变体)或 Yii::$app->UrlManager
生成您的 links。
现在我们需要做的就是自定义控制器的 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'
]
]
我很想知道这是否有效,这是一个有趣的挑战!
我有来自各种控制器操作的视图,这些视图完全是 运行 来自放置在另一个视图中的 iframe。
目前,当 iframe 加载时,我转到登录页面登录,成功后登录控制器(使用 yii2 用户模块)调用 $this->goBack()
,将我重定向到 iframe 源 URL(因为它是最后访问的页面),而不是包含 iframe 的原始页面。
基本上,我想在调用 $this->goBack()
时排除特定的控制器操作被设置为 return URL。如果 iframe 中加载的所有操作都自动从 $this->goBack()
.
好的,我会试试看的!此代码完全未经测试!您的问题是该操作无法知道它是否是从 iframe 调用的,除非您给它一个。因此,我尝试回答的基础是 iframe 的所有 urls 都应该有一个额外的 get 参数。让我们称之为 caller
。所以每个 iframe 应该看起来像
<iframe url="index.php?r=controller/action&caller=this-controller/action</iframe>
现在您可以随时测试请求 url 以查看它是否是从 iframe 调用的。此外,iframe 中的每个 link 都应该将此参数添加到它的 url.
所以,现在我们至少有两个问题。首先,如何自动添加 caller
作为 get
参数,而不必重新编写每个 url,其次,如何重新配置 goBack()
方法,使其知道两种请求的区别。
第一个问题可以通过在控制器和你想要的视图之间添加另一个视图层来相对容易地解决,我称之为 iframe
。所以在你的控制器动作中,添加这个;
$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 视图文件应包含如下内容;
<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
完成生成 urls.
因此,创建一个新的 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 中的每个 link 也会附加 caller
作为参数,只要你使用过Url::to()
(或该方法的变体)或 Yii::$app->UrlManager
生成您的 links。
现在我们需要做的就是自定义控制器的 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'
]
]
我很想知道这是否有效,这是一个有趣的挑战!