Возникла необходимость в изменении viewRenderer во время исполнения. Нормального способа я так понял не существует, так как метода setViewRenderer() у класса CWebApplication не существует.
Возникла необходимость в изменении viewRenderer во время исполнения. Нормального способа я так понял не существует, так как метода setViewRenderer() у класса CWebApplication не существует.
Я вероятно не понял Вашего вопроса, могли бы Вы сформулировать его иначе ?
что значит изменения, что Вы в эти слова вкладываете ?
Спасибо.
Задача дать простому пользователю не понимающему в программированнии возможность самому в визуальном редакторе создавать layouts и tamplates, прикручивать виджеты к параметрам контроллера… Это сделали, вся информация хранится в БД.
Теперь следующий этап, заставить это работать. Есть идея изменить viewRenderer компонент на свой собственный, (сейчас используется CViewRenderer, а мы хотим использовать собственный SuperPuperRenderer) и делать вывод через него. Нет не чего проще, просто, переопределяем в файле конфигурации. Но, возникла ситуация, когда вместо нашего SuperPuperRenderer, нужно воспользоваться стандартным, CViewRenderer, а для этого, компонент viewRenderer нужно переопределять динамически, уже во время выполнения, а не при инициализации CWebApplication.
Как это сделать красиво?
Скопируйте yii.php(Yii bootstrap file) в каталог /protected. Внимательно прочитайте комментарии в этом файле, чтобы понять его назначение.
Расширьте CWebApplication, реализовав там метод setViewRenderer(). Пусть скажем новый компонент будет назваться WebApplication.
Модифицируйте класс Yii в файле /protected/yii.php таким образом, чтобы метод createWebApplication() вместо компонента CWebApplication использовал компонент WebApplication.
Исправьте точку доступа таким образом, чтобы вместо /framework_path/yii.php подключался /protected/yii.php
О, спасибо. Это решение я и искал. Второй раз по документации надо пробежаться.
Roman Grudzinski
В принципе есть ещё один, менее радикальный вариант. В конфигурации приложения объявляем новый алиас для компонента:
'superRenderer'=>array(
'class'=>'ext.CSuperRenderer',
...options...
),
Пользуемся так
Yii::app()->superRenderer->render(...);
Но всеже динамическая смена компонента(1-ый вариант) выглядит более логично.
Я тоже обдумывал такой способ, тоже хорош, но имеет слабости. Нельзя прозрачно сменить рендерер. Нужно дополнительно документировать, всем прочитать и всем об этом помнить.