renderPartial, widgets, js код

Есть такая ситуация,

у меня есть виюха, в нутри которой подключается другая через renderPartial, первая рендерится через render.

во второй подключается виджет, он выдает js код, который успешно подключается в футер главного темплейта.

Но, далее, мне необходимо подтягивать второй темплейт через ajax, он отдается отдельным экшеном через renderPartial

И беда в том что при таком запросе, yii отсекает js код.

Вопрос, как можно получить этот хвост ?

Пока быстрее что в голову пришло это сделать для экшена $this->layout = ’ '; и обычный render()

Наверное нужно сделать renderPartial($view, $data, false, true) - последний параметр processOutput отвечает за вставку js кода.

Спасибо, попробую

У меня более интересный вопрос на эту тему:

Допустим кусок страницы обновляется аяксом. View для этого куска содержит такие интересные вещи как например Chtml::ajax(), которые регистрирует jQuery. Т.е. в независимости от того подключен ли уже на страницы jQuery или нет, при аякс-обновлении контента, загрузится еще один jQuery, а это (сами угадайте почему) не есть хорошо…

Ни каких Yii-style решений данной проблемы я не нашел, остается только отказываться от Chtml::ajax()в таких случаях…

Может ктото знает более изящные решения?

все верно, эта логика остается на ваше усмотрения.

Т.е. Вы хотите сказать, что нет в жизни справедливости, и я не смогу использовать все плюшки yii при работе с ajax’ом?! :blink:

хаха, все верно )

Никто не обещал что жизнь будет мягкой и пушистой )

А какие плюшки yii дает при работе с ajax’ом ?

Лично я не вижу ничего такого, он просто врапер на типичные вещи в js.

И я мало что позволяю yii делать с js, мне к примеру нравится самому в js колупаться

а CClientScript не поможет в вашем случае?

а вообще, какие AJAX-плюшки могут быть в фремвёрке?) Лично я решил не юзать все эти CActiveForm, CHtml, интегрённые виджеты и прочее. Код логики представления должен быть минимален на столько, на сколько это возможно, и все эти "удобства" только для программера, но когда работаете командой PHP кодер/HTML верстальщик/дизайнер, лепить элементы HTML страницы из обёрток-виджетов, имхо лишнее.

Реализую клиентскую часть (аякс, стили и прочее) отдельно от самой программной логики и не переживаю по поводу того, как например какой-то там CActiveDataProvider сдружить с CGridView… имхо Yii в этих вещах сильно переоценивает свою значимость

Мне то же нравится в js колупаться, но тривиальные вещи на мой взгляд приятнее делать с помощью хелпера Chtml.

И все же не впадайте в уныние, не будьте столь пессимистичны - добавьте строчку


Yii::app()->getClientScript()->coreScriptPosition=CClientScript::POS_READY;

в контроллере или представлении для выдачи аякс контента и наслаждайтесь жизнью!

А много ли "лишнего" кода генерирует CHtml? Все свойства отдельно взятого тега могут быть успешно изменены при вызове метода из CHtml. Чтобы изменить дизайн, в идеале вам нужно всего лишь определить каждому елементу свой класс или показать верстальщику как это сделать.

Я Вам точно так же обосную чем плох AR и все остальные фичи фреймворка и будем наслаждаться нейтив пхп))

p.s.: заценити прелести Adept Fraamework и каждая фича Yii для Вас станет простой понятной и очень ценной)

да, конечно… знаете, сколько времени я провёл убеждая всех, что W3C и стандарты, а в частности xslt - true? И вот теперь, начинать именно противоречить самому себе, что то, что придумано в очередном фреймвёрке, это повод начать учить ещё один шаблонизатор (так или иначе, эти врапперы - суть шаблонизация) и отходить от трансформаций, которые стандарт, и на которые предлагал всем переходить )

вот насчёт AR никакого негатива не испытываю, так как это слой доступа к данным, которой занимается программист, а вот из свёрстанной части шаблона, делать несколькостраничный конфиг, например, в случае использования форм-билдера, это, имхо через чур )

http://www.yiiframework.com/doc/api/1.1/CClientScript#reset-detail

Может быть вот это поможет, после вызова виджета вызывать reset. Главное проверить что бы он уже присутствовал на странице.

Цель любого фреймворка экономить время, использовать уже написанный и протестированный код.

Те же виджеты помогают со стандартными задачами, к примеру генерация crud, подумайте сколько вы тратите на это времени и делаете одно и тоже по нескольку раз.

Шаблонизатор не отменяет стандартов W3C.

использую только

Yii::app()->getClientScript()->[registerScriptFile|registerCssFile]

для индивидуального подключения скриптов и стилей во вьюшках

Yii::app()->clientScript->registerCoreScript(‘jquery’);

и в принципе все.

Тут два варианта:

  1. Блокировать повторяющиеся скрипты во время ajax запроса:



if (Yii::app()->request->isAjaxRequest) {

   Yii::app()->clientscript->scriptMap['jquery.js'] = false;

} 



  1. Загрузить все требующиеся скрипты заранее (например, в layout). И во время ajax-запросов блокировать все скрипты:



if (Yii::app()->request->isAjaxRequest) {

   Yii::app()->clientscript->scriptMap['*.js'] = false;

} 



Второй метод может показаться не оптимальным, однако на практике это может быть полезно, т.к. весь набор скриптов можно объединить и сжать.

seb, твой код во втором пункте надо класть в beforeAction? я как раз собираюсь использовать такой вариант. А инлайновые скрипты будут работать в этом случае? типа таких:




/*<![CDATA[*/

jQuery(function($) {

jQuery('#UserProfile_birth_date').datepicker(...);

});

/*]]>*/



Куда класть - неважно, лишь бы он выполнился до render’а, beforeAction() - вполне подходящий вариант.

Инлайновые скрипты естественно будут работать, даже те которые добавлены через Yii::app()->clientScript->registerScript(…).

Блокироваться будут только регистрации файлов скриптов через Yii::app()->clientScript->registerScriptFile(…).