2010-02-09 5 views
1

J'essaie actuellement de créer un calque personnalisé simple que je vais étendre à la place de Zend_Form. Par exemple, My_Form.Zend_Form par défaut élément par défaut pour la mise en page personnalisée

Je souhaite que tous mes formulaires soient identiques, c'est pourquoi je le mets dans My_Form. Voici ce que c'est si loin.

class My_Form extends Zend_Form 
{ 
    protected $_elementDecorators = array(
     'ViewHelper', 
     'Errors', 
     array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')), 
     array('Label', array('tag' => 'td')), 
     array(array('row' => 'HtmlTag'), array('tag' => 'tr')), 
    ); 
} 

Et toutes mes formes vont prolonger cela. Maintenant que cela fonctionne, le problème vient avec le tableau $ _elementDecorators. J'enveloppe le Label dans un "td" et le Label Decorator applique le "id" par défaut à ce "td" mais je veux aussi ajouter une classe à ce "td".

Y at-il de toute façon à accomplir cela, avec ce tableau? Sinon, y a-t-il une meilleure façon de faire cela? Ou si oui, quelqu'un peut-il me décrire comment fonctionne ce tableau?

Résultat souhaité:

<tr> 
    <td class='label_cell'> 
     <label /> 
    </td> 
    <td class='value_cell'> 
     <input /> 
    </td> 
</tr> 

Merci.

Répondre

1

J'ai trouvé une solution, mais je ne suis pas sûr que ce soit le meilleur.

Ici, j'ai décidé de créer un décorateur personnalisé et de le charger à la place.

/** 
* Overide the default, empty, array of element decorators. 
* This allows us to apply the same look globally 
* 
* @var array 
*/ 
protected $_elementDecorators = array(
    'ViewHelper', 
    'Errors', 
    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')), 
    array('CustomLabel', array('tag' => 'td')), 
    array(array('row' => 'HtmlTag'), array('tag' => 'tr')) 
); 

/** 
* Prefix paths to use when creating elements 
* @var array 
*/ 
protected $_elementPrefixPaths = array(
    'decorator' => array('My_Form_Decorator' => 'My/Form/Decorator/') 
); 

Décorateur:

class My_Form_Decorator_CustomLabel extends Zend_Form_Decorator_Label 
{ 
    public function render($content) 
    { 
     //... 
     /** 
     * Line 48 was added for the cutom class on the <td> that surrounds the label 
     */ 
     if (null !== $tag) { 
      require_once 'Zend/Form/Decorator/HtmlTag.php'; 
      $decorator = new Zend_Form_Decorator_HtmlTag(); 
      $decorator->setOptions(array('tag' => $tag, 
             'id' => $this->getElement()->getName() . '-label', 
             'class' => 'label_cell')); 

      $label = $decorator->render($label); 
     } 
     //... 
    } 
} 

Bien que cela fonctionne très bien, je suis toujours curieux de savoir s'il y a un moyen plus simple de le faire.

Des idées?

0

hack que je fini par utiliser lorsqu'ils traitent avec la même question:

class My_Form extends Zend_Form 
{ 
    protected $_elementDecorators = array(
     'ViewHelper', 
     'Errors', 
     array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')), 
     array('Label', array('tag' => 'th')), 
     array(array('row' => 'HtmlTag'), array('tag' => 'tr')), 
    ); 
} 

La différence est: `array ('Label', array ('tag' => 'e')),

Ainsi, votre colonne "label" contient des éléments TH et la colonne de votre élément contient des éléments TD.

Ensuite, vous pouvez les styler comme vous le souhaitez.

Questions connexes