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.
Чтобы активировать тему, задайте для свойства темы веб-приложения имя нужной темы. Это можно сделать либо в конфигурации приложения, либо во время выполнения в действиях контроллера.
Примечание. Название темы чувствительно к регистру. Если вы попытаетесь активировать тему, которая не существует, тема Yii :: app () -> вернет значение null.
Содержимое в каталоге темы должно быть организовано так же, как и в базовом пути приложения. Например, все файлы просмотра должны быть расположены под представлениями, файлами просмотра макетов под представлениями / макетами и файлами системного просмотра в представлении / системе. Например, если мы хотим заменить представление представления 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.
Начиная с версии 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, которые будут использоваться виджетами для замены его исходного вида, если текущая активная тема является базовой.
Примечание. Эта функция доступна с версии 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, ));
При использовании темы мы можем быстро изменить внешний вид представлений, мы можем использовать скины для систематической настройки внешнего вида виджетов, используемых в представлениях.
Кожа представляет собой массив пар имя-значение, который можно использовать для инициализации свойств виджета. Кожа принадлежит классу виджетов, а класс виджетов может иметь несколько скинов, идентифицируемых их именами. Например, у нас может быть скин для виджета 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 должен искать файл скина при создании виджета.
Кожа очень похожа на глобальную настройку виджета. Основные отличия заключаются в следующем.