Как отобразить ошибки проверки в CakePHP 3.6? - PullRequest
0 голосов
/ 22 мая 2018

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

Я хотел бы иметь возможность отображать сообщение об ошибке в поле (или выше, или в любом месте).

То, что я пробовал

Что ж, документация делает состояние:

При использовании 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;
}

Что этовыглядит как

enter image description here

Обновление

Благодаря комментарию @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) ?>

1 Ответ

0 голосов
/ 23 мая 2018
//modify your function as below 
public function forgotPassword()
{
    if ($this->request->is('post')) {

    $user = $this->Users->newEntity($this->request->getData(), ['validate' => 'email']);
    if ($user->getErrors()) {
        debug($user->getError('email')); // <- shows the validation error
        $this->Flash->error(__($user->getError('email')['_empty']));
    } else {

      // ... procedure to reset password (which works fine!) and redirect to login...

      return $this->redirect(['action' => 'login']);
    }
  }
}
...