2012-03-22 5 views
0

私はカスタムフォームクラスを持ち、ベースをZend_Formに拡張し、フォーム自体と要素のデコレータも指定しています。フォーム要素のデフォルトクラス

そして、私は立ち往生しています - すべての入力要素に特定のHTMLクラスを追加するには?

私が考えることができるのはaddElement()をオーバーライドすることだけですが、もしあれば、より良い解決策が開かれています。

+0

'get_class_methods($ formObject)'を試して、あなたのリクエストに対処できる他のメソッドがあるかどうか確認しましたか? –

+0

@Mike Purcell:私は現在 'Zend_Form'ソースを見て、何が私を助けてくれるのか分かりません。 – zerkms

+0

「特定のクラス」とはどういう意味ですか? HTMLクラス属性? –

答えて

2

だけで、別の解決策のようなものです:あなたは、自動的に各要素に一意のクラスを割り当てる方法をしたいよう

class My_Form extends Zend_Form 
{ 
    public function render(Zend_View_Interface $view = null) 
    { 
     foreach ($this->getElements() as $element) { 
      $element->setAttrib('class', 'default'); 
     } 

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

if(!$ this - > _ getIsRendered()) 'このメソッドの本体の周りにいくつかのCPUを節約することができます – zerkms

0

HTMLクラスは、要素に属性を追加すると、この

$element->setAttrib('class', 'text'): 
or directly 
$element->class = 'text; 
+0

彼は500要素を持っている場合、これを手動で行う必要がありますか? –

+0

もし彼が500の要素を持っていて、すべて同じクラス名を持っているのであれば、確かにそうではありません。でも、最初にクラスを作る必要はありません。 –

+0

残念ながら、これは質問に答えません。私は**クラスを設定する方法を知っている**。そして、問題は "どのようにすべての入力要素に特定のHTMLクラスを追加するのか?"でした。自動的に – zerkms

1

が鳴ります。 b.b3rn4rdによって与えられた答えに拡大

、何かしてみてください:私はZend_Formのを継承ソリューションを好きではないので、私は別の方法を考案し

class My_Form extends Zend_Form 
{ 
    public function render(Zend_View_Interface $view = null) 
    { 
     foreach ($this->getElements() as $element) { 
      //assign the class as some unique identifier that is part of the element 
      //each element requires a unique name so it's a good place to start 
      $element->setAttrib('class', $element->getName()); 
     } 

     return parent::render($view); 
} 

}

+0

うん。個人的には、 'addEelement'をオーバーライドして、' class'が既に存在するかどうかをチェックしました。しかし、なぜ私がユニークなクラスが必要だと思うかは分かりません。 – zerkms

+0

@zerkmsは、あなたが正確に何を望んでいたかわからないので、私は刺すようにしました。あなたの解決策を見つけたらうれしいです。 – RockyFord

1

をこの。

<?php 

abstract class Application_Style 
{ 

    private $_object; 


    function __construct ($object = null) 
    { 
     if (isset ($object)) 
     { 
      $this->apply ($object); 
     } 
    } 


    function apply ($object) 
    { 
     $this->setObject ($object); 
     if ($this->filter()) 
     { 
      $this->onApply(); 
     } 

     return $object; 
    } 


    function __call ($method, $arguments) 
    { 
     return call_user_func_array (array (
      $this->getObject(), 
      $method 
     ), $arguments); 
    } 


    abstract protected function onApply(); 


    protected function filter() 
    { 
     return true; 
    } 


    function setObject ($_object) 
    { 
     $this->_object = $_object; 
    } 


    function getObject() 
    { 
     return $this->_object; 
    } 
} 




class Application_Style_ElementClass extends Application_Style 
{ 


    function onApply() 
    { 
     foreach ($this->getObject() 
      ->getElements() as $element) 
     { 
      $element->setOptions (array (
       'class' => 'test-class' 
      )); 
     } 
    } 


    function filter() 
    { 
     return $this->getObject() instanceof Zend_Form; 
    } 
} 


$form = new Zend_Form(); 
$form->addElement ('text', 'name'); 
new Application_Style_ElementClass ($form); // apply the class name 
echo $form; 

このようにして、任意のフォームに必要なすべてのスタイルを任意の順序で適用できます。

+0

おそらく、戦略パターンを実装したかったでしょう。すべての作業を行うコンストラクタは何か問題があります。さらに、私は '$ this-> getObject()'は過剰なものだと思います。1つの継承ツリー内では、プロパティへの直接の読み書きに間違いはありません。 – zerkms

+0

あなたはこれについてすべて正しいことができますが、これは青写真です。あなたがそれが気に入らなければ、ソリューションを完全に無視することができます。 – akond

+0

私は代わりとしてそれを好きです;-) – zerkms

関連する問題