cbone
@cbone
Серверная инфраструктура

Как в Yii передать параметры в JS или записать кусок js-кода в свойство контроллера/компонента?

Всем привет. Ситуация следующая:
В Controller создал 2 array() параметра: $cssArr и $jsArr. В них из вида передаю используемые на этой странице стили и скрипты и потом в макете при помощи foreach($this->cssArr as style) подгружаются (стили в шапке лэйаута , а скрипты перед закрывающимся , чтобы ускорить время загрузки страницы). Но столкнулся с проблемой. Написал jQuery плагин, в который при инициализации необходимо передавать параметры:
1. unixtime начала текущего дня и
2. unixtime следующего дня.
Причём unixtime я спрашиваю у сервера, а не у клиента и уже потом передаю в JS. Но возникла сложность с инициализацией этого плагина. В лэйауте я не могу его инициализировать так как ещё не подключена библиотека jQuery (подключается в конце страницы).

Думаю можно завести новое свойство (public $jsCode) в Component и из нашего вида передать в него нужный JS код, а в макете вывести значение этого свойства уже после инициализации jQuery. Но не знаю как правильно записать этот код в переменную, чтобы не быдлокодить и не экранировать все кавычки моего JS? Возможно спасёт ob_stat, есть ли какие-то готовые решения в Yii? По документации порылся найти ничего не смог.
  • Вопрос задан
  • 4228 просмотров
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
Плохо искали, для этого используется CClientScript.
На самом деле ваша история с $cssArr и $jsArr это велосипед, потому что все необходимые для этого инструменты как раз CClientScript и предоставляет.

Например, для добавления в выходную страницу JS-файла используется
www.yiiframework.com/doc/api/1.1/CClientScript#reg...

Для добавления CSS-файла
www.yiiframework.com/doc/api/1.1/CClientScript#reg...

А для добавления "сырого" скрипта
www.yiiframework.com/doc/api/1.1/CClientScript#reg...

Во всех вышеперечисленных методах вы можете выбрать, куда именно Yii запихает эти файлы и скрипты. Конкретно для сырых скриптов есть CClientScript::POS_READY - т.е. переданный код будет находится в обертке JQuery ready и выполнится после иницализации jQuery
Ответ написан
Комментировать
nikel303
@nikel303
Я сделал таким образом:

В базовый класс контролера:
class Controller extends CController {
    public $jsParams = array();
    /* ... */


дальше, во въюшке или в экшене
добавляем элементы в этот массив, например:
public function actionIndex() {
  $oRequest = Yii::app()->getRequest();
  $this->jsParams['csrf'] = array($oRequest->csrfTokenName => $oRequest->getCsrfToken());
}


ну и дальше рендим этот массив в главном layout, например:
Yii::app()->clientScript->registerScript('js.params', 'var jsParams=' . CJSON::encode($this->jsParams).';', CClientScript::POS_HEAD);


в скриптах можно получить доступ так:
jsParams = jsParams || {};
console.log(jsParams);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 18:38
1500 руб./в час
19 апр. 2024, в 18:36
1500 руб./за проект
19 апр. 2024, в 18:36
30000 руб./за проект