Подтвердить что ты не робот

Добавить атрибут класса в ошибки формы

Я разрабатываю приложение с использованием Zend Framework 2, и я использую FormRow помощник для визуализации метки, ввода и ошибок (если они есть) в форме.

//within the view
echo $this->formRow($form->get('Name'));

Когда пользователь отправляет форму без заполнения требуемого текстового поля ввода FormRow, появляется следующее сообщение об ошибке:

<label>
    <span>Name: </span>
    <input class="input-error" type="text" value="" placeholder="Insert Name Here" name="Name">
</label>
<ul>
    <li>Value is required and can't be empty</li>
</ul>

Как я могу установить класс для тега li, чтобы потом стилизовать его?

Я знаю, что я могу повторить formElementErrors с требуемым атрибутом класса через.

<?php echo $this->formElementErrors($form->get("Name"), array('class' => "valuerequired", 'message' => "errortestmessage")); ?>

.. но FormRow все равно отобразит сообщение об ошибке без класса.

Только для справки Я устанавливаю объект таким образом:

public function getInputFilter()
    {
        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();

            $factory = new InputFactory();

            $inputFilter->add($factory->createInput(array(
                'name'     => 'Name',
                'required' => true,
                'filters'  => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name'      => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'min'      => 1,
                            'max'      => 100,
                        ),
                    ),
                ),
           )));

            $this->inputFilter = $inputFilter;
        }
        return $this->inputFilter;
    }
4b9b3361

Ответ 1

Хорошо, решение моей проблемы было прямо передо мной, вместо того, чтобы использовать:

//within the view
echo $this->formRow($form->get('Name'));

Я вызывал каждый элемент формы индивидуально:

    //within the view
    echo $this->formLabel($form->get('Name'));
    echo $this->formInput($form->get('Name'));
    echo $this->formElementErrors($form->get("Name"), array('class' => "some_class", 'message' => "errormessage")); 

Не знаю, если это самый эффективный способ сделать это, PLZ отбросить линию, если вы думаете иначе.

Ответ 2

Смотрите код формыElementErrors

В принципе, вы можете сделать что-то вроде:

$this->formElementErrors($elem)
     ->setMessageOpenFormat('<ul%s><li class="some-class">')
     ->setMessageSeparatorString('</li><li class="some-class">');

Но это довольно неуправляемо...

Лучшим решением было бы расширить Zend\Form\View\Helper\FormElementErrors вашим собственным классом, а затем зарегистрировать вид-помощник formElementErrors для вашего класса. Так что в основном у вас будет что-то вроде этого:

namespace Mymodule\Form\View\Helper;

use Zend\Form\View\Helper\FormElementErrors as OriginalFormElementErrors;

class FormElementErrors extends OriginalFormElementErrors  
{
    protected $messageCloseString     = '</li></ul>';
    protected $messageOpenFormat      = '<ul%s><li class="some-class">';
    protected $messageSeparatorString = '</li><li class="some-class">';
}

Последнее, что нужно было бы зарегистрировать помощника вида с этим новым классом. Для этого вы предоставляете следующий код внутри своих модулей Module.php

public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            'formelementerrors' => 'Mymodule\Form\View\Helper\FormElementErrors'
        ),
    );
}

сбой: этот код не проверен, сообщите мне, есть ли какие-то ошибки, но я думаю, что это должно получиться неплохо.

Ответ 3

FormRow проверяет, зарегистрирован ли плагин form_element_errors. И если это так используется по умолчанию для отображения сообщений об ошибках.

Пример работы Сэма. Вы должны переопределить стандартный плагин и сообщить об этом mvc.

Я сделал это в файле module.config.php

'view_helpers' => array(
'invokables' => array(
    'formElementErrors'=> 'MyModule\View\Helper\FormElementErrors',

и FormRow начинают отображать ошибки, как я хочу:)

Ответ 4

Как ваша проблема, попробуйте

Изменить

//within the view
echo $this->formRow($form->get('Name'));

к

//within the view
echo $this->formRow($form->get('Name'),null,false);
// Note: add more 2 last parameters, false- for $renderErrors => will NOT render Errors Message. 
//Look original function in helper/formrow.php: function __invoke(ElementInterface $element = null, $labelPosition = null, $renderErrors = null, $partial = null)

Render Errors Message как ваш funciton

echo $this->formElementErrors($form->get('name'), array('class' => 'your-class-here'));

Ответ 6

Я использую echo $this->formElementErrors($form, array('class' => "error-messages")); для отображения всех сообщений об ошибках в одном месте:

echo $this->formElementErrors($form, array('class' => "error-messages"));// Print all error messagess

echo $this->formLabel($form->get('Name'));
echo $this->formInput($form->get('Name'));

echo $this->formLabel($form->get('Name2'));
echo $this->formInput($form->get('Name2'));