АНГ | РУС

Совершенство достигнуто, не тогда, когда нечего добавить,
а когда нечего убрать.

Антуан де`Сент-Экзюпери

 

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

В Yii каждая тема представлена как каталог, состоящий из файлов вида, файлов макетов и соответствующих файлов ресурсов, таких как изображения, файлы CSS, файлы JavaScript и т. Д. Имя темы - это ее имя каталога. Все темы находятся в одном каталоге WebRoot / themes. В любой момент может быть активна только одна тема.

Tip: The default theme root directory WebRoot/themes can be configured to be a different one. Simply configure the basePath and the baseUrl properties of the themeManager application component to be the desired ones. 

1. Использование темы 

Чтобы активировать тему, задайте для свойства темы веб-приложения имя нужной темы. Это можно сделать либо в конфигурации приложения, либо во время выполнения в действиях контроллера.

Примечание. Название темы чувствительно к регистру. Если вы попытаетесь активировать тему, которая не существует, тема Yii :: app () -> вернет значение null.

2. Создание темы 

Содержимое в каталоге темы должно быть организовано так же, как и в базовом пути приложения. Например, все файлы просмотра должны быть расположены под представлениями, файлами просмотра макетов под представлениями / макетами и файлами системного просмотра в представлении / системе. Например, если мы хотим заменить представление представления PostController на представление в классической теме, мы должны сохранить новый файл в виде WebRoot / themes / classic / views / post / create.php.

Для представлений, принадлежащих контроллерам в модуле, соответствующие тематические файлы просмотра также должны быть помещены в каталог представлений. Например, если вышеупомянутый PostController находится в модуле с именем forum, мы должны сохранить файл представления create как WebRoot / themes / classic / views / forum / post / create.php. Если модуль форума вложен в другой модуль с именем поддержки, тогда файл представления должен быть WebRoot / themes / classic / views / support / forum / post / create.php.

Примечание. Поскольку каталог представлений может содержать данные, чувствительные к безопасности, он должен быть настроен таким образом, чтобы предотвратить доступ к веб-пользователям.

Когда мы вызываем render или renderPartial для отображения представления, соответствующий файл вида, а также файл макета будут искать в текущей активной теме. И если они будут найдены, эти файлы будут отображаться. В противном случае он возвращается к местоположению по умолчанию, указанному viewPath и layoutPath.

Совет. Внутри тематического представления нам часто нужно связать другие файлы ресурсов темы. Например, мы можем захотеть показать файл изображения в каталоге изображений темы. Используя свойство baseUrl текущей активной темы, мы можем создать URL-адрес для изображения следующим образом:

     Yii :: app () -> theme-> baseUrl. '/images/FileName.gif' 

 

Below is an example of directory organization for an application with two themes basic and fancy.

 

WebRoot/
    assets
    protected/
        .htaccess
        components/
        controllers/
        models/
        views/
            layouts/
                main.php
            site/
                index.php
    themes/
        basic/
            views/
                .htaccess
                layouts/
                    main.php
                site/
                    index.php
        fancy/
            views/
                .htaccess
                layouts/
                    main.php
                site/
                    index.php

В конфигурации приложения, если мы настроим

 

return array(
    'theme'=>'basic',
    ......
);

то основная тема будет действовать, а это означает, что макет приложения будет использовать один из них под темами каталога / основными / представлениями / макетами, а индексный указатель сайта будет использовать один из них под темами / базовыми / представлениями / сайтом. Если файл просмотра не найден в теме, он будет возвращаться к тому, что находится в каталоге protected / views.

3. Виджеты

Начиная с версии 1.1.5, виды, используемые виджетами, также могут быть тематическими. В частности, когда мы вызываем CWidget :: render () для визуализации виджета, Yii будет пытаться выполнить поиск в папке темы, а также в папке просмотра виджетов для нужного файла вида.

Для темы view xyz для виджета, чье имя класса Foo, мы должны сначала создать папку с именем Foo (то же самое, что и имя класса виджета) в папке просмотра текущей активной темы. Если класс виджетов находится в пространстве имен (доступно в PHP 5.3.0 или выше), например \ app \ widgets \ Foo, мы должны создать папку с именем app_widgets_Foo. То есть мы заменяем разделители пространств имен символами подчеркивания.

Затем мы создаем файл вида с именем xyz.php в новой папке. Для этого у нас должны быть файлы темы / basic / views / Foo / xyz.php, которые будут использоваться виджетами для замены его исходного вида, если текущая активная тема является базовой.

4. Настройка виджетов по всему миру

Примечание. Эта функция доступна с версии 1.1.3.

При использовании виджета, предоставляемого сторонним лицом или Yii, нам часто приходится настраивать его для определенных потребностей. Например, мы можем изменить значение CLinkPager :: maxButtonCount от 10 (по умолчанию) до 5. Мы можем выполнить это, передав начальные значения свойства при вызове CBaseController :: widget для создания виджета. Тем не менее, это становится хлопотно, если мы должны повторить ту же настройку в каждом месте, где мы используем CLinkPager.

 

$this->widget('CLinkPager', array(
    'pages'=>$pagination,
    'maxButtonCount'=>5,
    'cssFile'=>false,
));

Используя глобальную настройку виджета, нам нужно только указать эти начальные значения в одном месте, то есть в конфигурации приложения. Это упрощает управление виджетами.

Чтобы использовать глобальную настройку виджета, нам нужно настроить widgetFactory следующим образом:

 

return array(
    'components'=>array(
        'widgetFactory'=>array(
            'widgets'=>array(
                'CLinkPager'=>array(
                    'maxButtonCount'=>5,
                    'cssFile'=>false,
                ),
                'CJuiDatePicker'=>array(
                    'language'=>'ru',
                ),
            ),
        ),
    ),
);

В приведенном выше примере мы указываем настройку глобального виджета для виджетов CLinkPager и CJuiDatePicker, настраивая свойство CWidgetFactory :: widgets. Обратите внимание, что глобальная настройка для каждого виджета представляется в виде пары «ключ-значение» в массиве, где ключ относится к имени класса wiget, а значение определяет массив значений исходного свойства.

Теперь, всякий раз, когда мы создаем виджет CLinkPager в представлении, вышеуказанные значения свойств будут назначены виджету, и нам нужно только написать следующий код в представлении для создания виджета:

 

$this->widget('CLinkPager', array(
    'pages'=>$pagination,
));

При необходимости мы можем переопределить начальные значения свойств. Например, если в некоторой точке зрения мы хотим установить maxButtonCount равным 2, мы можем сделать следующее:

$this->widget('CLinkPager', array(
    'pages'=>$pagination,
    'maxButtonCount'=>2,
));

5. Skin

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

Кожа представляет собой массив пар имя-значение, который можно использовать для инициализации свойств виджета. Кожа принадлежит классу виджетов, а класс виджетов может иметь несколько скинов, идентифицируемых их именами. Например, у нас может быть скин для виджета CLinkPager, а скин называется классическим.

Чтобы использовать функцию скина, сначала необходимо изменить конфигурацию приложения, настроив свойство CWidgetFactory :: enableSkin как true для компонента приложения widgetFactory:

 

return array(
    'components'=>array(
        'widgetFactory'=>array(
            'enableSkin'=>true,
        ),
    ),
);

Обратите внимание, что в версиях до 1.1.3 вам необходимо использовать следующую конфигурацию, чтобы активировать скин:

 

return array(
    'components'=>array(
        'widgetFactory'=>array(
            'class'=>'CWidgetFactory',
        ),
    ),
);

Затем мы создаем необходимые скины. Скины, принадлежащие одному классу виджетов, хранятся в одном файле сценария PHP, чье имя является именем класса виджета. Все эти файлы скинов хранятся в защищенных / просмотрах / скинах по умолчанию. Если вы хотите изменить это как другой каталог, вы можете настроить свойство skinPath компонента widgetFactory. В качестве примера мы можем создать в protected / views / skins файл с именем CLinkPager.php, содержимое которого выглядит следующим образом:

array(
        'nextPageLabel'=>'next',
        'prevPageLabel'=>'prev',
    ),
    'classic'=>array(
        'header'=>'',
        'maxButtonCount'=>5,
    ),
);

В приведенном выше примере мы создаем две скины для виджета CLinkPager: по умолчанию и классические. Первый - это скин, который будет применен к любому виджету CLinkPager, который явно не укажет его свойство скина, в то время как последний - это скин, который будет применяться к виджету CLinkPager, чье свойство скина указано как классическое. Например, в следующем коде просмотра первый пейджер будет использовать скин по умолчанию, а второй - классический.

widget('CLinkPager'); ?>
 
widget('CLinkPager', array('skin'=>'classic')); ?>

If we create a widget with a set of initial property values, they will take precedence and be merged with any applicable skin. For example, the following view code will create a pager whose initial values will be array('header'=>'', 'maxButtonCount'=>6, 'cssFile'=>false), which is the result of merging the initial property values specified in the view and the classic skin.

widget('CLinkPager', array(
    'skin'=>'classic',
    'maxButtonCount'=>6,
    'cssFile'=>false,
)); ?>

Обратите внимание, что функция скинов НЕ требует использования тем. Однако, когда тема активна, Yii также будет искать скины в каталоге скинов каталога представления темы (например, WebRoot / themes / classic / views / skins). В случае, если скин с тем же именем существует как в тематических, так и в основных каталогах представлений приложений, скин темы будет иметь приоритет.

Если виджет использует скин, который не существует, Yii все равно будет создавать виджет как обычно без каких-либо ошибок.

Info: Использование скина может ухудшить производительность, потому что Yii должен искать файл скина при создании виджета.

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