Порядок использования расширений, как правило, включает три шага:
extensions/xyz
базовой директории приложения,
где xyz
- имя расширения;Каждое расширение уникально идентифицируется по имени. Если расширение
называется xyz
, то, используя псевдоним пути ext.xyz
, мы всегда можем
определить папку, в которой хранятся файлы данного расширения.
Примечание: Псевдоним
ext
доступен с версии 1.0.8. Ранее мы должны были использовать псевдонимapplication.extensions
для обращения к директории, содержащей все расширения. В дальнейшем, мы предполагаем, что определен псевдонимext
. Поэтому, если Вы используете версию 1.0.7 или ниже, Вы должны заменитьext
наapplication.extensions
.
Разные расширения предъявляют разные требования к импорту, настройке и порядку использования. Ниже, мы приведем несколько общих вариантов использования расширений согласно классификации, представленной в обзоре.
Для использования компонента приложения
в первую очередь необходимо изменить
конфигурацию приложения,
добавив новый элемент в свойство components
:
return array(
// 'preload'=>array('xyz',...),
'components'=>array(
'xyz'=>array(
'class'=>'ext.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// прочие настройки компонентов
),
);
Теперь можно обращаться к компоненту в любом месте приложения через
Yii::app()->xyz
. Компонент будет создан отложенно (т.е. в момент первого
обращения), если, конечно, мы не укажем его в свойстве preload
.
Поведение может быть использовано в любом компоненте. Делается это в два шага: присоединение к компоненту и вызов метода поведения из компонента. К примеру:
// $name соответствует уникальному поведению компонента
$component->attachBehavior($name,$behavior);
// test() является методом $behavior
$component->test();
Чаще всего поведение присоединяется к компоненту с использованием конфигурации, а
не вызовом метода attachBehavior
. К примеру, чтобы присоединить поведение к
компоненту приложения,
мы можем использовать следующую
конфигурацию:
return array(
'components'=>array(
'db'=>array(
'class'=>'CDbConnection',
'behaviors'=>array(
'xyz'=>array(
'class'=>'ext.xyz.XyzBehavior',
'property1'=>'value1',
'property2'=>'value2',
),
),
),
//....
),
);
Приведённый выше код присоединяет поведение xyz
к компоненту приложения db
.
Это возможно так как CApplicationComponent определяет свойство behaviors
.
При инициализации компонент присоединит перечисленные в нём поведения.
Для классов CController, CFormModel и CActiveModel, которые необходимо расширять,
присоединение поведений присходит при помощи переопределения метода behaviors()
.
К примеру:
public function behaviors()
{
return array(
'xyz'=>array(
'class'=>'ext.xyz.XyzBehavior',
'property1'=>'value1',
'property2'=>'value2',
),
);
}
Виджеты в основном используются в представлениях. Виджетом класса XyzClass
расширения xyz
, можно воспользоваться в представлении следующим образом:
// виджет без внутреннего содержимого $this->widget('ext.xyz.XyzClass', array( 'property1'=>'value1', 'property2'=>'value2')); // виджет, который может иметь внутреннее содержимое $this->beginWidget('ext.xyz.XyzClass', array( 'property1'=>'value1', 'property2'=>'value2')); ...содержимое виджета... $this->endWidget();
Действия используются в
контроллерах для обработки запросов
пользователя. Действие класса XyzClass
расширения xyz
можно использовать
путем переопределения метода CController::actions класса нашего контроллера:
class TestController extends CController
{
public function actions()
{
return array(
'xyz'=>array(
'class'=>'ext.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// прочие действия
);
}
}
Теперь к действию можно обратиться по маршруту
test/xyz
.
Фильтры также используются в
контроллерах. В основном они используются в
действиях для осуществления пред- и
пост-обработки пользовательского запроса. Фильтр класса XyzClass
расширения
xyz
можно использовать путем переопределения метода CController::filters
в нашем классе контроллера:
class TestController extends CController
{
public function filters()
{
return array(
array(
'ext.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// прочие фильтры
);
}
}
Выше мы можем использовать операторы '+' и '-' в первом элементе массива для применения фильтра только к определенным действия. Подробнее ознакомиться можно в документации к CController.
Контроллер предоставляет набор действий, которые могут быть запрошены пользователем. Для использования расширения контроллера необходимо настроить свойство CWebApplication::controllerMap в конфигурации приложения:
return array(
'controllerMap'=>array(
'xyz'=>array(
'class'=>'ext.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// прочие контроллеры
),
);
Теперь к действию a
контроллера можно обратиться через
маршрут xyz/a
.
Валидатор применяется в классе модели (наследующего
либо CFormModel или CActiveRecord). Класс валидатора XyzClass
расширения
xyz
используется путем переопределения метода CModel::rules в нашем классе
модели:
class MyModel extends CActiveRecord // or CFormModel
{
public function rules()
{
return array(
array(
'attr1, attr2',
'ext.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// прочие правила проверки
);
}
}
Расширение консольной команды, как правило,
используется для добавления новой команды в утилите yiic
. Консольную команду
XyzClass
расширения xyz
можно использовать, настроив конфигурацию
консольного приложения:
return array(
'commandMap'=>array(
'xyz'=>array(
'class'=>'ext.xyz.XyzClass',
'property1'=>'value1',
'property2'=>'value2',
),
// прочие команды
),
);
Теперь в утилите yiic
добавилась еще одна команда xyz
.
Примечание: Консольное приложение, как правило, использует иной файл конфигурации нежели веб-приложение. Если приложение было создано командой консоли
yiic webapp
, то конфигурационный файл для консолиprotected/yiic
находится вprotected/config/console.php
, а конфигурация веб-приложения - вprotected/config/main.php
.
Информация о порядке использования и создания модулей представлена в разделе Модуль.
Чтобы использовать компонент общего вида, нужно для начала включить его класс:
Yii::import('ext.xyz.XyzClass');
Теперь мы можем создавать экземпляр этого класса, настроить его свойства, вызывать его методы. Кроме того, можно его расширить для создания дочерних классов.
Signup or Login in order to comment.