1

Конечно, я не хочу менять библиотеку/Zend. Я знаю, что могу создать класс My_Form, который расширяет Zend_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

У меня есть одно решение. Вы можете определить декораторы в 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

Таким образом, вам нужно изменить строку '1' в каждой из форм' n' в вашем приложении, но 'm' lines (для каждого элемента), умноженное на формы' n'. Как это лучше, чем расширение «Zend_Form»? Не говоря уже о решении от @akond, который, кажется, ближе всего к тому, что хотел OP. – 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 

декоратор будет загружен последней части этого имени.

Смежные вопросы