2010-12-14 73 views
2

J'ai un objet Zend_Form que je souhaite réutiliser plusieurs fois sur une page. Le problème que j'ai est que chaque fois qu'il est rendu, il a les mêmes ID d'élément. J'ai été incapable de trouver une méthode pour donner à tous les identifiants un préfixe ou un suffixe unique chaque fois que je rends le formulaire.Zend Forms - Modification d'ID d'élément pour permettre la réutilisation


Solution complète

Sous Zend_Form:

class My_Form extends Zend_Form 
{ 
    protected $_idSuffix = null; 

    /** 
    * Set form and element ID suffix 
    * 
    * @param string $suffix 
    * @return My_Form 
    */ 
    public function setIdSuffix($suffix) 
    { 
     $this->_idSuffix = $suffix; 
     return $this; 
    } 

    /** 
    * Render form 
    * 
    * @param Zend_View_Interface $view 
    * @return string 
    */ 
    public function render(Zend_View_Interface $view = null) 
    { 
     if (!is_null($this->_idSuffix)) { 
      // form 
      $formId = $this->getId(); 
      if (0 < strlen($formId)) { 
       $this->setAttrib('id', $formId . '_' . $this->_idSuffix); 
      } 

      // elements 
      $elements = $this->getElements(); 
      foreach ($elements as $element) { 
       $element->setAttrib('id', $element->getId() . '_' . $this->_idSuffix); 
      } 
     } 

     return parent::render($view); 
    } 
} 

boucle dans le script de vue:

<?php foreach ($this->rows as $row) : ?> 
    <?php echo $this->form->setDefaults($row->toArray())->setIdSuffix($row->id); ?> 
<?php endforeach; ?> 

Répondre

2

Vous peut sous-classe Zend_Form et surcharge méthode render pour générer id de automatiquement:

public function render() 
{ 
    $elements = $this->getElements(); 
    foreach ($elements as $element) { 
     $element->setAttrib('id', $this->getName() . '_' . $element->getId(); 
    } 
} 

Ceci est juste un pseudo -code. Bien sûr, vous pouvez modifier cela en fonction de vos besoins.

+0

Je sous-classe déjà 'Zend_Form', donc cela semble être le chemin à parcourir. Merci! – Sonny

1

Vous pouvez ajouter une propriété entière statique (disons auto: : $ counter) à votre Zend_Form hérité classe. Vous l'incrémentez sur la méthode init(). Pour chaque élément que vous créez sur votre objet Zend_Form vous ajoutez cette propriété à votre élément:

$element->setAttrib('id', self::$counter + '_myId'); 
+0

C'est une excellente solution, mais j'instancie la classe une seule fois, puis je la restitue dans une boucle dans le script de vue. – Sonny