2013-01-11 24 views
0

我有一個Zend_Form的形式,一些自定義的裝飾,就像這樣:Zend_Form中呈現的所有字段爲文本

$decorators = array(); 
$decorators[] = new Zend_Form_Decorator_ViewHelper(array()); 
$decorators[] = new Zend_Form_Decorator_Errors; 
$decorators[] = new Zend_Form_Decorator_HtmlTag(array('tag' => 'div', 'class' => 'form-item')); 
$decorators[] = new Zend_Form_Decorator_Label(array('class' => 'form-label')); 
$decorators[] = new Zend_Form_Decorator_Callback(array(
    'callback' => function($content, $element, $options) { 
     return sprintf('<div class="form-row">%s</div>', $content); 
    }, 
    'placement' => false 
)); 
$this->setElementDecorators($decorators); 

的問題是,所有的字段都呈現爲文本輸入。爲什麼會發生?

編輯:我發現,它並不一定使所有的輸入爲文本輸入,但鍵入的形式第一個輸入的渲染他們。這裏是我使用的一個窗體的示例(裝飾器設置爲int parent的init):

<?php 

class Form_Users_Add extends Form_Base { 
    protected $pbxs = array(1 => 'Element 1', 2 => 'Element 2'); 

    public function init() { 
     $monitors = new Zend_Form_Element_Checkbox('prefered_screen_count'); 
     $monitors->setCheckedValue(2); 
     $monitors->setUncheckedValue(1); 
     $monitors->setLabel('two_monitors'); 
     $this->addElement($monitors); 

     $pbx = new Zend_Form_Element_Select('asterisk_id'); 
     $pbx->setMultiOptions($this->pbxs); 
     $pbx->setLabel('users_asterisk_id'); 
     $this->addElement($pbx); 

     parent::init(); 
    } 

} 
+1

你能顯示錶單代碼嗎?作爲一個側面的問題:爲什麼使用'回調'裝飾器的行?爲什麼不使用'HtmlTag',就像你爲物品本身做的一樣?只是好奇。 –

+0

我編輯了這個問題。我正在使用Callback,因爲我無法得到兩個HtmlTag的工作 - 可能我做錯了什麼,但他們只是被替換。 – Agares

+0

Aaah,在單個元素上使用同一個裝飾器類的多個實例是一種技巧:您需要別名裝飾器名稱。例如:array(array('my-item'=>'HtmlTag'),array('tag'=>'div','class'=>'some-class')),'。然後在該行的'HtmlTag'裝飾器上使用不同的別名 - 比如'my-row'。 –

回答

1

Yay!我已經解決了這個問題!原因是我使用了類的實例,而不是名稱。這樣每個元素都使用裝飾器的相同實例。

相關問題