2012-03-20 14 views
3

私は複数のフォームを持つページを持っています。いくつかのフォームはCustomerIDのような同じ名前の要素を共有しています。これは、要素IDが他のフォームの同じIDと衝突することを意味します。フィールド名の前にフォームの名前を付けるきれいな方法を見つけたいと思います。たとえばPaymentProfile_CustomerIDです。提案?Zend_Formの要素名に接頭辞を付ける方法はありますか?

はこれまでのところ、私が思い付くことができた最高のがある:以下

class MyForm extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setName("PaymentProfile"); 
     ... 
     $this->_prefixElementNames(); 
    } 

    private function _prefixElementNames() 
    { 
     $elements = $this->getElements(); 
     $formName = $this->getName(); 

     foreach($elements as $e) { 
      $e->setAttrib('id', $formName . '_' . $e->getName()); 
     } 
    } 
} 

UPDATEする@ガーベイの答えは簡単な変更でうまく働きました。

public function addElement($element, $name = null, $options = null) 
{ 
    $e = parent::addElement($element, $name, $options); 
    if($this->getName()) 
     // I use setAttrib instead of setName because I only want the ID to be changed. 
     // Didn't want the form data to be prefixed, just the unique HTML identifier. 
     $element->setAttrib('id', $this->getName() . '_' . $element->getName()); 
    return $e; 
} 

答えて

3

私はそれだけでelementsBelongToを使用する方が簡単だと思う:

public function init() 
{ 
    $this->setOptions(array(
     'elementsBelongTo' => 'form_name' 
    )); 
} 

編集し、私は最善の方法は次のようにZend_Formのクラスを拡張することだと思います:今後の使用のために拡張

["form_name"] => array(
    ["element1"] => "value1" 
    ["element2"] => "value2" 
) 
+0

私は見て、それが何を参照してください。ありがとう! – David

+0

これは私がやろうとしていたことを達成する最も正しい方法のようです。ありがとうございました。 – David

+0

そのような短い答えの前に申し訳ありませんが、以前はあまり時間がありませんでしたが、私はそれが十分であることがわかりました:]。私は将来の参照のために私の答えを拡大した。 – vandalizmo

2

私はあなたの問題を調査しました。

class Cubique_Form extends Zend_Form 
{ 
    public function addElement($el) 
    { 
     $el->setName($this->getName() . '_' . $el->getName()); 
     parent::addElement($el); 
    } 
} 

とフォーム作成:

$form = new Cubique_Form(); 
$form->setName('form'); 
$el = new Zend_Form_Element_Text('element'); 
$form->addElement($el); 
+0

私は目的を達成するための方法の例を追加しましたが、私はもっと自分の道を好きだと思う:0 elementsBelongToを使用すると、

Zend_Debug::dump($this->_getAllParams()) 

出力を得ることができますので、アレイ内のすべてのフォーム要素をラップ。 – David

+0

私はあなたの例にいくつかの変更を加える必要がありましたが、うまくいきました、ありがとう! – David

関連する問題