代码之家  ›  专栏  ›  技术社区  ›  Jurian Sluiman

更改复选框元素的装饰

  •  1
  • Jurian Sluiman  · 技术社区  · 14 年前

    我想改为显示复选框。默认情况下,是这样的:

    <dt><label>%name%</label></dt>
    <dd>%element% %error %description%</dd>
    

    我想要以下(有点像多检查箱):

    <dt>&nbsp;</dt>
    <dd><label>%element% %name</label> %error% %description%</dd>
    

    我超越了 Zend_Form_Element::loadDefaultDecorators() 具有 My_Form_Element_Checkbox::loadDefaultDecorators() 正在使用复选框。

    我做不到。我想换一些装修工的订单,但是 尤其是 &nbsp; 在里面 <dt> 似乎很难修复。我怎样才能做到这一点?

    $this->addDecorator('ViewHelper')
         ->addDecorator('Errors')
         ->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
         ->addDecorator('HtmlTag', array('tag' => 'dd',
                                         'id'  => $this->getName() . '-element'))
         ->addDecorator('Label', array('tag' => 'dt'));
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   Maxence    14 年前

    与许多decorator问题一样,要用空的dt作为前缀,可以用自定义decorator解决 AnyMarkup 允许在窗体中的任何位置插入任意标记。

    只需将标签替换为:

    ->addDecorator(
        'AnyMarkup', 
        array('markup' => '<dt>&nbsp;</dt>', 'placement' => 'prepend')
    )
    

    但是,为了将元素放入标签中,您必须编写一个自定义装饰器。类似这样的东西(未测试):

    class My_Decorator extends Zend_Form_Decorator_Abstract {     
        public function render($content) {
            return '<label>' . $content . $this->getElement()->getLabel() 
                . '</label>';
        } 
    }
    
        2
  •  0
  •   Sebastian Hoitz    14 年前

    文件App/Form/Element/Checkbox.php

    <?php
    
    class App_Form_Element_Checkbox extends Zend_Form_Element_Checkbox
    {
    
     public function loadDefaultDecorators()
     {
      if ($this->loadDefaultDecoratorsIsDisabled())
      {
       return $this;
      }
    
      $this->addPrefixPath("App_Form_Decorator", "App/Form/Decorator", "decorator");
    
      $getId = create_function('$decorator',
              'return $decorator->getElement()->getId()
                                                 . "-element";');
      $this->addDecorator('ViewHelper')
          ->addDecorator('Errors')
          ->addDecorator('Checkbox')
          ->addDecorator('Description', array('tag' => 'p', 'class' => 'description', "placement" => "prepend"))
          ->addDecorator('HtmlTag', array('tag' => 'dd', 'id' => array('callback' => $getId)))
          ->addDecorator('AnyMarkup', array('markup' => '<dt id="'.$this->getId().'-label">&nbsp;</dt>', 'placement' => 'prepend'));
    
      return $this;
     }
    }
    

    文件App/Form/decorapr/Checkbox.php

    <?php
    
    class App_Form_Decorator_Checkbox extends Zend_Form_Decorator_Abstract
    {
    
     public function render($content)
     {
      return '<label for="'.$this->getElement()->getId().'">' . $content . ' ' . $this->getElement()->getLabel()
      . '</label>';
     }
    }
    

    <?php
    
    class App_Form_Decorator_AnyMarkup extends Zend_Form_Decorator_Abstract
    {
    
     public function render($content)
     {
      $placement = $this->getPlacement();
      $separator = $this->getSeparator();
      switch ($placement)
      {
       case self::PREPEND:
        return $this->_options['markup'] . $separator . $content;
       case self::APPEND:
       default:
        return $content . $separator . $this->_options['markup'];
      }
     }
    }