2010-12-14 6 views
2

Ich habe ein Objekt, das ich mehrmals auf einer Seite verwenden möchte. Das Problem, das ich habe, ist, dass es jedes Mal, wenn es gerendert wird, die gleichen Element-IDs hat. Ich habe keine Methode gefunden, um bei jedem Rendern des Formulars allen IDs ein eindeutiges Präfix oder Suffix zu geben.Zend Forms - Element-ID-Änderung für die Wiederverwendung


Komplettlösung

Subclass 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); 
    } 
} 

Schleife im View Skript:

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

Antwort

2

Sie Zend_Form und Überlastung render Methode kann eine Unterklasse-IDs automatisch zu generieren:

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

Dies ist nur ein Pseudo -Code. Natürlich können Sie dies an Ihre Bedürfnisse anpassen.

+0

Ich habe bereits eine Unterklasse von 'Zend_Form', also klingt das nach dem Weg. Vielen Dank! – Sonny

1

Sie könnten eine statische Integer-Eigenschaft hinzufügen (lassen Sie uns selbst sagen: : $ counter) zu deinem Zend_Form geerbt Klasse. Sie erhöhen es bei der Methode init(). Für jedes Element, das Sie auf Ihrem Zend_Form Objekt erstellen anhängen Sie diese Eigenschaft zu Ihrem Element:

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

Das ist eine großartige Lösung, aber ich bin nur instanziieren die Klasse einmal, und dann Rendern in einer Schleife in der Ansicht Skript. – Sonny