Есть приложение и модуль в нем, требуется на одной из страниц приложения сделать renderPartial view-шаблона модуля. Как правильно указать путь к представлению модуля?
Есть приложение и модуль в нем, требуется на одной из страниц приложения сделать renderPartial view-шаблона модуля. Как правильно указать путь к представлению модуля?
возможно это стоит сделать через виджет, а потом как-то так в контроле
$content = $this->widget('RatingWidget', array('data' => Video::model()->findByPk($_GET['id']) ) );
мне кажется попытка отрендерить не свой вью не очень кашерна.
хотя если такое возможно, будет интересно знать как это сделать.
Передать в качестве первого аргумента полный путь к view-файлу: application.modules.moduleId.views.viewId
спасибо, будем знать )
Вообще правильнее сделать так “moduleId.views.viewId” т.к. модули могут находиться не обязательно в папке modules, ну и короче так писать
Спасибо, работает, но если представление содержит код "$posts = Forum::model()->lastPosts(25);", где Forum - модель модуля, то при вызове представления модуля из приложения получаем include(Forum.php) failed to open stream: No such file or directory. Можно ли что-то сделать, кроме как убрать обращение к БД из представления? Или в данном случае копать в сторону виджетов?
Если у вас есть элемент интерфейса, обращающийся к БД, то нужно оформить его в виде виджета.
В components создайте файл LastPosts.php:
class LastPosts extends CWidget
{
public function run()
{
Yii::import('application.modules.Forum.models.Forum', true);
$this->render('lastPosts', array(
'models'=>Forum::model()->lastPosts(25),
));
}
}
Представление lastPosts.php лежит в components/views.
Останется только где угодно в layout или view сделать $this->widget(‘path.to.LastPosts’);
Вообще логика должна содержаться в контроллере, а в представлении чисто отображение уже загруженных в контроллере данных - это основа MVC.
Что бы модель была доступна во всех модулях, ее нужно разместить в application.models
andy_s, огромное спасибо за подробные пояснения, виджет отлично работает.
Верно, но можно и поступить не очень красиво:
в конфиге приложения указать папку моделей модуля, т.е. в "import" добавить "yourModuleId.models.*"