Удаление сообщений об ошибках проверки из элемента формы Zend

У меня есть элемент формы для захвата адресов электронной почты. Я использую Zend_Validate_EmailAddress для элемента, и он генерирует сообщения об ошибках, которые не очень удобны для пользователя.

Мой первый шаг состоял в том, чтобы указать новые сообщения, которые были бы более удобными для пользователя, но некоторые из проверок просто не поддаются удобному сообщению. Затем я попытался просто очистить эти сообщения после запуска isValid() в форме и указать свои собственные, но ни одна из найденных мной функций не очистит сообщения.

Что я пробовал и результаты

  1. setErrorMessages() - Установленные здесь значения, похоже, полностью игнорируются
  2. clearErrorMessages() - Кажется, игнорируется
  3. setErrors() - Добавляет мое сообщение, но оставляет остальные нетронутыми

Это код, который отображает ошибки в моем пользовательском сценарии просмотра:

<?php if ($this->element->hasErrors()): ?>
    <?php echo $this->formErrors($this->element->getMessages()); ?>
<?php endif; ?>

МОЕ РЕШЕНИЕ

Я награждаю Гордона ответом, потому что его решение является наиболее полным, но в итоге я использовал функцию addErrorMessage() на элемент вот так< /а>:

$element->addValidator('EmailAddress', false, $this->_validate['EmailAddress'])
        ->addErrorMessage("'%value%' is not a valid email address");

$element->addValidator('Date', false, array('MM/dd/yyyy'))
        ->addErrorMessage("Date must be in MM/DD/YYYY format");

person Sonny    schedule 20.04.2011    source источник


Ответы (3)


Из Справочного руководства (выделено мной):

Некоторые разработчики могут захотеть предоставить собственные сообщения об ошибках для валидатора. Аргумент $options метода Zend_Form_Element::addValidator() позволяет сделать это, предоставив ключ 'messages' и сопоставив его с массивом пар ключ/значение для установки шаблонов сообщений. Вам необходимо знать коды ошибок различных типов ошибок проверки для конкретного валидатора.

Итак, вы можете сделать:

$form = new Zend_Form;
$username = new Zend_Form_Element_Text('username');
$username->addValidator('regex', false, array(
    '/^[a-z]/i',
    'messages' => array(
        'regexInvalid'  => 'foo',
        'regexNotMatch' => 'bar',
        'regexErrorous' => 'baz'
    )
));
$form->addElement($username);
$form->isValid(array('username' => '!foo'));

который затем отобразит «бар» для сообщения об ошибке, потому что регулярное выражение не соответствует, потому что оно не начинается с буквы от AZ.

Это эквивалентно использованию:

$username->setErrorMessages(
    array(
        'regexNotMatch' => 'The value %value% must start with a-Z',
        …
    )
);

Я использовал другой шаблон, чтобы проиллюстрировать, как использовать проверенное значение в шаблоне.

Вы также можете использовать setErrors, если хотите удалить какие-либо шаблоны по умолчанию, например.

$username->setErrors(array('The value must start with a-Z'));

Что бы вы ни делали, вы должны настроить это перед проверкой с помощью isValid. После запуска проверки Zend_Form_Element будет содержать сообщение об ошибке по умолчанию, иначе. Я не знаю, как это сбросить (хотя кто-то может меня поправить).

Дальнейшее цитирование справочника:

Лучшим вариантом является использование Zend_Translate_Adapter с вашей формой. Коды ошибок автоматически передаются адаптеру декоратором ошибок по умолчанию; затем вы можете указать свои собственные строки сообщений об ошибках, настроив переводы для различных кодов ошибок ваших валидаторов.

Все сообщения проверки могут быть настроены из файла в

Файл должен быть в папке APPLICATION_PATH/resources/languages, но на самом деле его можно разместить где угодно, если вы сообщите Zend_Translate, где его найти.

person Gordon    schedule 20.04.2011
comment
Где должен быть размещен этот файл с точки зрения структуры library/? - person Sonny; 21.04.2011

Когда вы определяете такой элемент формы

$titel = new Zend_Form_Element_Text ( "titel" );
$titel->setLabel ( "Titel" )->setRequired ( true )
      ->addValidator ( 'regex', false, array ("/[\pL\pN_\-]+/" ) );

вы можете указать сообщение об ошибке в вашем сценарии просмотра

<?php 
    $form = $this->form;
    $errorsMessages =$this->form->getMessages();
?>

<div>
    <label>Titel</label> <?php echo $form->titel->renderViewHelper()?>
    <?php 
           if(isset($errorsMessages['titel'])){
               echo "<p class='error'>There's something wrong!</p>";
           }
    ?>
</div>

Я не знаю, соответствует ли это вашему пути, но мне очень нравится определять мои формы таким образом;)

person Upvote    schedule 20.04.2011

Один из способов атаковать его — создать свой собственный валидатор, расширив валидатор, который вы планируете использовать, и переопределив сообщения. Например, глядя на Zend_Validate_Alnum, это выглядит так:

class Zend_Validate_Alnum extends Zend_Validate_Abstract
{
    const INVALID      = 'alnumInvalid';
    const NOT_ALNUM    = 'notAlnum';
    const STRING_EMPTY = 'alnumStringEmpty';

    [ ... ]

    protected $_messageTemplates = array(
        self::INVALID      => "Invalid type given. String, integer or float expected",
        self::NOT_ALNUM    => "'%value%' contains characters which are non alphabetic and no digits",
        self::STRING_EMPTY => "'%value%' is an empty string",
    );

    [ ... ]
}

Переопределите массив $_messageTemplates в своем собственном классе, как это

class My_Validate_Alnum extends Zend_Validate_Alnum
{
    protected $_messageTemplates = array(
        self::INVALID      => "My invalid message",
        self::NOT_ALNUM    => "foo",
        self::STRING_EMPTY => "'%value%' is bar",
    );

    [ ... ]
}

Затем вместо Zend_Validate_Alnum используйте My_Validate_Alnum в качестве валидатора. Пользовательские валидаторы очень просто создать.

person ashurexm    schedule 20.04.2011