Поведения подключаются к модели с помощью переменной класса модели $actsAs:
<?phpclass Category extends AppModel { var
$name = 'Category'; var
$actsAs = array('Tree');}
?>
Этот пример показывает, как модель Category будет управлять структурой дерева, используя поведение TreeBehavior. После того, как поведение определено, вы можете использовать методы, добавленные поведением, также, как оригинальные методы модели:
<?// Установка ID$this->Category->id = 42;// Использование метода поведения children():$kids = $this->Category->children();?>
Некоторые поведения могут требовать или позволять делать установки, когда поведение подключается к модели. Здесь мы сообщаем поведению TreeBehavior имена полей left и right в таблице базы данных:
<?phpclass Category extends AppModel { var
$name = 'Category'; var
$actsAs = array('Tree' => array(
'left' => 'left_node',
'right' => 'right_node'
));}
?>
Мы также можем подключить несколько поведений к модели. Почему, например, наша модель Category должна вести себя только как дерево, она также может нуждаться в поддержке интернационализации:
<?phpclass Category extends AppModel { var
$name = 'Category'; var
$actsAs = array(
'Tree' => array(
'left' => 'left_node',
'right' => 'right_node'
),
'Translate'
);}
?>
Итак, мы добавляли поведения к моделям, используя переменную класса модели. Это означает, что наши поведения будут прикреплены к моделям на протяжении всего времени существования модели. Однако, нам может потребоваться «отсоединение» поведений от нашей модели в момент выполнения программы. Допустим, нам необходимо, чтобы наша предыдущая модель Category, которая действует как Tree и Translate, перестала действовать, как модель Translate:
<?// Отсоединение поведения от нашей модели:$this->Category->Behaviors->detach('Translate');?>
После этого действия наша модель Category перестанет вести себя как модель Translate. Вместо отключения поведения, возможно, нам нужно будет просто запретить поведению Translate действовать на обычные операции модели: find, save, и т.п. В действительности, мы заботимся о запрещении поведению действовать на колбэки модели. Вместо отключения поведения мы говорим нашей модели остановить информирование поведения Translate об этих колбэках:
<?// Запрещаем поведению управлять колбэками модели$this->Category->Behaviors->disable('Translate');?>
Мы также можем узнать управляет ли поведение колбэками модели. И если не управляет, то мы можем восстановить способность поведения действовать на них:
<?// Если наше поведение не управляет колбэками моделиif (!$this->Category->Behaviors->enabled('Translate')) {
// говорим ему начать управлять колбэками
$this->Category->Behaviors->enable('Translate');}
?>
Также, как мы можем полностью отключить поведение от модели в процессе выполнения программы, мы можем и подключить новые поведения. Допустим, что наша модель Category должна начать вести себя как модель Christmas, но только в Рождество:
<?// Если сегодня 25 декабряif (date('m/d') == '12/25') {
// Наша модель должна вести себя как модель Christmas
$this->Category->Behaviors->attach('Christmas');}
?>
Мы также можем использовать метод attach для перезаписи настроек поведения:
<?// Мы изменим одну установку по сравнению, с уже подключенным поведением$this->Category->Behaviors->attach('Tree', array('left' => 'new_left_node'));?>
Существует метод получения списка подключенных к модели поведений. Если мы передадим методу имя поведения, то он сообщит нам подключено ли это поведение к модели, иначе он вернет нам список всех подключенных поведений:
<?// Если поведение Translate не подключеноif (!$this->Category->Behaviors->attached('Translate')) {
// Получаем список всех поведений, подключенных к модели
$behaviors = $this->Category->Behaviors->attached();}
?>