2010-10-15 5 views
1

Je construis une application en utilisant Zend_Framework et je voudrais vous demander un conseil concernant Zend_Form. Tous les formulaires sur le site doivent être décorés avec des tableaux, au lieu de listes de définitions. Mon idée est que je devrais créer une forme commune (sans éléments) et juste l'instancier sur le site et ajouter des éléments si nécessaire. Cette forme commune devrait modifier les décorateurs standard, de sorte que les tables soient utilisées à la place des listes de définitions. Comment suggérez-vous de faire cela? Remplacer la méthode addElement() de Zend_Form afin qu'elle modifie les décorateurs de nouveaux éléments?Conseils concernant Zend_Form

Mais il y a une autre mise en garde. Il devrait être possible d'utiliser un ensemble différent de décorateurs pour un élément particulier, si nécessaire. Donc, je suis un peu perplexe comment faire cela. Avez-vous des conseils?

Répondre

1

Utilisez une classe intermédiaire pour la configuration de votre projet. Vous serez ensuite étendre cette classe au lieu de Zend_Form

fichier My/Form.php

<?php 
abstract class My_Form extends Zend_Form { 

    public function __construct ($options = null) { 
     parent::__construct($options); 

     $this->setElementDecorators(array(
       // the base <input, <select, <textarea markup 
       'ViewHelper', 

       // wrap that into a <div class="input-wrap" /> 
       array (
        'HtmlTag', 
        array (
         'tag' => 'div', 
         'class' => 'input-wrap', 
        ) 
       ), 

       // append errors in <ul/li> 
       'Errors', 

       // then prepend <label markup 
       'Label', 
      )); 
    } 
} 

puis dans le fichier My/Form/Demo.php

<?php 
class My_Form_Demo extends My_Form { 

    public function init() { 
     // Your elements here 
    } 
} 

Vous pouvez le faire pour l'élément spécifique ainsi

fichier

My/Form/Element/Group.php

<?php 
class My_Form_Element_Group extends Zend_Form_Element_Select { 

    public function init() { 
     // Specific options 
     $this->addMultiOptions(array(
      'A' => 'group A', 
      'B' => 'group B', 
     )); 

     // This element doesn't need the div.input-wrap 
     $this->removeDecorator('HtmlTag'); 
    } 
} 
2

Il n'existe aucun moyen simple de remplacer les décorateurs par défaut. La solution que j'utilise consiste à remplacer tous les éléments et à redéfinir la méthode loadDefaultDecorators.

Le problème est que chaque élément possède un ensemble spécifique de décorateur. Par exemple, l'élément caché n'a besoin que du décorateur ViewHelper tandis que l'élément de fichier a besoin de Fichier, Erreurs, Description, HtmlTag (td), Label (th), HtmlTag (tr).

Vous pouvez également utiliser Zend_Form :: setElementDecorators à la fin de votre méthode init (après les appels à addElement). Mais vous devez le personnaliser pour chaque forme ...