2010-04-12 25 views
2

J'utilise actuellement zend_decorators pour ajouter des styles à mon formulaire. Je me demandais s'il y avait une autre façon de le faire? C'est un peu difficile d'écrire des décorateurs. J'aimerais l'un et décontracté en utilisant divs style css:Existe-t-il une meilleure façon de concevoir zend_forms plutôt que d'utiliser des décorateurs?

<input type="submit" class="colorfulButton" > 

Il est beaucoup plus simple plutôt que de définir un décorateur pour un certain contrôle et l'ajouter. Comme il faut créer un décorateur pour chaque implémentation de style et l'additionner avec le contrôle. Va voir les aides à l'astuce?

Répondre

3

Il y a plusieurs façons. Vous pouvez rouler vos propres aides de vue d'élément (qui pourraient devenir plutôt maladroites bientôt je devine).

Ou ... vous pouvez utiliser un ViewScript pour la forme, comme celui-ci (par exemple très basique):

class Your_Form extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setDecorators(array(
      'PrepareElements', 
      array('ViewScript', array('viewScript' => 'path/to/viewscript.phtml')) 
     )); 

     // only use basic decorators for elements 
     $decorators = array(
      'ViewHelper', 
      'Label', 
      'Errors' 
     ); 

     // create some element 
     $someElement = new Zend_Form_Element_Text('someElement'); 
     // set the basic decorators for this element and set a css class 
     $someElement->setDecorators($decorators) 
        ->setAttrib('class', 'someCssClass'); 

     // add (potentially multiple) elements to this from 
     $this->addElements(array(
      $someElement 
     )); 

    } 
} 

Voir la standard decorators section about PrepareElements pourquoi il est nécessaire d'avoir le décorateur de PrepareElements ensemble pour la forme, lorsque en utilisant le décorateur ViewScript.

Ensuite, dans le ViewScript:

<? 
    // the form is available to the viewscript as $this->element 
    $form = $this->element; 
?> 
<!-- put whatever html you like in this script and render the basic element decorators seperately --> 
<div> 
    <? if($form->someElement->hasErrors()): ?> 
    <?= $form->someElement->renderErrors() ?> 
    <? endif; ?> 
    <?= $form->someElement->renderLabel(); ?> 
    <?= $form->someElement->renderViewHelper(); ?> 
</div> 
+0

Merci, c'est ce dont j'ai besoin. à votre santé – Hanseh

1

Si vous voulez simplement définir un attribut de classe sur un élément de formulaire, il n'est pas nécessaire de définir un décorateur: cela peut être fait en utilisant certaines méthodes standard des éléments de zend_form.

Voir la setAttrib() méthode, dans la section Metadata and Attributes du manuel, et l'exemple qui est donné là (citant):

// Equivalent to $element->setAttrib('class', 'text'): 
$element->class = 'text; 


Et si vous pouvez définir un attribut de classe de cette façon , vous pouvez probablement le définir lors de la construction des éléments de votre formulaire, ou dans un fichier .ini qui définirait ces éléments - il y a un exemple qui montre cela un peu plus tard dans la page, dans la section Configuration.

+0

Je suis d'accord avec cette réponse pour les cas simples. Mais que faire si nous avons une sorte de complexité de conception? Comme avoir stratifié div avec différents éléments de forme par couche et les goûts. – Hanseh

+0

Dans ce cas (complexe), je suppose que vous devrez utiliser des décorateurs, oui. –