2017-05-03 15 views
11

私はYii1で開発された古いアプリをYii2に移行しています。 、Yii1:Controller :: beforeRender in Yii2

public $jsVars; 
public function toJSObject($params){ 
    $this->jsVars = array_merge($this->jsVars, $params); 
} 

private function printJSVarsObject(){ 
    //convert my php array into a js json object 
} 

私はJavaScriptで公開される変数を必要とする場合:

は、私はJavaScriptのようなフロントエンドに送信する必要があるすべての変数を格納したコントローラ内の配列を持っていました私はViewまたはControllerで$ this-> toJSObjectを使用します。

はその後、私も持っているために使用されるコントローラに:Yii2で

public function beforeRender($view){ 
    $this->printJSVarsObject(); 
} 

、私はカスタムビューとビューコンポーネントを設定し、イベントを添付しなければならなかった:

namespace app\classes; 

use yii\base\Event; 
use yii\helpers\Json; 

Event::on(\yii\web\View::className(), \yii\web\View::EVENT_END_BODY, function($event) { 
    $event->sender->registerJSVars(); 
}); 

class View extends \yii\web\View { 
    public $jsVars = []; 

    public function addJsParam($param){ 
     $this->jsVars = array_merge($this->jsVars, $param); 
    } 

    public function registerJSVars() { 
     $this->registerJs(
      "var AppOptions= " . Json::htmlEncode($this->jsVars) . ";", 
      View::POS_END, 
      'acn_options' 
     ); 
    } 
} 

しかし、 、クラス外のイベントを持っていることは私にとっては奇妙なようです。また、私がコントローラにいる間、私は以前の方法をこの方法で使用することはできません。

明らかに、私は何かが不足している、または私のアプローチは間違っています。

あなたはどうしていますか?

+0

を使用することになり、あなたのbeforeRender()メソッドにアクセスするには、より複雑なコードを残しておきたい場合は、 '\ Yii :: $ app-> view-> on(View :: EVENT_END_BODY、function(){ エコー日付( 'Ym-d'); } DRYはコントローラーの振る舞いとしてアタッチしてください –

+0

または、単にコントローラーのプロパティーにアクセスしようとしている場合は、コントローラーにアクセスするために '$ this-> context'を使うことができます –

+0

はい、そうです私は時々やっている、私はちょうど "完璧な"アプローチを探していた。私はそれを受け入れることができるので、$ this->文脈の答えで再度答えてください;)あなたの時間のおかげで、 – Chux

答えて

3

ビューからコントローラのプロパティにアクセスしようとしている場合(上記のコメントを参照してください)、

$this->context 

ビューファイル内から現在使用されているコントローラのインスタンスを返す。だから、あなただけのあなただけのたびに、あなたのコントローラでそれを必要とすることをオーバーライドすることができますので、 `beforeRender()`メソッドは、例えば、Yii2のビューに移動しました

$this->context->beforeRender() 
+0

ありがとう、もう一度! – Chux

関連する問題