Laminas / ZF3: вручную добавить ошибку в поле

#zend-framework #zend-framework3 #laminas

#zend-framework #zend-framework3 #laminas

Вопрос:

можно ли вручную добавить сообщение об ошибке в поле после проверки поля и фильтра ввода?

Мне это понадобится в случае, если имя пользователя и пароль неверны, чтобы пометить эти поля / отобразить сообщения об ошибках.

очевидно, что в ZF / ZF2 это было возможно с $form->getElement('password')->addErrorMessage('The Entered Password is not Correct'); помощью — но это больше не работает в ZF3 / Laminas

Комментарии:

1. я не понимаю, почему за нее проголосовали. это законный вопрос. Я полчаса гуглил и ничего не мог найти.

Ответ №1:

Не зная, как вы выполняете проверку (на самом деле существует несколько методов), самое простое решение — установить сообщение об ошибке при создании InputFilter (а не устанавливать его для элемента после его добавления в форму).

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

Здесь форма расширяется (с ее inputfilter), как показано в документации:

 use LaminasFormForm;
use LaminasFormElement;
use LaminasInputFilterInputFilterProviderInterface;
use LaminasValidatorNotEmpty;

class Password extends Form implements InputFilterProviderInterface {

    public function __construct($name = null, $options = []) {
        parent::__construct($name, $options);
    }

    public function init() {
        parent::init();

        $this->add([
            'name' => 'password',
            'type' => ElementPassword::class,
            'options' => [
                'label' => 'Password',
            ]
        ]);
    }

    public function getInputFilterSpecification() {
        $inputFilter[] = [
            'name' => 'password',
            'required' => true,
            'validators' => [
                [
                    'name' => NotEmpty::class,
                    'options' => [
                        // Here you define your custom messages
                        'messages' => [
                            // You must specify which validator error messageyou are overriding
                            NotEmpty::IS_EMPTY => 'Hey, you forgot to type your password!'
                        ]
                    ]
                ]
            ]
        ];
        return $inputFilter;
    }
}
 

Есть и другие способы создания формы, но решение то же самое.
Я также предлагаю вам взглянуть на документацию laminas-validator, вы найдете много полезной информации

Ответ №2:

В LaminasFormElement классе есть метод с именем setMessages(), который ожидает массив в качестве параметра, например

 $form->get('password')
   ->setMessages(['The Entered Password is not Correct']);
 

Обратите внимание, что это приведет к удалению всех сообщений об ошибках, которые, возможно, уже есть у вашего элемента. Если вы хотите добавить свои сообщения, как в старом addErrorMessage() методе, вы можете сделать это следующим образом:

 $myMessages = [
   'The Entered Password is not Correct',
   '..maybe a 2nd custom message'
];
$allMessages = array_merge(
   $form->get('password')->getMessages(),
   $myMessages);

$form
  ->get('password')
  ->setMessages($allMessages);
 

Вы также можете использовать имя шаблона ошибки, которое Laminas использует для своих сообщений об ошибках, в качестве ключа в вашем массиве сообщений, чтобы переопределить конкретное сообщение об ошибке:

 $myMessages = [
   'notSame' => 'The Entered Password is not Correct'
];