1

當然,我並不想改變圖書館/ Zend的。 我知道我可以創建擴展Zend_Form並設置自定義裝飾器的類My_Form。比,各種形式的擴展新類My_Form ...在全局應用程序級別更改默認Zend Form裝飾器?

有什麼辦法來設置的Zend表單裝飾(更改默認飾)在某些插件或引導,在不改變現有的形式?

或者說,什麼是覆蓋默認的形式裝飾於所有形式的最佳方式?

回答

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 2012-02-08 14:43:36

+0

是的,完全正確。一個字符串。 – akond 2012-02-08 15:48:59

+0

好的,這是很好的做法,但不能幫助我解決問題,謝謝回答+1,但我無法接受此答案。 – tasmaniski 2012-02-09 11:59:42

0

很多都試過了,沒有我知道的成功又未擴展了Zend_form。有關次優解決方案,請參見thisthis

0

我有一個解決方案。你可以在bootsrap中定義裝飾器。

例如: -

$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更好嗎?更不用說@akond的解決方案,它似乎與OP所期望的最接近。 – bububaba 2012-02-08 13:50:25

+0

@bububaba實際上你可以使用setDecorators()來設置整個表單的裝飾器。爲了實際覆蓋全局的默認表單裝飾器,他需要擴展Zend_Form,因爲它被設計爲...;) – RockyFord 2012-02-08 17:29:09

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 

裝飾會用這個名字的最後一部分被加載。