Cakephp: отображение сообщения об ошибке в контроллере, когда метод модели beforeSave возвращает false?

У меня есть этот метод beforeSave в моей модели Student, который возвращает true или false. Вместо отображения стандартного сообщения для всех ошибок сохранения в StudentController (Ваше допущение не может быть сохранено. Пожалуйста, попробуйте еще раз.), Я хочу отобразить другое сообщение об ошибке, когда перед сохранением mtd модели Student возвращается значение false. Как я могу это сделать?

СтудентыКонтроллер

function add(){
if ($this->Student->saveAll($this->data)){
$this->Session->setFlash('Your child\'s admission has been received. We will send you an email shortly.');
 }else{
$this->Session->setFlash(__('Your admission could not be saved. Please, try again.', true));  
   }
}

person vaanipala    schedule 01.02.2012    source источник
comment
Почему ваш beforeSave возвращает false?   -  person deceze♦    schedule 01.02.2012
comment
beforeSave возвращает false, чтобы избежать вставки повторяющихся записей в таблицу БД.   -  person vaanipala    schedule 01.02.2012
comment
Затем вы сможете реализовать это как обычное правило проверки с автоматическими сообщениями об ошибках вместо действия beforeFilter. Это будет производить регулярные, красивые сообщения об ошибках.   -  person deceze♦    schedule 01.02.2012
comment
Хорошо, я проверю данные и дам вам знать.   -  person vaanipala    schedule 02.02.2012


Ответы (2)


Я предлагаю реализовать правила проверки, а затем вызвать:

if ($this->Model->validates() ) { 
  save 
} else { 
  error message / redirect 
}

Прочтите о проверке данных в CakePHP

person Barry Chapman    schedule 01.02.2012
comment
Хорошо, я прочитаю о проверке данных и вернусь к вам. Спасибо. - person vaanipala; 02.02.2012

Дизез и Чепмен были правы. Я нашел решение в главе о проверке данных в поваренной книге cakephp. Большое спасибо, ребята.

Я добавил следующее правило проверки:

для имени студента в модели студента:

var $validate=array(
        'name'=>array(
                'nameRule1'=>array(
                    'rule'=>array('minLength',3),
                    'required'=>true,
                    'allowEmpty'=>false,
                    'message'=>'Name is required!'
                    ),
                'nameRule2'=>array(
                       'rule'=>'isUnique',
                       'message'=>'Student name with the same parent name already exist!'
                     )
                ),

Затем в функции добавления StudentController:

//checking to see if parent already exist in merry_parents table when siblings or twin are admitted.
            $merry_parent_id=$this->Student->MerryParent->getMerryParentId($this->data['MerryParent']['email']);
            if (isset($merry_parent_id)){
                $this->data['Student']['merry_parent_id']=intval($merry_parent_id);
                var_dump($this->data['Student']['merry_parent_id']);
                if ($this->Student->save($this->data)){  
                //data is saved only to Students table and not merry_parents table.
                    $this->Session->setFlash(__('Your child\'s admission has been received. 
                                        We will send you an email shortly.',true));
                }else
                        $this->Session->setFlash(__('Your admission could not be saved. Please, try again.',true));
            }else{//New record. So, data is saved to Students table and merry_parents table.
                      if ($this->Student->saveAll($this->data)){ //save to students table and merry_parents table
                         $this->Session->setFlash(__('Your child\'s admission has been received. 
                                                          We will send you an email shortly.',true));
                      }else 
                          $this->Session->setFlash(__('Your admission could not be saved. Please, try again.', true));
                 }//new record end if

Мне не нужно было проверять данные без сохранения, как упоминал Чепмен. Итак, я не использовал:

if ($this->Model->validates() ) {         
  save         
} else {         
  error message / redirect         
}       
person vaanipala    schedule 02.02.2012