2009-06-11 5 views
2

Je voudrais envelopper des éléments de forme avec des étiquettes en tant que telsDans Zend Framework, comment emballer des éléments de formulaire dans une étiquette à l'aide de décorateurs?

<label for="email">E-mail <input type="text" name="email" id="email" /></label> 

La seule option que je pouvais trouver est de modifier le placement; mais il accepte que « PREPEND » et « append »:

<!-- prepend --> 
<label for="email">E-mail</label> <input type="text" name="email" id="email" /> 
<!-- append --> 
<input type="text" name="email" id="email" /> <label for="email">E-mail</label> 

Ce n'est pas ce que je suis après. Je pourrais modifier la classe Zend_Form_Decorator_Label, mais c'est la dernière alternative.

Répondre

5

Cela ne semble pas possible malheureusement, vous devrez probablement écrire un décorateur personnalisé. Cela devrait être assez simple, cependant.

S'il vous plaît noter que im vais écrire ça ici, il est non testé, mais un autre décorateur basé hors de sorte qu'il devrait fonctionner avec peu/pas de modification

class Your_Form_Decorator_Date extends Zend_Form_Decorator_Abstract { 
    public function render($content) { 
     $element = $this->getElement(); 

     $name = $element->getFullyQualifiedName(); 
     return '<label for="'.$name.'">'. $element->getLabel() . ' '.$content.'</label>'; 

    } 
} 

Maintenant, si vous ajoutez le préfixe correct à votre formulaire.

$this->addPrefixPath('Your_Form', 'Your/Form/'); 

Vous devriez pouvoir utiliser ceci pour envelopper votre entrée (décorateur FormElement) dans une étiquette d'étiquette.

Désolé, je n'ai pas eu l'occasion de tester cela, mais vu le travail de mes autres décorateurs. Ça devrait aller.

EDIT: Merci d'avoir signalé que le texte d'étiquette n'était pas rendu gnarf. Ceci est maintenant corrigé.

+0

Vous avez oublié de rendre le texte de l'étiquette pour l'élément $ dans le "retour" – gnarf

0

J'ai toujours trouvé que les décorateurs étaient sur-construits pour une situation donnée et cela annule en quelque sorte le but de séparer la couche de présentation de la logique métier. Vous pouvez utiliser l'assistant partiel de Zend ou créer vos propres widgets en utilisant Zend_Form ou une combinaison des deux, ce qui vous donnerait beaucoup plus de contrôle sur la présentation.

Sur certains sites de référence XHTML, ils ne répertorient pas les éléments d'entrée en tant qu'éléments enfants valides pour les étiquettes, bien que le texte et tout élément en ligne soient valides. Cela pourrait être une autre raison pour laquelle ce n'est pas autorisé.

0

Je suppose que vous ne devriez pas l'utiliser;) C'est parce que le contenu de l'étiquette est la description du champ. Il est absurde d'inclure l'élément dans la description. Si vous en avez besoin, vous pouvez envelopper les deux dans un div ou quelque chose comme ça.

La seule raison pour cela est mal écrit :) services de soutien communautaires

0

Je suppose que vous voulez que l'étiquette à aligner juste à côté de l'élément.

Exemple

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email: '); 
$form = new Zend_Form(); 
$form->addElement($email); 

Maintenant, qui rendra la forme en tant que telle

<label>Email:</label> 
     <input type="text"/> 

Afin d'avoir la zone de texte juste à côté de l'étiquette, vous devez rendre le décorateur « label » séparément.Pour ce faire:

J'ai créé une forme dans mon contrôleur, affecté à une variable dans la vue:

//in controller 
$this->view->form = $form; 

//in view script 
$form = $this->form; 

//('tag', null) tells the renderer not to wrap the label in the usual <dt> tag, 
//but not to use anything at all 
$form->getElement('email')->getDecorator('label')->setOption('tag', null); 

puis dans votre script de vue ...

<?php print($form->email) ?> 

Cette volonté Rend l'élément Texte à côté de son propre libellé

Questions connexes