2013-09-28 58 views
0

我創建使用集合標準的應用程序映射一對多的關係(不使用Doctrine)幾乎是在http://framework.zend.com/manual/2.2/en/modules/zend.form.collections.html所描述的方式和我有類似如下代碼:如何定製渲染ZF2集合匹配字段集

class Person { 
    protected $attrributes; 
} 

class Attribute { 
    protected $attr1; 
    protected $attr2; 
} 

我創建了AttributeFieldset和所需的配套AttributeForm,我已經在我的PersonForm加入AttributeFieldset

$this->add(
    array(
    'type' => 'Zend\Form\Element\Collection', 
    'name' => 'attributes', 
    'options' => array(
     'label' => _("Add person attribute"), 
     'count' => 1, 
     'should_create_template' => true, 
     'allow_add' => true, 
     'target_element' => array(
     'type' => 'Persons\Form\AttributesFormFieldset' 
    ) 
    ) 
)); 

呼喚g $this->formCollection()視圖助手將爲集合生成默認HTML,並根據文檔中指定的數據模板通過JavaScript動態添加新屬性。

然而,我想要完成的是有一個列表與人的所有現有屬性,編輯/刪除選項,並創建一個與收集fieldset模式窗口添加新屬性的人。

想象一下下面的HTML:

<a href="#" onclick="add(this); return false;">Add new attribute</a> 
<table> 
    <? foreach($this->person->attributes as $attribute): ?> 
    <tr> 
     <td><?= $attribute['attr1']; ?></td> 
     <td> 
     <a href="#" onclick="edit(this); return false">Edit</a> | <a href="#" onclick="delete(this); return false">Delete</a> 
     </td> 
    </tr> 
    <? endforeach; ?> 
</table> 

我知道我可以完全跳過的FormCollection和每行我添加到我的表有加<input type="hidden">標籤的方式ZF2系列希望他們(如attribute[0][attr1]等)動態創建的表單,但我猜測我會錯過ZF2 InputFilters。

有沒有更好的方式來做到這一點?有沒有人做過?

回答

1

使用集合,並要求自定義標記是煩人。但它並不難:

$collections = $form->get('collection-element'); 
echo '<table>' 
// render thead and tbody open if needed 
foreach ($collections as $col) : ?> 
    <tr> 
     <td><?php echo $this->formInput($col->get('input-from-collection-name'); ?></td> 
     <td><?php echo $this->formInput($col->get('other-input-from-collection-name'); ?></td> 
    </tr> 
<?php endforeach; 
echo '</table>'; 

就這麼簡單。這只是煩人的。此外,通過配置中的缺省示例:爲其他元素添加template的最簡單方法是僅渲染一次表單,然後複製生成的HTML,然後將其粘貼到數據模板中。

+0

你可能是正確的,雖然的FormCollection爲我們提供了強大的功能纔可以真正成爲一個痛苦的屁股。我認爲具有模板靜也,但它失去了不得不改變只在字段集的所有好處下劃線數據庫變更的情況 – mobius

+0

你好山姆,有什麼方法可以傳遞模板參數嗎?因爲我無法找到創建的模板。我需要用它來創建喜歡這裏http://framework.zend.com/manual/2.0/en/modules/zend.form.collections.html#adding-new-elements-dynamically –

+0

@MyselfMalay可悲的是附加字段沒有這樣的事。在這些場景中,我仍然發現自己只是簡單地覆蓋默認的FormRow/FormSelect/FormInput助手。這樣Fieldset渲染通常可以解決我的問題。另一種方法是使用FormSelect /的formInput,等等。沒有formRow然後添加模板標記自己與你的字段集的自定義HTML ......這很煩人,但是這也正是網絡的形式是:'( – Sam