Как использовать сообщения проверки модели CakePHP вместо сообщений setFlash контроллера? - PullRequest
3 голосов
/ 23 марта 2011

Описание

У меня есть простая форма на каждой странице моего сайта - один вход и кнопка отправки. Смысл в том, чтобы пользователь просто вводил свой адрес электронной почты и нажимал «отправить».

Это работает, если данные являются адресом электронной почты - но если это не правильный адрес электронной почты, он отправляет форму, страница перезагружается (или что-то еще), и вместо более конкретной модели появляется флэш-сообщение, а не действительный адрес электронной почты "ошибка.

Вопрос:

Итак, как мне использовать проверочное сообщение модели вместо общего сообщения контроллера?

Форма:

echo $this->Form->create('Email', array('class'=>'form1', 'url'=>'/emails/add', 'inputDefaults'=>array('label'=>false))); 
echo $this->Form->input('Email.email');
echo $this->Form->end('SIGN-UP');

Функция «добавления» контроллера электронной почты (или метод?):

function add() {
    if (!empty($this->data)) {
        $this->Email->create();
        if ($this->Email->save($this->data)) {
            $this->Session->setFlash(__('The email address has been saved', true));
            $this->redirect($this->referer());
        } else {
            $this->Session->setFlash(__('The email address could not be saved. Please, try again.', true));
            $this->set('error', 'custom error here');
            $this->redirect($this->referer());
        }
    }
}

И модель электронной почты:

class Email extends AppModel {
var $name = 'Email';

var $validate = array(
    'email'     => array(
        'is_valid'  => array( //named whatever we want
            'rule'      => 'notEmpty',
                'rule'      => array('email', true),
                'message'   => 'Please supply a valid email address.',
                'last'      => true //causes it to not check the next rule if this one fails
        ),
        'is_unique'     => array( //named whatever we want
            'rule'          => 'isUnique',
            'message'       => 'That email address is already in our database.'
        )
    ),
);
}

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Dave

CakePHP сделает это за вас, вы правильно установили валидацию, ошибка - НАПРАВЛЕНА, если сохранение не удалось.Это приводит к потере почтовых данных и, следовательно, сообщений проверки

Просто

if ($this->Email->save($this->data)) {
  $this->Session->setFlash(__('The email address has been saved', true));
  $this->redirect($this->referer());
} else {
   $this->Session->setFlash(__('There were problems saving, please see the messages below.', true));                    
}
2 голосов
/ 24 марта 2011

Обычно вы используете параметры ошибок $ form helper.См. раздел руководства по этому .

Однако, если вы хотите заполнить флэш-сообщение валидационным сообщением, вы можете использовать метод модели invalidFields().Вот пример:

if (!$this->User->save($this->data)) {
    $validationErrors = $this->User->invalidFields();
    $this->Session->setFlash($validationErrors['email']); // named key of the rule
    $this->redirect('/somewhere');
}

Для этого нужно получить сообщения, записанные в модели для правил проверки, которые не были выполнены.В то время как invalidFields() возвращает массив, вы можете манипулировать значениями в нем, чтобы получить лучшее сообщение об ошибке, например, объединяя различные сообщения об ошибках.

Кстати, я заметил что-то плохое в вашем коде выше.Вы называете свой класс модели как «Электронная почта», и есть основной класс CakePHP, уже названный «Электронная почта» (который является известным компонентом электронной почты), поэтому я предлагаю вам по-другому назвать весь MVC для этого.

...