Очистка сообщений об ошибках валидации от элемента формы Zend - PullRequest
3 голосов
/ 20 апреля 2011

У меня есть элемент формы для захвата адресов электронной почты.Я использую 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");

Ответы [ 3 ]

5 голосов
/ 21 апреля 2011

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

Некоторые разработчики могут захотеть предоставить специальные сообщения об ошибках для валидатора. Аргумент $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'));

, который затем отобразит 'bar' для сообщения об ошибке, потому что регулярное выражение не совпадает, потому что оно не начинается с буквы от -Z.

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

$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, где его найти.

1 голос
/ 20 апреля 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 в качестве валидатора. Пользовательские валидаторы очень просты в создании.

1 голос
/ 20 апреля 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>

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

...