よし、これでやってみよう!このコードは完全にテストされていません! あなたの問題は、あなたがそれを与えない限り、アクションが iframe から呼び出されたかどうかを知る方法がないことです。したがって、私の回答の試みの基本は、iframe のすべての URL に追加の get パラメータが必要であるということです。それを と呼びましょうcaller
。したがって、各 iframe は次のようになります。
<iframe url="index.php?r=controller/action&caller=this-controller/action</iframe>
これで、リクエスト URL をいつでもテストして、iframe から呼び出されたかどうかを確認できます。さらに、iframe 内のすべてのリンクの URL にこのパラメータを追加する必要があります。
したがって、少なくとも 2 つの問題があります。1 つ目は、すべての URL を書き直すことなくパラメーターcaller
として自動的に追加する 方法、2 つ目は、2 つのタイプの要求の違いを認識できるようにメソッドを再構成する方法です。get
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
、am 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
リンクを生成するために使用した場合。
あとは、コントローラーの goBack() メソッドをカスタマイズして、元のソース iframe に goBack() リクエストを送信するだけです。
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));
}
最後に、構成ファイルで新しい UrlManager を使用するように Yii を構成する必要があります。
'components' => [
'urlManager' => [
'class' => 'app/commands/CustomUrlManager'
]
]
これが機能するかどうか知りたいです。興味深い挑戦でした。