Estoy migrando una aplicación antigua desarrollada en Yii1 a Yii2.
Solía tener una matriz en el controlador que almacenaba todas las variables que necesitaría enviar a la interfaz como JavaScript:
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 }Cuando necesitaba exponer una variable en Javascript, simplemente usaba $this->toJSObject, en la Vista o en el Controlador.
Luego, en el controlador también solía tener:
public function beforeRender($view){ $this->printJSVarsObject(); }En Yii2, tuve que configurar el componente Vista con una Vista personalizada y luego adjuntar un evento:
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' ); } }Pero, tener el evento fuera de la clase me parece raro. Además, mientras esté en el controlador, no podré usar mi enfoque anterior con este método.
Obviamente, me estoy perdiendo algo, o mi enfoque es simplemente incorrecto.
¿Cómo hacen eso?
Si está intentando acceder a las propiedades del controlador desde una vista (¡vea los comentarios anteriores!), Puede usar;
$this->context para devolver una instancia del controlador utilizado actualmente desde el archivo de vista. Entonces, para acceder a su método beforeRender() , simplemente usaría
$this->context->beforeRender()