Zend_Form hatalarını devre dışı bırakmak için kolay bir yolu var mı?

2 Cevap php

Ben Zend Framework kullanıyorum. Belirli bir form için form elemanları yanındaki hataları göstermek için yeterli alan yok. Bunun yerine, ben formda yukarıdaki hataları görüntülemek için mümkün olmak istiyorum. Ben görünümüne $form->getErrorMessages() geçerek gerçekleştirebilirsiniz hayal ama nasıl ben her unsur vizyonda hata iletileri devre dışı bırakırım?

2 Cevap

Sen setElementDecorators kullanarak elemanları oluşturmak için dekoratörler ekleyebilirsiniz. Zend_Form sadece init başlıklı sonra adı verilen bir işlevi vardır loadDefaultDecorators. Geçersiz kılmak, bunu gibi bu kılabilirsiniz:

/**
 * Load the default decorators for forms.
 */
public function loadDefaultDecorators()
{
    // -- wipe all
    $this->clearDecorators();

    // -- just add form elements
    // -- this is the default
    $this->setDecorators(array(
       'FormElements',
        array('HtmlTag', array('tag' => 'dl')),
        'Form'
    ));

    // -- form element decorators
    $this->setElementDecorators(array(
        "ViewHelper",
        array("Label"),
        array("HtmlTag", array(
            "tag"   => "div",
            "class" =>"element",
        )),
    ));

    return $this;
}

Eğer init daki unsurlar eklendi varsayarsak, bu formdaki her eleman için bu dekoratörler geçerlidir. Sen setElementDecorators olarak "hatalar" dekoratör yokluğu dikkat edeceğiz. Ayrıca form öğeleri döngü ve sadece Hataları dekoratör kaldırmak için removeDecorator kullanarak deneyebilirsiniz.

Yukarıdaki öneri varsayılan dekoratörler değişebilir dikkate almaz. Bunun yerine dekoratörler temizleyerek ve sonra gerekmez dışındaki tüm yeniden uygulama, bu gibi form başlatma zaman gerekmez dekoratörler devre dışı bırakmak için daha iyi olurdu:

class My_Form_Login extends Zend_Form
{

    public function init()
    {
        $this->setMethod('post');        

        $username = new Zend_Form_Element_Text('auth_username');
        $username->setLabel('Username')
                 ->setRequired(true)
                 ->addValidator('NotEmpty')
                 ->removeDecorator('Errors')
                 ->addErrorMessage("Please submit a username.");
    etc.....

Daha sonra, formu kullanın yerde, (formunuza ayırıyordu görüntülemek için planlıyorsanız) mesajları görüntülemek için nasıl karar verebilir. Bu formun bir parçası olmalıdır eğer Tabii ki, sadece uygun bir dekoratör oluşturmak ve yukarıda form elemanı init yöntemine ekleyin. Here ZendCasts.com gelen formu dekoratörler güzel bir öğretici olduğunu

Formun kendisi dışında mesajları gösterme örneği.

$elementMessages = $this->view->form->getMessages();

// if there actually are some messages
if (is_array($elementMessages)) 
{
    foreach ($elementMessages as $element)
    {
        foreach ($element as $message)
        {
            $this->view->priorityMessenger($message, 'notice');
        }
    }
}

Yukarıda kullanılan priorityMessenger-yardımcı burada bulunabilir: http://emanaton.com/code/php/zendprioritymessenger