1

我正在使用以下装饰器渲染 zend 文件元素。

$decoratorFile = array
    (
        'File',
        'Errors',
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class'=>'elements')),
        array('Label', array('tag' => 'td')),       
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
    );

但我想创建一个像下面这样的自定义装饰器......

class My_Decorator_Td extends Zend_Form_Decorator_Abstract
{
    public function buildLabel()
    {
        $element = $this->getElement();
        $label = $element->getLabel();
        if ($translator = $element->getTranslator()) {
            $label = $translator->translate($label);
        }
        if ($element->isRequired()) {
            $label .= '*';
        }
        $label .= '';
        return $element->getView()
                       ->formLabel($element->getName(), $label);
    }

    public function buildInput()
    {
        $element = $this->getElement();
        $helper  = $element->helper;
        return $element->getView()->$helper(
            $element->getName(),
            $element->getValue(),
            $element->getAttribs(),
            $element->options
        );
    }

    public function buildErrors()
    {
        $element  = $this->getElement();
        $messages = $element->getMessages();
        if (empty($messages)) {
            return '';
        }

        list($key, $error) = each($messages);
        return '<div class="errors">' .
               $error . '</div>';
    }

    public function buildDescription()
    {
        $element = $this->getElement();
        $desc    = $element->getDescription();
        if (empty($desc)) {
            return '';
        }
        return '<div class="description">' . $desc . '</div>';
    }

    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 = '<tr>'
            . '<td class="labels">'
                . $label
                . '</td>'
                . '<td class="elements">'
                . $input
                . $desc
                . $errors
                . '</td>'
                . '</tr>';

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

我将这个用于文本元素。

如何为文件元素创建自定义装饰器装饰器。有什么帮助吗?

4

2 回答 2

1

您可以在此处找到问题的答案

于 2012-09-13T10:10:52.267 回答
0

我遇到了同样的问题,并提出了创建自定义装饰器的解决方案,该装饰器扩展了默认的 File 装饰器并覆盖了 render 方法以添加您的标记:

<?php

class My_Super_Custom_File_Decorator extends Zend_Form_Decorator_File
{
    public function render($content)
    {
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element) {
            return $content;
        }

        $view = $element->getView();
        if (!$view instanceof Zend_View_Interface) {
            return $content;
        }

        $name      = $element->getName();
        $attribs   = $this->getAttribs();
        if (!array_key_exists('id', $attribs)) {
            $attribs['id'] = $name;
        }

        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $markup    = array();
        $size      = $element->getMaxFileSize();
        if ($size > 0) {
            $element->setMaxFileSize(0);
            $markup[] = $view->formHidden('MAX_FILE_SIZE', $size);
        }

        if (Zend_File_Transfer_Adapter_Http::isApcAvailable()) {
            $markup[] = $view->formHidden(ini_get('apc.rfc1867_name'), uniqid(), array('id' => 'progress_key'));
        } else if (Zend_File_Transfer_Adapter_Http::isUploadProgressAvailable()) {
            $markup[] = $view->formHidden('UPLOAD_IDENTIFIER', uniqid(), array('id' => 'progress_key'));
        }

        if ($element->isArray()) {
            $name .= "[]";
            $count = $element->getMultiFile();
            for ($i = 0; $i < $count; ++$i) {
                $htmlAttribs        = $attribs;
                $htmlAttribs['id'] .= '-' . $i;
                $markup[] = $view->formFile($name, $htmlAttribs);
            }
        } else {
            $markup[] = $view->formFile($name, $attribs);
        }

        $markup = implode($separator, $markup);

        switch ($placement) {
            case self::PREPEND:
                return $markup . $separator . $content;
            case self::APPEND:
            default:
                return $content . $separator . '<div>My Super Custom Markup : '.$markup.'</div>';
        }
    }
}

您应该遵循基础知识来创建自定义装饰器(prefixPath 等)并将新装饰器应用于文件元素而不是“文件”。

于 2014-01-21T13:49:14.737 回答