2010-12-14 6 views
2

私はZend_Formオブジェクトを1ページに何度も再利用したいと思っています。私が抱えている問題は、レンダリングされるたびに同じ要素IDを持つことです。フォームをレンダリングするたびに、すべてのIDに一意の接頭辞または接尾辞を付ける方法を見つけることができませんでした。Zendフォーム - 再利用を可能にする要素IDの変更


完全なソリューション

サブクラス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); 
    } 
} 

ループビュースクリプトで:

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

答えて

2

あなたは自動的にIDのを生成するためにZend_Formの過負荷render方法をサブクラスがあります:あなたがあなたの要素にそのプロパティを追加し、あなたのZend_Formのオブジェクト上で作成する各要素について

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

これは単なる疑似です-コード。もちろん、必要に応じてこれを変更することができます。

+0

私はすでに 'Zend_Form'をサブクラス化しているので、これはやり方のように聞こえます。ありがとう! – Sonny

1

あなたは、静的な整数プロパティを追加することができます(のは自己を言わせて: :$ counter)をあなたのZend_Formに継承しますクラス。 init()メソッドでインクリメントします。

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

これはすばらしい解決策ですが、クラスを一度インスタンス化してから、ビュースクリプトのループ内でレンダリングしています。 – Sonny

関連する問題