Класс Zend Framework в Custom Form Decorator - PullRequest
2 голосов
/ 27 марта 2012

Я использую декоратор нестандартной формы, найденный по адресу: http://code.google.com/p/digitalus-cms/source/browse/trunk/library/Digitalus/Form/Decorator/Composite.php?r=767

В нижней части файла (строка 70) находится:

 $output = '<div class="form_element">'
                . $label
                . $input
                . $errors
                . $desc
                . '</div>';

Я хотел бы сделать класс DIV динамическим и передаваться при создании элементов в моем контроллере. Любые встроенные функции ZEND, которые я использую, только изменяют LABEL или INPUT. Вот пример создания моего элемента:

$decorator = new Composite();

        $this->addElement('text', 'start', array(
            'label'      => 'Start Number',
            'required'   => true,
            'filters'    => array('StringTrim'),
            'validators' => array(
                'alnum',
            ),
            'decorators' => array($decorator)
        ));

Любые идеи будут очень признательны. Спасибо, что нашли время посмотреть!

1 Ответ

2 голосов
/ 27 марта 2012

Теперь убедитесь, почему все классы CSS жестко закодированы, если вам разрешено изменять этот текущий декоратор, просто исправьте метод render ():

class Digitalus_Form_Decorator_Composite
{
    /* ... */
    public function render($content)
    {
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element) {
            return $content;
        }
        if (null === $element->getView()) {
            return $content;
        }

        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $label     = $this->buildLabel();
        $input     = $this->buildInput();
        $errors    = $this->buildErrors();
        $desc      = $this->buildDescription();

        $output = '<div class="'.$this->getOption('class').'">'
                . $label
                . $input
                . $errors
                . $desc
                . '</div>';

        switch ($placement) {
            case (self::PREPEND):
                return $output . $separator . $content;
            case (self::APPEND):
            default:
                return $content . $separator . $output;
        }
    }
    /* ... */
}

А при создании элемента:

$element->setDecorators(array(
    /* ... */
    array(array('div'=>'Composite'), array('class' => 'my_class_name'))
    /* ... */
)));

Если вы не хотите редактировать существующий декоратор, просто расширьте его и переопределите метод render () ...

...