Узнайте (в контроллере), какое конкретное правило проверки не выполнено - PullRequest
6 голосов
/ 15 июля 2011

У меня есть форма регистрации пользователя с полем email, которое действует как имя пользователя и должно быть уникальным для всего приложения.

User модель имеет следующие правила проверки для этого поля:

var $validate = array(
    'email' => array(
        'email' => array('rule' => 'email', 'allowEmpty' => false, 'last' => true, 'message' => 'Valid email address required'),
        'unique' => array('rule'=> 'isUnique', 'message' => 'Already exists'),
    ),
);

В моем контроллере я хочу проверить, не было ли это правило 'unique', которое не удалось (для отображенияразличные элементы формы, такие как кнопка «Отправить письмо для восстановления пароля»).

Я могу проверить, было ли поле email действительным или нет (if (isset($this->User->validationErrors['email']))), но как проверить наличие ошибки конкретного правила?

Искать конкретное сообщение об ошибке, например if ($this->User->validationErrors['email'] == "Already exists"), кажется не совсем правильным (l10n и т. Д.) ...

Ответы [ 4 ]

6 голосов
/ 15 июля 2011

Прочитайте http://book.cakephp.org/2.0/en/models/data-validation/validating-data-from-the-controller.html

По сути, вам просто нужно использовать:

$errors = $this->ModelName->invalidFields();

, который даст вам массив всех ошибок проверки.


Обновление (пользовательские правила проверки):

Итак, мы хотим проверить, является ли это электронное письмо, и если оно уникальное - нам нужны следующие правила в модели:

CakePHP Validation: http://book.cakephp.org/2.0/en/models/data-validation.html

Перед каждым возвращением false нам нужно где-то установить, что это правило проверки не выполнено.Самый простой способ: мы можем нарушить соглашение MVC и использовать класс конфигурации (http://book.cakephp.org/view/924/The-Configuration-Class) и установить его там, и соответственно получить к нему доступ в контроллере.

Configure::write('UserValidationFail','email'); //for email before return false
Configure::write('UserValidationFail','isUnique'); //for unique before return false

И затем получить доступ к нему изконтроллер через:

Configure::read('UserValidationFail');

, который даст вам либо «электронная почта», либо «isUnique».

0 голосов
/ 16 июля 2011

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

Редактировать: это можно сделать так:

$this->User->validationErrors['email'] == $this->User->validate['email']['unique']['message']
0 голосов
/ 15 июля 2011

В нем есть теги Cakephp.Не проверяйте данные с контроллера, всегда старайтесь делать это в моделях и вместо этого передавайте их контроллерам и зрителям ...

0 голосов
/ 15 июля 2011

Вы не указали, какую платформу вы используете (не похоже на CodeIgniter).Однако, если $ this-> User-> validationErrors ['email'] возвращает простую текстовую строку, вы мало что можете с ней сделать.

Есть ли у объекта пользователя какие-либо другие свойства?Хорошей идеей было бы напечатать его, чтобы увидеть, что внутри.

...