1

もちろん、私はライブラリ/ Zendを変更したくありません。 Zend_Formを拡張してカスタムデコレータをセットアップするMy_Formクラスを作成できることは知っています。すべてのフォームが新しいクラスMy_Formを拡張します...グローバルアプリケーションレベルでデフォルトのZend Form Decoratorを変更しますか?

既存のフォームを変更せずに、プラグインまたはブートストラップでZend Form Decorator(デフォルトの装飾を変更)を設定する方法はありますか?

または、すべてのフォームのデフォルトのフォームデコレータをオーバーライドするにはどうすればよいでしょうか?

答えて

3

私の回答が助けになるかどうかはわかりませんが、ここには行きます。 フォーム自体を編集することなくZFデコレータを独自のデコレータに置き換える方法があります。

溶液#1:

方法はhereを記載しました。またはショートで:

のは、フォーム持っているとしましょう:

class Form extends Zend_Form 
{ 
    function init() 
    { 
     $this->addElement ('text', 'a', array (
      'label' => 'Name' 
     )); 
    } 
} 

その後のapplication.ini

に持って
resources.view.helperPath.Default_View_Helper = APPLICATION_PATH "/views/helpers" 

新しいファイルアプリケーションを追加/ビュー/ヘルパー/ FormText.phpを

class Default_View_Helper_FormText extends Zend_Form_Decorator_Abstract 
{ 
    function formText() 
    { 
     return 'It is I.'; 
    } 
} 

これだけです。

溶液#2:

のは、この抽象クラスを持ってみましょう:その後、

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_AdminForm extends Application_Style 
{ 
    function onApply() 
    { 
      $this->addElement ($submit = new Zend_Form_Element_Submit ('submit', array(
      'label' => 'Submit', 
      ))); 

      $submit 
      ->removeDecorator ('DtDdWrapper') 
      ->addDecorator ('HtmlTag', array (
      'placement' => Zend_Form_Decorator_HtmlTag::PREPEND, 
      'tag' => 'p', 
      'openOnly' => 1, 
      )) 
      ->addDecorator ('Custom', array ('text' => '     ')) 
      ; 
     } 
} 

onApply()メソッドには、あなたに合ったものを使用できます。デコレータの追加や削除など。そして、あなたはこのようなあなたの形にこのスタイルを呼び出すことができます。

new Application_Style_AdminForm ($this); 

フォーム表現を操作することができますが、それを直接変更せずにいます。

+0

これは良い解決策のようです。したがって、formText()メソッドは文字列型を返します。その文字列はフォーム上の各テキストフィールドを置き換えます。そして、 ''または同様の文字列を返す必要があります。私は型Zend_Form_Element_Textを返すことはできません.. – tasmaniski

+0

はい、まさに正しいです。文字列。 – akond

+0

これは良い習慣ですが、私の問題では役に立ちません。回答+1に感謝しますが、この回答を受け入れることはできません。 – tasmaniski

0

私が知っていることは、Zend_Formを拡張せずに成功したことはありませんでした。準最適解については、thisおよびthisを参照してください。

0

私には1つの解決策があります。ブートストラップでデコレータを定義できます。

例: -

$textDecorator = array(
       array('ViewHelper', 
        array('helper' => 'formText') 
       ), 
       array('Label', 
        array('class' => 'label') 
       ), 
       array('HtmlTag', 
        array('tag' => 'div', 'class' => 'formfield clearfix') 
       ) 
      ); 

Zend_Registry::set('text_dec', $textDecoration); 

今、あなたはすべてのフォームのテキストフィールドのためにそれを使用することができます。

例: -

class TestForm extends Zend_Form 
{ 
    function init() 
    { 
     $this->addElement ('text', 'a', array (
      'label' => 'Name', 
      'decorator' => Zend_Registry::get('text_dec') 
     )); 
    } 
} 

だから、あなたは、このいずれかを形成するいくつかのグローバルなデコレータを使用することができます。

+0

このようにして、あなたのアプリでは 'n 'の各フォームで' 1'の行を変更する必要がありますが、 'm'行には(要素ごとに)' n'の形式があります。 'Zend_Form'を拡張するよりも、どのように優れていますか? OPが望んでいたものに最も近いと思われる@akondによる解決策はもちろん。 – bububaba

+0

@bububaba実際には、変数を使用してsetDecorators()を使用してフォーム全体のデコレータを設定できます。既定のフォームデコレータをグローバルにオーバーライドするには、Zend_Formを拡張する必要があります。 – RockyFord

0

ここでは完全な解決策です。 「.INI」ファイル内のデコレータのための

設定フォルダ:

; folder with custom decorators will be loaded for FormElements 
form.elementPrefixPath.decorator.prefix = "Application_Form_Decorator" 
form.elementPrefixPath.decorator.path = "Application/Form/Decorator/" 
form.elementPrefixPath.decorator.type = "decorator" 

; folder with custom decorators will be loaded for Forms 
form.prefixPath.decorator.prefix = "Application_Form_Decorator" 
form.prefixPath.decorator.path = "Application/Form/Decorator/" 
form.prefixPath.decorator.type = "decorator" 

次に、デフォルトのデコレータを上書きするためにあなたのデコレータため同じ名前を使用します。例えば 、デフォルトの「DtDdWrapper」デコレータを置換する、 あなたがApplication_Form_Decorator_DtDdWrapperを使用することができます。

class Application_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper 

デコレータは、その名前の最後の部分によってロードされます。

関連する問題