Yii и Joomla 1.5
Иногда бывает необходимо добавить новый функционал на сайт. А сайты как известно могут быть собраны на разных движках: Joomla, Drupal, MODX и прочие. Попался мне тут один сайт на Joomla, ещё и версии 1.5. Нужно было прикрутить комментарии к товарам. Писать с нуля не захотелось и было решено воспользоваться моим любимым PHP-фреймворком Yii. Для начала подключаем наше приложение.
$yii = dirname(__FILE__).'/../_distr/yii-1.1.13.e9e4a0/framework/yii.php'; $config = dirname(__FILE__).'/protected/config/main.php'; require_once($yii); Yii::createWebApplication($config);
Подключение очень похоже на подключение обычного приложения, за исключением метода run(), после создания экземпляра приложения. Такой способ подключения описан в рецептах на сайте Yii.Yii подключили, создали модельку комментариев. И теперь надо вывести их, например, виджетом CListView. В обычном приложении для вызова виджета мы обычно используем такой код:
$this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', ));
Но тут $this у нас ссылается на контроллер, в контексте которого будет вызван виджет. А у нас то никакой контроллер не вызывается, мы просто создали приложение и хотим использовать его возможности. Вот тут то и начинаются трудности. Хотя сами разработчики говорят нам, что мы можем смело использовать кучу функционала при таком подключении.Попробуем разобраться. Идем в метод widget базового контроллера CBaseController и видим, что он свою очередь передает эстафету методу createWidget, который вызывает виджет так:
$widget=Yii::app()->getWidgetFactory()->createWidget($this,$className,$properties); $widget->init();
Как видно из метода createWidget, что первым параметром передается $this. Идем дальше. Смотрим код класса CWidget и видим, что он наследуется от базого контроллера CBaseController. Следовательно без контроллера нам виджет никак не запустить.Создаем экземпляр контроллера вручную при помощи метода createController и присваиваем его какой нибудь переменной.Пробуем вызвать наш виджет и вуаля, работает!
$ctl = array_shift(Yii::app()->createController("/")); $ctl->widget('zii.widgets.CListView', array( 'dataProvider'=>new CActiveDataProvider('Comment'), 'itemView'=>'_view', ));
Так как метод createController возвращает 2 элемента массива(экземпляр объекта и параметры урла), то пришлось воспользоваться функцией array_shift, чтобы получить первый элемент массива, т.е. ссылку на наш контроллер.
7 комментариев
Очень полезная статья по интеграции Joomla и Yii. Но для начинающего не так все очевидно. Можно ли подробнее, а если можно то и с простым примером.
Roman, к сожалению или к счастью, этот способ я использовал очень давно.
Более того, сайт работающий в этой связке уже переехал на Битрикс. Так что даже примеров показать не смогу.
Помню только, что по этой схеме были реализованы комментарии к товарам :-)
Спасибо за ответ, учитывая давность статьи, не надеялся, что Вы сюда заглядываете. Жаль что так (с примерами). А я пытаюсь делать на Yii, но не имея опыта хочу пока часть функционала использовать от Joomla.
Понравилась статья, спс! То есть, по сути, можно брать фреймворк Yii (может быть еще и какой нибудь другой) и интегрировать таким вот образом с любым движком? Любую функциональность, привносить в него, минуя его api, как бы
Да, Рома, всё так. Но я бы всё-таки советовал выучить API движка и писать на нём, чтобы точно играть по его правилам.
Пришло письмо что есть новый комментарий, а тут давно ничего не было. Вообще есть мысль саму Джумлу переделать на Yii. Чтобы использовать все наработки для нее. Ибо нормальных и популярных CMS на Yii так и не появилось.
Рома, есть же движки на фреймворках, и, Yii не исключение.
Юпи! - уже взрослый двиг.