Widget + AJAX

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
yii
Сообщения: 122
Зарегистрирован: 2010.04.29, 10:40

Widget + AJAX

Сообщение yii »

Есть виджет который должен обновлятся аяксом. Аякс запрос отправляю на контроллер из которого хотелось бы вернуть полностью отрисованный виджет, т.е. нужно каким-то образом отрендерить виджет (я не знаю как, в этом и вопрос). Мой вариант - сделать вьюшку аналогичную виджету и рендерить её, но не охота плодить кучу одинакового кода. Может есть какое-то более разумное решение?
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

У контроллера есть метод renderPartial. Он рендерит представление без подключения макетов. Ты можешь создать вьюшку в которой тупо напишешь

Код: Выделить всё

$this->widget('myWidget',array(...))
 
И подключать представление с пом. метода renderPartial.

Во вторых, я бы оформил этот виджет с пом. расширения, либо модуля, в котором и создал бы все необходимые контроллеры, вьюшки и пр., чтоб все было в одном месте.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

Исчо одна мысль пришла: А зачем создавать вьюшку? Можно прям в контроллере написать

Код: Выделить всё

 echo $this->widget('myWidget', array(...)) 
Аватара пользователя
yii
Сообщения: 122
Зарегистрирован: 2010.04.29, 10:40

Re: Widget + AJAX

Сообщение yii »

mitaichik писал(а):Исчо одна мысль пришла: А зачем создавать вьюшку? Можно прям в контроллере написать

Код: Выделить всё

 echo $this->widget('myWidget', array(...)) 
Насчет первой мысли, про renderPartial я в курсе, но хотелось бы что-то типа renderPartialWidget, чтоб вобще количество файлов/кода уменьшить до минимума. На счет модуля думал, но тут опять стоит вопрос копирования моделей и отображения модуля как часть страницы (я не знаю как отобразить модуль внутри страницы :oops: )
Насчет второй мысли. Это то что в данном случае подойдет, но если возникнет необходимость обновления нескольких блоков, то и этот способ увы не срабатает (так как на выходе имею хтмл, а хотелось бы джейсон) :(
Спасибо за советы!
Аватара пользователя
yii
Сообщения: 122
Зарегистрирован: 2010.04.29, 10:40

Re: Widget + AJAX

Сообщение yii »

И еще один вопрос в догонку. Как в виджете прочитать передваемые параметры?

Код: Выделить всё

echo $this->widget('myWidget', array('param_1' => 'value_1', 'param_2' => 'value_2')) 
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Widget + AJAX

Сообщение Svyatov »

Документацию читать нужно :)
http://www.yiiframework.com/doc/api/1.1 ... get-detail

Чтобы прочитать передаваемые виджету параметры нужно в виджете объявить одноименные публичные свойства.
Аватара пользователя
yii
Сообщения: 122
Зарегистрирован: 2010.04.29, 10:40

Re: Widget + AJAX

Сообщение yii »

Svyatov писал(а):Документацию читать нужно :)
http://www.yiiframework.com/doc/api/1.1 ... get-detail

Чтобы прочитать передаваемые виджету параметры нужно в виджете объявить одноименные публичные свойства.
Виноват :oops:
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

Сейчас как раз занимаюсь такой фигней (Widget + AJAX). Встретил проблему: Если в представлении виджета писать

Код: Выделить всё

Yii::app()->clientScript->registerScriptFile('/lib/tinymce/jquery.tinymce.js',CClientScript::POS_HEAD); 
т.е. подключать скрипты, они нифига не подключаются (наверное потому-что у нас нет тега head). Сейчас будем как-то решать этот трабл...
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Widget + AJAX

Сообщение Svyatov »

mitaichik писал(а):Сейчас как раз занимаюсь такой фигней (Widget + AJAX). Встретил проблему: Если в представлении виджета писать

Код: Выделить всё

