2009-06-11 62 views
2

我想用標籤包裝形式元素,例如在Zend Framework中,如何使用裝飾器在標籤中包裝表單元素?

<label for="email">E-mail <input type="text" name="email" id="email" /></label> 

我能找到的唯一的選擇就是改變位置;但它只接受'前置'和'追加':

<!-- prepend --> 
<label for="email">E-mail</label> <input type="text" name="email" id="email" /> 
<!-- append --> 
<input type="text" name="email" id="email" /> <label for="email">E-mail</label> 

這不是我所追求的。我可以改變Zend_Form_Decorator_Label類,但這是最後一種選擇。

回答

5

這似乎不可能不幸,你可能不得不寫一個自定義裝飾器。不過,它應該很簡單。

請注意,我只是要在這裏寫這篇文章,它是未經測試,但基於掀起另一裝飾所以它應該很少/沒有修改工作

class Your_Form_Decorator_Date extends Zend_Form_Decorator_Abstract { 
    public function render($content) { 
     $element = $this->getElement(); 

     $name = $element->getFullyQualifiedName(); 
     return '<label for="'.$name.'">'. $element->getLabel() . ' '.$content.'</label>'; 

    } 
} 

現在,如果你添加正確的前綴爲您的形式。

$this->addPrefixPath('Your_Form', 'Your/Form/'); 

您應該可以使用它將您的輸入(FormElement裝飾器)包裝到標籤標籤中。

對不起,我沒有機會真正測試這個,但給了我的其他裝飾工作。應該沒問題。

編輯:謝謝指出標籤文本不呈現gnarf。這現在已經修復。

+0

您忘記在「返回」中爲$元素渲染標籤文本 – gnarf 2009-06-11 03:57:49

0

我總是發現裝飾器在任何給定的情況下都被過度工程化,它有點失敗了將表示層與業務邏輯分開的目的。您可以使用Zend的部分助手或使用Zend_Form或兩者的組合來創建您自己的小部件,這將使您對演示文稿有更多的控制。

在一些XHTML參考站點上,雖然文本和任何內聯元素都應該有效,但它們不會將輸入元素列爲標籤的有效子元素。這可能是不允許的另一個原因。

0

我想你不應該使用它;)這是因爲標籤的內容是對該字段的描述。將元素包含在描述中是無稽之談。如果你需要,你可以將它們都包裝成div或類似的東西。

只有原因正在寫的不好CSSS :)

0

我假設你想要的標籤排隊旁邊的元素。

$email = new Zend_Form_Element_Text('email'); 
$email->setLabel('Email: '); 
$form = new Zend_Form(); 
$form->addElement($email); 

現在,將呈現形式等

<label>Email:</label> 
     <input type="text"/> 

爲了讓旁邊的標籤的文本框,你需要渲染的「標籤」裝飾分別。要做到這一點:

我在控制器中創建一個表單,在視圖中它分配給一個變量:

//in controller 
$this->view->form = $form; 

//in view script 
$form = $this->form; 

//('tag', null) tells the renderer not to wrap the label in the usual <dt> tag, 
//but not to use anything at all 
$form->getElement('email')->getDecorator('label')->setOption('tag', null); 

,然後在您的視圖腳本...

<?php print($form->email) ?> 

這將將文本元素渲染到自己的標籤旁邊

相關問題