域對象
取決於你想要的靈活性,你需要創建一個數,其將持有的用戶自定義表單數據的實體/域對象。
首先,表示表單元素的實體。我會創建Form
,Fieldsets
,Fields
和FieldTypes
。每個表單都有一個或多個字段集,每個字段集有一個或多個字段等。
我實際上在ZF2中構建了一個表單構建器,作爲我公司當前的項目,我開始使用可擴展用於所有表單的通用元素「元素」
/**
* Base form element that all form elements extend
*/
abstract class Element implements ElementInterface, AttributeCollectionAwareInterface
{
/**
* @var string
* @ODM\Id
*/
protected $id;
/**
* @var string
* @ODM\Field(type="string")
*/
protected $name;
/**
* @var string
* @ODM\Field(type="string")
*/
protected $label;
/**
* $attributes
*
* Map of form element attributes
*
* @var array
* @ODM\ReferenceMany(targetDocument="JobboardBase\Document\Form\Attribute")
*/
protected $attributes;
/**
* $options
*
* Map of form element options
*
* @var Doctrine\Common\Collections\Collection
* @ODM\ReferenceMany(targetDocument="JobboardBase\Document\Form\Option")
*/
protected $options;
/**
* @var status
*
* @ODM\ReferenceOne(targetDocument="JobboardBase\Document\Form\Status")
*/
protected $status;
/**
* $dateCreated
*
* The form creation date
*
* @var \MongoDate
* @Gedmo\Timestampable(on="create")
* @ODM\Field(type="date")
*/
protected $dateCreated;
/**
* $dateUpdated
*
* The form updated date
*
* @var \MongoDate
* @Gedmo\Timestampable(on="update")
* @ODM\Field(type="date")
*/
protected $dateUpdated;
這些實體應該有儘可能緊密地映射到Zend的現有Zend_Form_Element_*
類的屬性(如$attributes
,$name
,$options
等),這將幫助你時,你需要使它們在頁面上。
佔位符
大多數CMS系統都具有某種「佔位符」功能 - 在「頁面」被分解成若干個「位置」,如頁眉,頁腳,標題,內容等。同樣,這些「位置'可以被模擬爲用戶可編輯的實體,他們可以在其中將一個或多個「內容項目」分配給每個佔位符,例如您的表單。
基本思想實際上是一種基於多個其他視圖文件(類似於視圖部分)組合頁面視圖的方式,其中根據配置動態生成內容。
幸運的是,Zend Framework還提供了創建這種佔位符的能力。 Their documentation says:
查看佔位符是爲您的應用程序創建豐富佈局的簡單且強大的方法。您可以使用各種標準佔位符,例如(doctype(),headTitle(),headLink()和headScript()),或使用通用佔位符()助手來聚合內容並以自定義方式呈現它。
模板
佔位符可以幫助您找到在集領域的內容。但是,如果用戶希望直接在文本內容(您的ckeditor)內呈現表單,則此方法不起作用。
解決方案之一就是爲您的表單實現某種模板系統,其中將設置的文本模板放置在內容中。
例如:
「這是我的聯繫我們[表] [ID = 123] [NAME =接觸我們] [表]表格請填寫所有字段」
當您將渲染爲時,您將此模板替換爲實際的表單HTML。這種方法可以很好地工作,只要你在模板上有創意就可以確保沒有誤報,並且可能還有一些JS的「添加表單」按鈕來爲用戶創建模板文本。你