Изчистване на съобщения за грешка при проверка от Zend Form Element

Имам елемент на формуляр за заснемане на имейл адреси. Използвам 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'));

което след това ще изобрази „лента“ за съобщението за грешка, тъй като регулярният израз не съвпада, защото не започва с буква от a-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 къде да го намери.

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