У меня проблемы с отображением ошибок валидации формы с помощью пользовательского валидатора.Ошибки существуют, как показывает метод отладки, они просто не будут отображаться в форме.
Я хотел бы иметь возможность отображать сообщение об ошибке в поле (или выше, или в любом месте).
То, что я пробовал
Что ж, документация делает состояние:
При использовании View \ Helper \ FormHelper :: control (), ошибки отображаются по умолчанию, поэтому вам не нужно использовать isFieldError () или call error () вручную.
Тем не менее, я добавил следующее в форму (чуть ниже элемента управления электронной почтой)), который больше ничего не делал.Сообщения не отображаются.
if ($this->Form->isFieldError('email')) {
echo $this->Form->error('email', 'Yes, it fails!');
}
Я также нашел несколько вопросов и ответов об этой проблеме в SO, но они выглядят устаревшими (с '09 по '13) и, по-видимому, не соответствуют синтаксису CakePHP сегодня..
Что я сделал
Users / Forgot_password.ctp
<?= $this->Form->create() ?>
<?= $this->Form->control('email', ['type' => 'email']) ?>
<?= $this->Form->button(__('Reset my password')) ?>
<?= $this->Form->end() ?>
UsersController.php
(обратите внимание на конкретный набор проверки, как описано в документации )
public function forgotPassword()
{
if ($this->request->is('post')) {
$user = $this->Users->newEntity($this->request->getData(), ['validate' => 'email']);
if ($user->errors()) {
debug($user->errors()); // <- shows the validation error
$this->Flash->error(__('An error occurred.'));
} else {
// ... procedure to reset password (which works fine!) and redirect to login...
return $this->redirect(['action' => 'login']);
}
}
}
UsersTable.php
public function validationEmail(Validator $validator)
{
$validator
->email('email')
->notEmpty('email', __('An email address is required.'));
return $validator;
}
Что этовыглядит как
Обновление
Благодаря комментарию @ndm, это правильный способ отображения ошибки.
In UsersController.php :
public function forgotPassword()
{
// user context for the form
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity(§user, $this->request->getData(), ['validate' => 'email']); <- validation done on patchEntity
if ($user->errors()) {
$this->Flash->error(__('An error occurred.'));
} else {
// ... procedure to reset password and redirect to login...
return $this->redirect(['action' => 'login']);
}
}
// pass context to view
$this->set(compact('user'));
}
И в представлении ForgotPassword.ctp :
<?= $this->Form->create($user) ?>