2010-01-28 5 views
2

Avoir (plus) des problèmes avec les décorateurs de forme zend. J'ai ce jusqu'à présent:zend form décorateurs

forme globale décorateur Réinitialiser:

$this->clearDecorators(); 
    $this->setDecorators(array('FormElements', 'Form')); 

J'ajoute tous mes éléments à un groupe d'affichage que je veux être à l'intérieur d'un fieldset, dans un DL

$group->setDecorators(array(
      'FormElements', 
      array('HtmlTag', array('tag' => 'dl')), 
      'Fieldset' 
    )); 

tout fonctionne jusqu'à présent, maintenant je veux placer une balise d'image immédiatement avant le fieldset. lui-même cela fonctionnerait:

 $group->setDecorators(array(
      'FormElements', 
      'Fieldset', 
      array('HtmlTag',array('tag'=>'img','placement'=>'prepend','src'=>'/images/'.$imgs[$i-1]->im_name.'_main.jpg')) 
     )); 

mais cela ne marche pas (il arrête le DL étant ajouté à l'intérieur du fieldset):

 $group->setDecorators(array(
      'FormElements', 
      array('HtmlTag', array('tag' => 'dl')), 
      'Fieldset', 
      array('HtmlTag',array('tag'=>'img','placement'=>'prepend','src'=>'/images/'.$imgs[$i-1]->im_name.'_main.jpg')) 
     )); 

Où vais-je tort?

Répondre

5

Wheh vous créez les décorateurs de HtmlTag, leur donner des noms. Voici un exemple de mon code:

protected $_fileElementDecorator = array(
    'File', 
    array(array('Value'=>'HtmlTag'), array('tag'=>'span','class'=>'value')), 
    'Errors', 
    'Description', 
    'Label', 
    array(array('Field'=>'HtmlTag'), array('tag'=>'div','class'=>'field file')), 
); 

Comme vous pouvez le voir, je peux nommer la première « valeur » et le second « champ ». Nommer les vous donne également la possibilité de référencer le décorateur plus tard, comme ceci:

$file = $form->getElement('upload_file'); 
$decorator = $file->getDecorator('Field'); 
$options = $decorator->getOptions(); 
$options['id'] = 'field_' . $file->getId(); 
if ($file->hasErrors()) { 
    $options['class'] .= ' errors'; 
} 
$decorator->setOptions($options); 
1
$group->setDecorators(array(
    'FormElements', 
    array('HtmlTag', array('tag' => 'dl')), 
    'Fieldset', 
    array(array('ImageTag' => 'HtmlTag'), array('tag'=>'img', 'placement'=>'prepend', 'src'=>'/images/'.$imgs[$i-1]->im_name.'_main.jpg')) 
)); 

explination du manual: interne, Zend_Form_Element utilise comme mécanisme de recherche de classe d'un décorateur lors de la récupération des décorateurs. Par conséquent, vous ne pouvez pas enregistrer plusieurs décorateurs du même type; les décorateurs suivants écraseront simplement ceux qui existaient auparavant. Pour contourner ce problème, vous pouvez utiliser des alias. Au lieu de faire passer un décorateur ou nom décorateur comme premier argument à addDecorator(), passer un tableau avec un seul élément, à l'alias pointant sur l'objet décorateur ou nom:

// Alias to 'FooBar': 
$element->addDecorator(array('FooBar' => 'HtmlTag'), 
         array('tag' => 'div')); 

// And retrieve later: 
$decorator = $element->getDecorator('FooBar'); 

Dans les addDecorators() et setDecorators() méthodes, vous devrez passer l'option « décorateur » dans le tableau représentant le décorateur:

// Add two 'HtmlTag' decorators, aliasing one to 'FooBar': 
$element->addDecorators(
    array('HtmlTag', array('tag' => 'div')), 
    array(
     'decorator' => array('FooBar' => 'HtmlTag'), 
     'options' => array('tag' => 'dd') 
    ), 
); 

// And retrieve later: 
$htmlTag = $element->getDecorator('HtmlTag'); 
$fooBar = $element->getDecorator('FooBar'); 
+0

merci pour l'explication, il est logique mais malheureusement votre solution ne fonctionne pas :( – robjmills

+0

pour clarifier je me retrouve avec: forme> div> fieldset> dl La Div étant un wrapper autour du fieldset, c'est dans la position où je veux que l'image soit dans – robjmills

+0

je l'ai eu, il vous manquait une parenthèse: array (array ('ImageTag' => ' HtmlTag ', aurait dû être array (array (' ImageTag '=>' HtmlTag '), – robjmills

1

Merci beaucoup pour cette information! Je l'ai maintenant fonctionné aussi bien.

Ceci est le code complet php Pour votre information:

$generatePhraseVariations = new Zend_Form_Element_Checkbox('generatephrasevariations'); 
    $generatePhraseVariations->setLabel('Generate phrase variations') 
     ->setCheckedValue('yes') 
     ->setUncheckedValue('no') 
     ->setChecked(TRUE) 
     ->setDecorators($this->myCheckBoxElementDecorators); 
    $generateSpellingMistakes = new Zend_Form_Element_Checkbox('generatespellingmistakes'); 
    $generateSpellingMistakes->setLabel('Generate Spelling Mistakes') 
     ->setCheckedValue('yes') 
     ->setUncheckedValue('no') 
     ->setChecked(FALSE) 
     ->setDecorators($this->myCheckBoxElementDecorators); 
    $this->addElements(array($generatePhraseVariations,$generateSpellingMistakes)); 
    $this->addDisplayGroup( 
     array('generatephrasevariations','generatespellingmistakes'), 
     'rightpanel1'); 
    Zend_Registry::get('logger')->info($this->getDisplayGroup('rightpanel1')->getDecorators()); 
    $this->getDisplayGroup('rightpanel1') 
     ->setLegend('Features') 
     ->setDecorators(
      array(
       'FormElements', 
       array(array('Mijn-OL-HtmlTag'=>'HtmlTag'),array('tag'=>'ol')), 
       array('Fieldset'), 
       array(array('Mijn-DIV-HtmlTag'=>'HtmlTag'),array('tag'=>'div','id'=>'rightpanel1')), 
       ) 
     ); 
    Zend_Registry::get('logger')->info($this->getDisplayGroup('rightpanel1')->getDecorators()); 

/

Questions connexes