Yii::app()->clientScript->registerScriptFile('/lib/tinymce/jquery.tinymce.js',CClientScript::POS_HEAD); 
т.е. подключать скрипты, они нифига не подключаются (наверное потому-что у нас нет тега head). Сейчас будем как-то решать этот трабл...
Это наверное потому, что это нужно не в представлении виджета писать, а в его методе registerClientScript() ;)

Пример: http://www.yiiframework.com/doc/api/1.1 ... ipt-detail
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

Не, с tinyMCE то это да, но вот как быть с CTabsView? И со всеми другими стандартными виджетами?
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

Короче все оказалась просто. И как всегда, помогло чтение API:

у метода renderPartial() есть параметр $processOutput, который по умолчанию равен false.

Код: Выделить всё

public string renderPartial(string $view, array $data=NULL, boolean $return=false, boolean $processOutput=false) 
Этот параметр задает обрабатывать ли результат с помощью processOutput (который как раз и подключает скрипты). А так как он по умолчанию равен false, то скрипты не подключаются.
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Widget + AJAX

Сообщение Svyatov »

Решение с другой стороны совершенно.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

Решение с другой стороны совершенно.
Не понял что Вы этим хотели сказать ;)

Следующая проблема которую я встритл - это то, что подгружаемые AJAX'ом виджеты заново загружают jquery. Как отключть это - много раз обсуждалось, я сделал так:

Код: Выделить всё

Yii::app()->clientScript->scriptMap['jquery.js'] = false;  
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Widget + AJAX

Сообщение Svyatov »

Я хотел сказать, что регистрировать скрипты для виджета нужно в методе registerClientScript() виджета, а не приплетать сюда renderPartial(), который к виджету вообще не относится.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Widget + AJAX

Сообщение mitaichik »

Я хотел сказать, что регистрировать скрипты для виджета нужно в методе registerClientScript() виджета, а не приплетать сюда renderPartial(), который к виджету вообще не относится.
Абсолютно согласен. Делать - так все по правильному. Но при выводе представления ( в котором содержиться виджет) с помощью renderPartial , Yii не подключает скрипты виджета, несмотря на то, что они подключеаются в registerClientScript(). Я так понял что это именно из-за processOutput, по крайней мере когда я установил его в true, все заработало.
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Widget + AJAX

Сообщение Svyatov »

mitaichik писал(а):
Я хотел сказать, что регистрировать скрипты для виджета нужно в методе registerClientScript() виджета, а не приплетать сюда renderPartial(), который к виджету вообще не относится.
Абсолютно согласен. Делать - так все по правильному. Но при выводе представления ( в котором содержиться виджет) с помощью renderPartial , Yii не подключает скрипты виджета, несмотря на то, что они подключеаются в registerClientScript(). Я так понял что это именно из-за processOutput, по крайней мере когда я установил его в true, все заработало.
Аааа, ну вот теперь понял, что виджет в представлении, которое рендерится через renderPartial() :) Тогда да, все верно.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Widget + AJAX

Сообщение samdark »

Может тогда лучше представление рендерить через renderPartial с параметром, а не виджет мучать?
Аватара пользователя
badenkov
Сообщения: 79
Зарегистрирован: 2009.06.22, 09:05
Откуда: Ижевск
Контактная информация:

Re: Widget + AJAX

Сообщение badenkov »

Тоже сталкивался с подобными проблемами - повторными подключениями скриптов, повторной их инициализацией ( в результате например некоторые события срабатывали по несколько раз ). Решениями, которые применялись, я особоно не доволен. Все больше смахивают на какие то костыли.
Считаю, что во фреймворке для создания Web 2.0 приложений, которые обычно насыщены аяксом, отслеживать какие скрипты загружены и т.п. задачи на стороне сервера не правильно. Все это должно обрабатываться на клиенте - в браузере. К сожалению в jQuery, к которому привязан Yii, не принято делать как например в dojo - dojo.require, dojo.provide.
Я конечно могу ошибаться, но по личному опыту напрашиваются такие выводы.
Ответить