Изменить Zend Form Decorator по умолчанию на глобальном уровне приложения? - PullRequest
1 голос
/ 08 февраля 2012

Конечно, я не хочу менять библиотеку / Zend. Я знаю, что могу создать класс My_Form, который расширяет Zend_Form, и настроить собственный декоратор. Чем каждая форма расширяет новый класс My_Form ...

Есть ли способ установить Zend Form Decorator (изменить оформление по умолчанию) в каком-либо плагине или загрузчике без изменения существующих форм ??

Или, каков наилучший способ переопределить декоратор форм по умолчанию для всех форм?

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Я не уверен, поможет ли мой ответ, но вот, пожалуйста.Есть способ замены ZF-декораторов вашими собственными декораторами без редактирования самих форм.

РЕШЕНИЕ № 1:

Метод, описанный здесь ,Или вкратце:

Допустим, у вас есть форма:

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"

Добавьте новый файл application / 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 голосов
/ 17 июля 2014

Вот полное решение.

Установите папки для ваших декораторов в файле .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

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

0 голосов
/ 08 февраля 2012

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

Многие пытались, но ни один из тех, о которых я знаю, не смог сделать это без расширения Zend_Form.См. это и это для неоптимальных решений.

...