2010-11-02 58 views
1

我想要更改爲複選框的呈現。默認情況下,它是這樣的:更改複選框元素的裝飾

<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()所以這適用於所有 複選框正在使用。

我不能得到這個工作。我試圖交換一些裝飾器的順序,但是 尤其如此。 <dt>內的&nbsp;似乎很難解決。我怎樣才能做到這一點?

BTW,默認情況下鏈是這樣的:

$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')); 
+0

你可以爲此寫一個自定義裝飾器。請參閱我在這裏給出的文章列表:http://stackoverflow.com/questions/3870955/zend-dt-dd-decorators-what-do-i-lose-by-removing-them/3871060#3871060 – Gordon 2010-11-02 11:48:29

+0

點我想保留'

/
'結構。據我所見,標籤可以通過Zend_Form_Decorator_Label,Zend_Form_Decorator_ViewHelper的輸入元素,Zend_Form_Decorator_Description的描述和Zend_Form_Decorator_Errors的錯誤來呈現。因此只有裝飾器的另一個命令應該足夠了。但糾正我,如果我錯了:) – 2010-11-02 12:42:09

+0

看看Matthew的演示文稿*利用Zend Framework裝飾器* – takeshin 2010-11-02 12:42:44

回答

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>'; 
    } 
} 
+0

謝謝,我一直在尋找這! Atm我通過使用兩個HtmlTag裝飾器(因此在'

'中沒有' ')並使用普通標籤裝飾器(因此它變成了'
0

在你想知道的情況下,這是我想出了:

文件app /表格/元/ 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 /表格/ 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 /表格/裝飾/ 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']; 
    } 
} 
}