好的,我会去看看!此代码完全未经测试!你的问题是该动作无法知道它是否是从iframe调用的,除非你给它一个.因此,我尝试回答的基础是iframe的所有网址都应该有一个额外的get参数.让我们打电话给那个来电者.所以每个iframe应该看起来像
Url::to($this->context->route)]); ?>">
<?php $this->render($view); ?>//Pass additional parameters to the view if needed
现在我们有一种测试控制器/动作调用的方法,看看我是否被iframe请求.调用者参数很重要,因为它允许我们提取一个字符串以用作goBack()和其他方法的值.
接下来,我们需要扩展UrlManager,因为所有请求,响应,Url:to()和goBack()方法和类最终都使用UrlManager来完成生成URL的方法.
因此,创建一个新的UrlManager.我们将从现有的UrlManager中复制大部分代码,只是添加了我们自己的一些辛辣.我已将其存储在命令中,但将您放在您喜欢的位置并相应地更改命名空间.
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会生成一个调用者参数,iframe中的每个链接都会将调用者作为参数附加,因为你已经使用了Url :: to()(或该方法的变体)或Yii :: $app-> UrlManager生成您的链接.
现在我们需要做的就是自定义控制器的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'
]
]
我很想知道这是否有效,这是一个有趣的挑战!