更改复选框元素的装饰

时间:2010-11-02 11:43:29

标签: php zend-framework

我想更改为复选框的渲染。默认情况下,就是这样:

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

我想要以下内容(有点像multiCheckbox):

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

我用{覆盖Zend_Form_Element::loadDefaultDecorators() My_Form_Element_Checkbox::loadDefaultDecorators()所以这适用于所有人 正在使用的复选框。

我不能让这个工作。我试图交换一些装饰器的顺序,但是 ESP。 &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 个答案:

答案 0 :(得分:1)

要使用空dt前置,就像许多装饰器问题一样,可以使用像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>';
    } 
}

答案 1 :(得分:0)

如果你想知道,这就是我提出的:

文件应用/表格/元素/ 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 / Decoratpr / 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>';
 }
}

文件App / Form / Decorator / AnyMarkup.php

<?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'];
  }
 }
}