2008-12-17 8 views
4

J'ai une classe qui étend Zend_Form comme celui-ci (simplifié):Zend Framework - Zend_Form Décorateur Problème

class Core_Form extends Zend_Form 
{ 
    protected static $_elementDecorators = array(
     'ViewHelper', 
     'Errors', 
     array('Label'), 
     array('HtmlTag', array('tag' => 'li')), 
    ); 

    public function loadDefaultDecorators() 
    { 
     $this->setElementDecorators(self::$_elementDecorators); 
    } 
} 

J'utilise ensuite cette classe pour créer toutes mes formes:

class ExampleForm extends Core_Form 
{ 
    public function init() 
    { 
     // Example Field 
     $example = new Zend_Form_Element_Hidden('example'); 
     $this->addElement($example); 
    } 
} 

Dans un de mes vues, j'ai besoin d'afficher seulement ce seul champ (sans rien d'autre généré par Zend_Form). Donc, à mon avis, j'ai ceci:

<?php echo $this->exampleForm->example; ?> 

Cela fonctionne bien, sauf qu'il génère le champ comme ceci:

<li><input type="hidden" name="example" value=""></li> 

Ceci est évidemment parce que je mets les décorateurs d'éléments pour inclure HtmlTag: tag = > 'li'.

Ma question est: Comment puis-je désactiver tous les décorateurs pour cet élément. Je n'ai pas besoin de décorateurs pour les éléments d'entrée cachés.

Répondre

4

le meilleur endroit pour le régler est loadDefaultDecorators la fonction publique()

par exemple comme ceci:

class ExampleForm extends Core_Form 
    { 
     public function init() 
     { 
      //Example Field 
      $example = new Zend_Form_Element_Hidden('example'); 
      $this->addElement($example); 
     } 

     public function loadDefaultDecorators() 
     { 
      $this->example->setDecorators(array('ViewHelper')); 
     } 
    } 
+0

Merci beaucoup! Je ne sais pas pourquoi je n'ai pas pensé à surcharger la fonction loadDefaultDecorators(). – leek

3

Réinitialisez les décorateurs de l'élément de formulaire pour utiliser uniquement 'ViewHelper'. Par exemple:

<?php echo $this->exampleForm->example->setDecorators(array('ViewHelper')) ; ?> 

Évidemment, la vue n'est pas l'endroit idéal pour le faire, mais vous avez l'idée. Notez que l'appel de setDecorator *** s ***() réinitialise tous les décorateurs au lieu d'en ajouter un nouveau.

3

Si vous désactivez les décorateurs dd/dt sur l'élément caché, vous aurez invalide XHTML, parce que vous aurez quelque chose qui n'est pas un élément valide dans un dl. La seule solution est de désactiver ces décorateurs sur tous les éléments de formulaire, pas seulement ceux qui sont cachés, et de les désactiver sur tout le formulaire. Par souci de cohérence, vous souhaiterez le faire dans tous les formulaires.

IMHO, c'est une mauvaise décision de conception dans ZF. Je veux dire, dire que la valeur d'une entrée est la «définition» d'un «terme» est une idée mignonne sémantiquement, mais ce n'est pas entièrement réfléchi.

Même question ici: Zend Framework: How do I remove the decorators on a Zend Form Hidden Element?

0

Voici ce que je fais:

class M_Form_Element_Hidden extends Zend_Form_Element_Hidden { 
    public function init() { 
     $this->setDisableLoadDefaultDecorators(true); 
     $this->addDecorator('ViewHelper'); 
     $this->removeDecorator('DtDdWrapper'); 
     $this->removeDecorator('HtmlTag'); 
     $this->removeDecorator('Label'); 
     return parent::init(); 
    } 
} 

Ensuite, dans votre formulaire,

$element = new M_Form_Element_Hidden('myElement'); 
$this->addElement($element); 

Source

1

Si vous allez ajouter des éléments dans De cette façon:

$this->addElement(
    'text', 
    'a1', 
    array('required' => true, 'validators' => array('Alpha')) 
); 

Vous pouvez obtenir les dd/dt balises pour chaque élément avec ceci:

$this->setElementDecorators(array('ViewHelper')); 

ou si vous êtes goint d'ajouter des éléments dans cette autre façon:

$nombre1 = new Zend_Form_Element_Text(
      'n1', 
      array('id'=> 'Nombre1', 'validators' => array('Alpha')) 
      ); 
//$nombre1->setDecorators(array('ViewHelper')); 
$this->addElement($nombre1); 

Vous devez supprimer :

//$nombre1->setDecorators(array('ViewHelper')); 

afin de désactiver le dd/dt balises. Cette dernière manière consiste uniquement à désactiver l'élément en cours, les autres éléments du formulaire conservent les étiquettes <dd><dt> normalement.