5

別のビューに配置された iframe からのみ実行されるさまざまなコントローラー アクションからのビューがあります。

現在、iframe が読み込まれ、ログイン ページに移動してログインすると、ログイン コントローラー (yii2 ユーザー モジュールを使用) が呼び出さ$this->goBack()れ、iframe ソース URL にリダイレクトされます (最後にアクセスしたページであるため)。 iframe を含む元のページ。

$this->goBack()基本的には、特定のコントローラーのアクションが呼び出されたときのリターン URL として設定されることを除外したいと考えています。iframe にロードされたすべてのアクションが から自動的に除外される場合のボーナス ポイント$this->goBack()

4

1 に答える 1

1

よし、これでやってみよう!このコードは完全にテストされていません! あなたの問題は、あなたがそれを与えない限り、アクションが 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 つのタイプの要求の違いを認識できるようにメソッドを再構成する方法です。getgoBack()

最初の問題は、コントローラーと必要なビューの間に別のビューレイヤーを追加することで比較的簡単に解決できます。これを と呼びます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の 、responseUrl: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'
    ]
]

これが機能するかどうか知りたいです。興味深い挑戦でした。

于 2015-12-23T13:00:09.550 に答える