Home PageКаталог Изменения НовыеКомментарии Пользователи Регистрация
CakePHP: Manual/Developing/Models/Callbacks ...

Колбэки


Если вы хотите выполнить какой-то код перед или после действия модели – используйте колбэки модели. Эти функции могут быть определены в классах моделей (включая класс AppModel ).



beforeFind


beforeFind(mixed $queryData)

Вызывается перед любым, относящимся к поиску, действием. Параметр $queryData содержит информацию о текущем запросе: условия, поля и прочее.


Если вы не хотите, чтобы операция поиска выполнилась (возможно из-за каких-то опций $queryData ), то возвращайте false. Иначе, возвращайте, возможно измененный, параметр $queryData, или что-либо другое, что вы хотите передать для поиска.


Вы можете использовать этот колбэк для ограничения действий, в зависимости от роли пользователя. Или сделать кэширование на основе текущей загрузки.



afterFind


afterFind(array $results, bool $primary)

Используйте этот колбэк для изменения результатов, которые вернула операция поиска; или для вставки любого другого кода, который нужно выполнить после поиска. Параметр $results содержит, данные возвращенные поисковым действием, например:


<?
$results 
= array(
  
=> 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));
}
?>



beforeValidate


beforeValidate()

Используйте этот колбэк для изменения данных перед их валидацией, или для модификации правил валидации, если это необходимо. Эта функция также должна вернуть true, или выполнение текущего save() будет прервано.



beforeSave


beforeSave()

В этой функции вы можете поместить любой код, который необходимо выполнить перед сохранением данных. Эта функция выполняется сразу же после того, как данные модели успешно прошли валидацию, но до того, как они были сохранены. Эта функция также должна вернуть 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, или сохранение не произойдет.



afterSave


afterSave(boolean $created)

Если у вас есть код, который необходимо выполнять после каждой операции сохранения, то разместите его в этом колбэке.
Значение $created будет true, если объект был создан (а не обновлен).



beforeDelete


beforeDelete()

Размещайте в этой функции любой код, который необходимо выполнить перед удалением. Эта функция должна вернуть true, чтобы удаление произошло и false в противном случае.



afterDelete


afterDelete()

Размещайте в этой функции любой код, который необходимо выполнять после каждого удаления.



onError


onError()

Вызывается, если возникают какие-либо проблемы.




<< Ассоциации: связывание моделей | Переменные модели



 
Комментарии
реально очень удобные действия
214.206.150.178.triolan.net (2012-01-22 17:03:56)
Добавить комментарий:

Файлы [Скрыть файлы/форму]