Мне удалось сделать пару «хаков», поэтому проблема решена на данный момент.
Не думайте, что это самый подходящий способ сделать это, но он может пригодиться другим пользователям, у которых возникла моя проблема:
Во-первых, в моем UsersController я написал этот фрагмент, поэтому, если поле пароля оставлено пользователем пустым, перед проверкой установите значение ''
:
if($this->data['User']['password'] == $this->Auth->password('')){
$this->data['User']['password'] = '';
}
$this->User->set($this->data);
if($this->User->validates()){ //post validation login }
Вторая проблема заключалась в проверке электронной почты. Как ни странно, я исправил эту проблему, изменив порядок правил в многовариантном поведении . Итак, от:
"email" => array(
"emailFieldNotEmpty" => array(
"rule" => "notEmpty",
"message" => "You did not enter the e-mail!"
),
"emailValid" => array(
"rule" => "email",
"message" => "The e-mail you entered is not valid!"
),
"emailExistsInDatabase" => array(
"rule" => array("__existingRecord", false),
"message" => "The e-mail you entered has been already registered in our database!"
)
)
Теперь у меня есть:
"email" => array(
"emailExistsInDatabase" => array(
"rule" => array("__existingRecord", false),
"message" => "The e-mail you entered has been already registered in our database!"
),
"emailValid" => array(
"rule" => "email",
"message" => "The e-mail you entered is not valid!"
),
"emailFieldNotEmpty" => array(
"rule" => "notEmpty",
"message" => "You did not enter the e-mail!"
)
)
Я не знаю, было ли это предназначено или нет, но похоже, что последнее правило, которое не выполняется, это то, которое отображается. По моей логике, правила были бы расположены в порядке их появления, поэтому, если первое не применяется, прекратите проверку и отобразите его.
Я повторяю, я не знаю, является ли это правильным подходом, но, похоже, я решил эти проблемы.
Если у вас есть что добавить, сделайте это!
EDIT
Нашел «официальное» объяснение в Cake 1.3 Book. Там написано:
By default CakePHP tries to validate a field using all the validation rules declared for it and returns the error message for the last failing rule. But if the key last is set to true for a rule and it fails, then the error message for that rule is returned and further rules are not validated. So if you prefer to show the error message for the first failing rule then set 'last' => true for each rule.
Итак, еще один подход к моей проблеме - установить правила проверки в порядке их появления и добавить ключ last
в массив правил.