代码之家  ›  专栏  ›  技术社区  ›  Ashwini Agarwal

Zend文件元素的自定义装饰器

  •  1
  • Ashwini Agarwal  · 技术社区  · 12 年前

    我正在使用以下装饰器渲染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;
            }
        }
    }
    

    我将这个用于文本元素。

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

    2 回复  |  直到 12 年前
        1
  •  1
  •   akond    12 年前

    你可以找到问题的答案 here

        2
  •  0
  •   LoicUV    10 年前

    我也遇到了同样的问题,并提出了创建一个自定义装饰器的解决方案,该装饰器扩展了默认的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等),并将新的装饰器应用于您的文件元素,而不是“file”。