На официальном форуме Yii Framework встретил вопрос об организации работы с сайдбарами на сайте. Вопрос возник в связи с требованиями автора выводить разное содержимое панелей в разных разделах сайта. Автор пробует выделить место для сайдбара в главном шаблоне views/layouts/main.php и генерировать содержимое сайдбаров в самих конкретных представлениях. Поделюсь своей организацией шаблонов.

Вариант автора мне показался избыточным необходимостью собирать сайдбар в каждом представлении.

По умолчанию в папке /views/layouts/ создаются шаблон main.php и подшаблоны column_1.php и column_2.php, наследуюемые от main.php. В главном шаблоне main.php мы оставим каркас.

Главный шаблон layouts/main.php:

<!doctype html>
<html>
<head>...<head>
<body>
    <header>...<header>
    <div id="container">
        <?php echo $content; ?>
    </div>
    <footer>...</footer>
</body>
</html>

Теперь просто соберём в отдельную папку /views/layouts/page/, раскопируем и переименуем невразумительные column_1.php и column_2.php во что-то вроде default.php, blog.php, shop.php, portfolio.php и т.д. Вот код нескольких из таких подшаблонов:

Шаблон layouts/page/default.php в две колонки:

<?php $this->beginContent('//layouts/main'); ?>
    <aside class='sidebar left_sidebar'>
        <?php $this->renderPartial('//layouts/sidebar/default'); ?>
    </aside>
    <section class='main right_main'>
        <?php echo $content; ?>
    </section>
<?php $this->endContent(); ?>

Шаблон layouts/page/blog.php в две колонки:

<?php $this->beginContent('//layouts/main'); ?>
    <aside class='sidebar left_sidebar'>
        <?php $this->renderPartial('//layouts/sidebar/blog'); ?>
    </aside>
    <section class='main center_main'>    
        <!-- В блоге перед постами можно поместить красивый слайдер -->    
        <?php $this->widget('application.widgets.BlogSliderWidget');?>    
        <?php echo $content; ?>
    </section>
<?php $this->endContent(); ?>

Шаблон layouts/page/fullpage.php на всю ширину:

<?php $this->beginContent('//layouts/main'); ?>
    <section class='main'>
        <?php echo $content; ?>
    </section>
<?php $this->endContent(); ?>

Код подшаблонов минимален, поэтому копипаст не страшен.

Как можно заметить, нужно добавить папку /views/layouts/sidebar/ и сделать внутри несколько файлов сайдбаров. Повторяющиеся виджеты можно либо вписать вручную в каждый файл, либо отнаследовать сайдбары друг от друга. Например, сайдбар для блога упрощённо выглядит так:

Сайдбар для блога layouts/sidebar/blog.php:

<?php $this->beginWidget('СPortlet', array('title'=>'Следите за мной'));?>
    <?php $this->widget('application.widgets.FollowWidget');?>
<?php $this->endWidget();?>
 
<?php $this->beginWidget('СPortlet', array('title'=>'Разделы блога'));?>
    <?php $this->widget('zii.widgets.CMenu', array('items'
        =>BlogCategory::model()->getMenuArray()));?>
<?php $this->endWidget();?>
 
<?php $this->beginWidget('СPortlet', array('title'=>'Метки'));?>
    <?php $this->widget('application.widgets.TagCloudWidget');?>
<?php $this->endWidget();?>
 
<?php $this->beginWidget('СPortlet');?>
    <?php $this->widget('application.widgets.CalendarWidget');?>
<?php $this->endWidget();?>
 
<?php $this->beginWidget('СPortlet', array('title'=>'Профиль'));?>
    <?php $this->widget('application.widgets.LoginFormWidget');?>
<?php $this->endWidget();?>

В итоге получаем коллекцию лёгких подшаблонов для разных разделов сайта и коллекцию сайдбаров со своими виджетами.

Шаблон по умолчанию указываем в базовом контроллере:

class Controller extends СController 
{
    // по умолчанию для всего сайта
    public $layout = '//layouts/page/default'; 
 
    // ...
}

Потом просто выставляем специфические шаблоны в нужных контроллерах или экшенах:

class BlogController extends Controller 
{
    // у раздела Блог шаблон другой, поэтому укажем его
    public $layout = '//layouts/page/blog';
 
    // экшен вывода поста
    public function actionView($id)
    {
        // пост мы выведем с немного другим шаблоном без фотогалереи, 
        // имеющим другой сайдбар с виджетом популярных постов
        $this->layout = '//layouts/page/blogpost';
 
        $post = $this->loadModel();
 
        // ...
    }    
}

Таким образом, процесс переключения сайдбаров мы повысили до процесса переключением шаблонов, что избавило нас от рутинной генерации сайдбара в контроллере или его представлении, а также дало дополнительную гибкость изменения шаблонов для различных разделов сайта. При необходимости для любого раздела достаточно сделать новый сайдбар и новый подшаблон, в котором через renderPartial этот сайдбар будет включён.

 

Взято отсюда

Комментарии

comments powered by Disqus