viewRenderer

Возникла необходимость в изменении viewRenderer во время исполнения. Нормального способа я так понял не существует, так как метода setViewRenderer() у класса CWebApplication не существует.

Я вероятно не понял Вашего вопроса, могли бы Вы сформулировать его иначе ?

что значит изменения, что Вы в эти слова вкладываете ?

Спасибо.

Задача дать простому пользователю не понимающему в программированнии возможность самому в визуальном редакторе создавать layouts и tamplates, прикручивать виджеты к параметрам контроллера… Это сделали, вся информация хранится в БД.

Теперь следующий этап, заставить это работать. Есть идея изменить viewRenderer компонент на свой собственный, (сейчас используется CViewRenderer, а мы хотим использовать собственный SuperPuperRenderer) и делать вывод через него. Нет не чего проще, просто, переопределяем в файле конфигурации. Но, возникла ситуация, когда вместо нашего SuperPuperRenderer, нужно воспользоваться стандартным, CViewRenderer, а для этого, компонент viewRenderer нужно переопределять динамически, уже во время выполнения, а не при инициализации CWebApplication.

Как это сделать красиво? :)

  1. Скопируйте yii.php(Yii bootstrap file) в каталог /protected. Внимательно прочитайте комментарии в этом файле, чтобы понять его назначение.

  2. Расширьте CWebApplication, реализовав там метод setViewRenderer(). Пусть скажем новый компонент будет назваться WebApplication.

  3. Модифицируйте класс Yii в файле /protected/yii.php таким образом, чтобы метод createWebApplication() вместо компонента CWebApplication использовал компонент WebApplication.

  4. Исправьте точку доступа таким образом, чтобы вместо /framework_path/yii.php подключался /protected/yii.php

О, спасибо. Это решение я и искал. Второй раз по документации надо пробежаться.

Roman Grudzinski

В принципе есть ещё один, менее радикальный вариант. В конфигурации приложения объявляем новый алиас для компонента:




'superRenderer'=>array(

    'class'=>'ext.CSuperRenderer',

    ...options...

),



Пользуемся так




Yii::app()->superRenderer->render(...);



Но всеже динамическая смена компонента(1-ый вариант) выглядит более логично.

Я тоже обдумывал такой способ, тоже хорош, но имеет слабости. Нельзя прозрачно сменить рендерер. Нужно дополнительно документировать, всем прочитать и всем об этом помнить.