Если вы хотите выполнить какой-то код перед или после действия модели – используйте колбэки модели. Эти функции могут быть определены в классах моделей (включая класс AppModel ).
Вызывается перед любым, относящимся к поиску, действием. Параметр $queryData содержит информацию о текущем запросе: условия, поля и прочее.
Если вы не хотите, чтобы операция поиска выполнилась (возможно из-за каких-то опций $queryData ), то возвращайте false. Иначе, возвращайте, возможно измененный, параметр $queryData, или что-либо другое, что вы хотите передать для поиска.
Вы можете использовать этот колбэк для ограничения действий, в зависимости от роли пользователя. Или сделать кэширование на основе текущей загрузки.
Используйте этот колбэк для изменения результатов, которые вернула операция поиска; или для вставки любого другого кода, который нужно выполнить после поиска. Параметр $results содержит, данные возвращенные поисковым действием, например:
<?$results
= array(
0 => array(
'ModelName' => array(
'field1' => 'value1',
'field2' => 'value2', ),
),
);
?>
Возвращаемое значение для этого колбэка – возможно измененные, результаты операции поиска, запустившей этот колбэк.
Если $primary = false, то формат $results будет немного отличным, от ожидаемого; вместо обычного результата, который вы получаете после find операции, вы получите такой:
<?$results
= array(
'field_1' => 'value',
'field_2' => 'value2');?>
Если используете рекурсивный поиск и при этом $primary = true, то вы получите ошибку от PHP "Cannot use string offset as an array"
Ниже показано, как afterFind может быть использован для форматирования даты.
<?function afterFind($results) { foreach (
$results as $key => $val) { if (isset(
$val['Event']['begindate'])) {
$results[$key]['Event']['begindate'] = $this->dateFormatAfterFind($val['Event']['begindate']); }
}
return
$results;}
function
dateFormatAfterFind($dateString) { return
date('d-m-Y', strtotime($dateString));}
?>
Используйте этот колбэк для изменения данных перед их валидацией, или для модификации правил валидации, если это необходимо. Эта функция также должна вернуть true, или выполнение текущего save() будет прервано.
В этой функции вы можете поместить любой код, который необходимо выполнить перед сохранением данных. Эта функция выполняется сразу же после того, как данные модели успешно прошли валидацию, но до того, как они были сохранены. Эта функция также должна вернуть true, если вы хотите чтобы операция сохранения была выполнена.
Этот колбэк особенно удобен для кода, который должен быть выполнен перед сохранением данных. Например, ваше хранилище данных принимает даты только в определенном формате. Вы можете получить доступ к данным через $this->data и изменить их.
Ниже приведен пример, как beforeSave может быть применен для конвертации даты. Код в примере используется для приложения, где формат begindate в БД 'YYYY-MM-DD' и формат вывода 'DD-MM-YYYY'. Конечно, это легко может быть изменено. Используйте код, представленный ниже, в соответствующей модели.
<?function beforeSave() { if(!empty(
$this->data['Event']['begindate']) && !empty($this->data['Event']['enddate'])) {
$this->data['Event']['begindate'] = $this->dateFormatBeforeSave($this->data['Event']['begindate']);
$this->data['Event']['enddate'] = $this->dateFormat($this->data['Event']['enddate']); }
return
true;}
function
dateFormatBeforeSave($dateString) { return
date('Y-m-d', strtotime($dateString)); // Direction is from }?>
Убедитесь, что функция beforeSave() вернула true, или сохранение не произойдет.
Если у вас есть код, который необходимо выполнять после каждой операции сохранения, то разместите его в этом колбэке.
Значение $created будет true, если объект был создан (а не обновлен).
Размещайте в этой функции любой код, который необходимо выполнить перед удалением. Эта функция должна вернуть true, чтобы удаление произошло и false в противном случае.
Размещайте в этой функции любой код, который необходимо выполнять после каждого удаления.
Вызывается, если возникают какие-либо проблемы.
<< Ассоциации: связывание моделей | Переменные модели