2010-10-06 18 views
1

J'ai défini un validateur pour l'e-mail afin qu'il ne puisse pas être vide.Comportement d'erreur de validation de modification de Zend: élément d'emballage dans une autre balise

C'est le balisage de la forme habituelle que Zend_Form génère:

<dt id="email-label"><label class="required" for="email">Email</label></dt> 
<dd id="email-element"> 
    <input type="text" value="" id="email" name="email"> 
</dd> 

Lorsque la validation échoue, Zend_Form ajoute une nouvelle ul class="errors" dans la dd

<dt id="email-label"><label class="required" for="email">Email</label></dt> 
<dd id="email-element"> 
    <input type="text" value="" id="email" name="email"> 
    <ul class="errors"> 
     <li>Value is required and can't be empty</li> 
    </ul> 
</dd> 

Comment puis-je modifier ce comportement par défaut légèrement de sorte que l'ensemble dt dd est enveloppé dans un seul p ou something que je peux ajouter une classe d'erreur à? Ma conjecture est que je dois spécifier à zend_form comment se comporter quand un élément a des erreurs.

Répondre

5

Vous pouvez créer votre propre décorateur pour le faire, quelque chose de simple comme celui-ci ::

class My_Decorator_ElementWrapper extends Zend_Form_Decorator_Abstract 
{ 
    public function render($content) 
    { 
     $class = 'form-element'; 
     $errors = $this->getElement()->getMessages(); 
     if (!empty($errors)) 
      $errors .= ' has-errors'; 
     return '<div class="'.$class.'">' . $content . '</div>'; 
    } 
} 

Maintenant vous pouvez simplement enregistrer ce décorateur pour l'élément:

$element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator'); 
$element->addDecorator('ElementWrapper'); 

Vous pouvez également enregistrer le préfixe chemin pour tous les éléments en même temps en utilisant $form->addElementPrefixPath() à la place. Si vous voulez ajouter ce décorateur (et le chemin du préfixe) automatiquement pour tous les éléments, je vous suggère d'étendre chaque élément correspondant à celui de Zend (par exemple, faites My_Form_Element_Text qui s'étend Zend_Form_Element_Text), puis ajoutez le chemin de préfixe dans le fonction init, et remplacer la méthode loadDefaultDecorators() pour ajouter le ElementWrapper à la fin de la chaîne de décorateur. Par exemple, voici comment loadDefaultDecorators() looks pour Zend_Form_Element_Text:

public function loadDefaultDecorators() 
{ 
    if ($this->loadDefaultDecoratorsIsDisabled()) { 
     return $this; 
    } 

    $decorators = $this->getDecorators(); 
    if (empty($decorators)) { 
     $this->addDecorator('ViewHelper') 
      ->addDecorator('Errors') 
      ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) 
      ->addDecorator('HtmlTag', array('tag' => 'dd', 
              'id' => $this->getName() . '-element')) 
      ->addDecorator('Label', array('tag' => 'dt')); 
    } 
    return $this; 
} 

Vous aimerais ajouter un ->addDecorator('ElementWrapper') à la fin de la chaîne. Donc, pour montrer un exemple concret de My_Form_Element_Text:

class My_Form_Element_Text extends Zend_Form_Element_Text 
{ 
    public function init() 
    { 
     $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator'); 
    } 

    public function loadDefaultDecorators() 
    { 
     if ($this->loadDefaultDecoratorsIsDisabled()) { 
      return $this; 
     } 

     $decorators = $this->getDecorators(); 
     if (empty($decorators)) { 
      $this->addDecorator('ViewHelper') 
       ->addDecorator('Errors') 
       ->addDecorator('Description', array('tag' => 'p', 'class' => 'description')) 
       ->addDecorator('HtmlTag', array('tag' => 'dd', 
               'id' => $this->getName() . '-element')) 
       ->addDecorator('Label', array('tag' => 'dt')) 
       ->addDecorator('ElementWrapper'); 
     } 
     return $this; 
    } 
}