Widget + AJAX
Widget + AJAX
Есть виджет который должен обновлятся аяксом. Аякс запрос отправляю на контроллер из которого хотелось бы вернуть полностью отрисованный виджет, т.е. нужно каким-то образом отрендерить виджет (я не знаю как, в этом и вопрос). Мой вариант - сделать вьюшку аналогичную виджету и рендерить её, но не охота плодить кучу одинакового кода. Может есть какое-то более разумное решение?
Re: Widget + AJAX
У контроллера есть метод renderPartial. Он рендерит представление без подключения макетов. Ты можешь создать вьюшку в которой тупо напишешь
И подключать представление с пом. метода renderPartial.
Во вторых, я бы оформил этот виджет с пом. расширения, либо модуля, в котором и создал бы все необходимые контроллеры, вьюшки и пр., чтоб все было в одном месте.
Код: Выделить всё
$this->widget('myWidget',array(...))
Во вторых, я бы оформил этот виджет с пом. расширения, либо модуля, в котором и создал бы все необходимые контроллеры, вьюшки и пр., чтоб все было в одном месте.
Re: Widget + AJAX
Исчо одна мысль пришла: А зачем создавать вьюшку? Можно прям в контроллере написать
Код: Выделить всё
echo $this->widget('myWidget', array(...))
Re: Widget + AJAX
Насчет первой мысли, про renderPartial я в курсе, но хотелось бы что-то типа renderPartialWidget, чтоб вобще количество файлов/кода уменьшить до минимума. На счет модуля думал, но тут опять стоит вопрос копирования моделей и отображения модуля как часть страницы (я не знаю как отобразить модуль внутри страницы )mitaichik писал(а):Исчо одна мысль пришла: А зачем создавать вьюшку? Можно прям в контроллере написатьКод: Выделить всё
echo $this->widget('myWidget', array(...))
Насчет второй мысли. Это то что в данном случае подойдет, но если возникнет необходимость обновления нескольких блоков, то и этот способ увы не срабатает (так как на выходе имею хтмл, а хотелось бы джейсон)
Спасибо за советы!
Re: Widget + AJAX
И еще один вопрос в догонку. Как в виджете прочитать передваемые параметры?
Код: Выделить всё
echo $this->widget('myWidget', array('param_1' => 'value_1', 'param_2' => 'value_2'))
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Widget + AJAX
Документацию читать нужно
http://www.yiiframework.com/doc/api/1.1 ... get-detail
Чтобы прочитать передаваемые виджету параметры нужно в виджете объявить одноименные публичные свойства.
http://www.yiiframework.com/doc/api/1.1 ... get-detail
Чтобы прочитать передаваемые виджету параметры нужно в виджете объявить одноименные публичные свойства.
Re: Widget + AJAX
ВиноватSvyatov писал(а):Документацию читать нужно
http://www.yiiframework.com/doc/api/1.1 ... get-detail
Чтобы прочитать передаваемые виджету параметры нужно в виджете объявить одноименные публичные свойства.
Re: Widget + AJAX
Сейчас как раз занимаюсь такой фигней (Widget + AJAX). Встретил проблему: Если в представлении виджета писать
т.е. подключать скрипты, они нифига не подключаются (наверное потому-что у нас нет тега head). Сейчас будем как-то решать этот трабл...
Код: Выделить всё
Yii::app()->clientScript->registerScriptFile('/lib/tinymce/jquery.tinymce.js',CClientScript::POS_HEAD);
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Widget + AJAX
Это наверное потому, что это нужно не в представлении виджета писать, а в его методе registerClientScript()mitaichik писал(а):Сейчас как раз занимаюсь такой фигней (Widget + AJAX). Встретил проблему: Если в представлении виджета писатьт.е. подключать скрипты, они нифига не подключаются (наверное потому-что у нас нет тега head). Сейчас будем как-то решать этот трабл...Код: Выделить всё
Yii::app()->clientScript->registerScriptFile('/lib/tinymce/jquery.tinymce.js',CClientScript::POS_HEAD);
Пример: http://www.yiiframework.com/doc/api/1.1 ... ipt-detail
Re: Widget + AJAX
Не, с tinyMCE то это да, но вот как быть с CTabsView? И со всеми другими стандартными виджетами?
Re: Widget + AJAX
Короче все оказалась просто. И как всегда, помогло чтение API:
у метода renderPartial() есть параметр $processOutput, который по умолчанию равен false.
Этот параметр задает обрабатывать ли результат с помощью processOutput (который как раз и подключает скрипты). А так как он по умолчанию равен false, то скрипты не подключаются.
у метода renderPartial() есть параметр $processOutput, который по умолчанию равен false.
Код: Выделить всё
public string renderPartial(string $view, array $data=NULL, boolean $return=false, boolean $processOutput=false)
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Widget + AJAX
Решение с другой стороны совершенно.
Re: Widget + AJAX
Не понял что Вы этим хотели сказатьРешение с другой стороны совершенно.
Следующая проблема которую я встритл - это то, что подгружаемые AJAX'ом виджеты заново загружают jquery. Как отключть это - много раз обсуждалось, я сделал так:
Код: Выделить всё
Yii::app()->clientScript->scriptMap['jquery.js'] = false;
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Widget + AJAX
Я хотел сказать, что регистрировать скрипты для виджета нужно в методе registerClientScript() виджета, а не приплетать сюда renderPartial(), который к виджету вообще не относится.
Re: Widget + AJAX
Абсолютно согласен. Делать - так все по правильному. Но при выводе представления ( в котором содержиться виджет) с помощью renderPartial , Yii не подключает скрипты виджета, несмотря на то, что они подключеаются в registerClientScript(). Я так понял что это именно из-за processOutput, по крайней мере когда я установил его в true, все заработало.Я хотел сказать, что регистрировать скрипты для виджета нужно в методе registerClientScript() виджета, а не приплетать сюда renderPartial(), который к виджету вообще не относится.
- Svyatov
- Сообщения: 459
- Зарегистрирован: 2010.08.12, 14:50
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Widget + AJAX
Аааа, ну вот теперь понял, что виджет в представлении, которое рендерится через renderPartial() Тогда да, все верно.mitaichik писал(а):Абсолютно согласен. Делать - так все по правильному. Но при выводе представления ( в котором содержиться виджет) с помощью renderPartial , Yii не подключает скрипты виджета, несмотря на то, что они подключеаются в registerClientScript(). Я так понял что это именно из-за processOutput, по крайней мере когда я установил его в true, все заработало.Я хотел сказать, что регистрировать скрипты для виджета нужно в методе registerClientScript() виджета, а не приплетать сюда renderPartial(), который к виджету вообще не относится.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: Widget + AJAX
Может тогда лучше представление рендерить через renderPartial с параметром, а не виджет мучать?
Нравится Yii? Давайте сделаем его лучше!.
Re: Widget + AJAX
Тоже сталкивался с подобными проблемами - повторными подключениями скриптов, повторной их инициализацией ( в результате например некоторые события срабатывали по несколько раз ). Решениями, которые применялись, я особоно не доволен. Все больше смахивают на какие то костыли.
Считаю, что во фреймворке для создания Web 2.0 приложений, которые обычно насыщены аяксом, отслеживать какие скрипты загружены и т.п. задачи на стороне сервера не правильно. Все это должно обрабатываться на клиенте - в браузере. К сожалению в jQuery, к которому привязан Yii, не принято делать как например в dojo - dojo.require, dojo.provide.
Я конечно могу ошибаться, но по личному опыту напрашиваются такие выводы.
Считаю, что во фреймворке для создания Web 2.0 приложений, которые обычно насыщены аяксом, отслеживать какие скрипты загружены и т.п. задачи на стороне сервера не правильно. Все это должно обрабатываться на клиенте - в браузере. К сожалению в jQuery, к которому привязан Yii, не принято делать как например в dojo - dojo.require, dojo.provide.
Я конечно могу ошибаться, но по личному опыту напрашиваются такие выводы.