Использование поведений
Поведения подключаются к модели с помощью переменной класса модели $actsAs:
<?php
class 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 в таблице базы данных:
<?php
class Category extends AppModel {
var $name = 'Category';
var $actsAs = array('Tree' => array(
'left' => 'left_node',
'right' => 'right_node'
));
}
?>
Мы также можем подключить несколько поведений к модели. Почему, например, наша модель Category должна вести себя только как дерево, она также может нуждаться в поддержке интернационализации:
<?php
class 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();
}
?>
<< Поведения |
Создание пользовательских поведений >>