Я переношу старое приложение, разработанное в Yii1 в Yii2.
Раньше у меня был массив в контроллере, в котором хранились все переменные, которые мне нужно было бы отправить во внешний интерфейс в качестве 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
}
Когда мне нужна переменная, которая должна отображаться в Javascript, я бы просто использовал $this- > toJSObject в представлении или в контроллере.
Затем в контроллере я также использовал:
public function beforeRender($view){
$this->printJSVarsObject();
}
В Yii2 мне пришлось настроить компонент View с пользовательским представлением, а затем прикрепить событие:
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'
);
}
}
Но, если событие вне класса кажется мне странным. Кроме того, пока я нахожусь в контроллере, я не смогу использовать мой прежний подход, используя этот метод.
Очевидно, что я что-то пропустил, или мой подход просто неверен.
Как вы это делаете?