2013-09-30 49 views
1

美好的一天,在Zend中爲CMS創建表單構建器?

我創建了一個CMS顯示網頁,但是我現在看到的是,用戶希望能夠插入custom forms與他們所選擇的領域。

我想form fields應該被添加到鏈接到forms表的fields表。諸如字段數據類型和驗證之類的事情,以及信息是否應存儲在數據庫中或發送給表單的電子郵件地址將被存儲,然後用於在CMS的前端生成表單。

現在用於在頁面中顯示實際表格... 用戶將如何設置字段應位於內容中的位置?我現在所擁有的全部是text editor (ckeditor),用戶可以在其中更改顯示的內容...他們如何告訴CMS在該特定頁面中放置表單以及CMS如何知道將表單添加到特定頁面?

你有什麼建議嗎?

感謝

回答

0

簡單的方法:
分手了所有不同的HTML節點像單選按鈕,複選框,選擇,文件,文本區域,並輸入基本的PHP對象。 爲它們分別提供一些驗證,如輸入的整數。使用內置的表示將它們傳遞給構造類的表單。

困難的方式:
另一種方法是通過邏輯分割提供的數據,以便列表,文本,文件和一個選項。 文本可以有多個子類型整數,浮動,日期電子郵件,你喜歡什麼(PHP的正則表達式驗證器是非常好的)。同樣對於一些你可能存儲可用的選擇或某個域,...。

對於其中的某些類型,你有不同的選擇,使它們在你的網站的,即一個列表可以是多個輸入元素,一個textarea的一個分隔符,或只是一個多選擇框。
所以你可以打算從它們表示的數據類型中進行獨立的,這意味着你需要爲這些基本數據類型(適配器)呈現HTML的類。

這些適配器將獲得一個數據類型對象的構造,呈現某種形式的對象調用了HTML,比轉換數據並將其發送到數據類型。然後這些將驗證它們並將它們存儲在數據庫中或其他任何地方。

我認爲最複雜的部分將用JavaScript驗證一起把這個,把你可能只是啓用此爲某些適配器和數據類型。

0

由於@ mjb4表示您可以創建自己的表單類。該類可以添加新的表單元素,並且每個表單元素都是該類內的對象。我自己做了這個,非常方便。

PHP

本身是保存在數據庫中,可以通過表單類加載的形式。它爲每個表單元素啓動相應的類。然後,您可以更改個別表單屬性。您也可以添加新的表單元素或刪除一些。

隨着$html = $form->getHTML();你可以抓住的HTML的方法。什麼是簡單的遍歷所有的表單元素對象並調用它們的getHTML方法。

發送表單時,再次使用該類進行驗證。它遍歷所有表單元素並調用其validateMe方法。每個對象都知道表單元素具有哪個名稱,並在$_REQUEST陣列中查找它。

jQuery的CMS側

您可以使用jQuery來創建一個表單創建者和保存表單方案到數據庫中。爲用戶提供兩個選項來保存表單數據。一:發送表單數據。二:創建新的數據庫表並插入具有唯一ID的數據。在給出選項二時,還應該有一個報告創建者創建一個顯示錶單數據的頁面(公共或私人)。

另外你應該把html結構留給你php類。用戶不需要改變它。只需爲他們的女巫造型創建一個模板。

0

域對象

取決於你想要的靈活性,你需要創建一個數,其將持有的用戶自定義表單數據的實體/域對象。

首先,表示表單元素的實體。我會創建Form,Fieldsets,FieldsFieldTypes。每個表單都有一個或多個字段集,每個字段集有一個或多個字段等。

我實際上在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的「添加表單」按鈕來爲用戶創建模板文本。你

0

一個可能的解決方案:

各自形成你的客戶會創建將有一個唯一的名稱或ID。

他們將使用CMS來編輯頁面的內容。他們會在他們希望出現的地方放置一個唯一的代碼(商定的格式)。

ex。

##FORM_CONTINER_CONTACT_US## // in this case the form is contact us based on ##FORM_CONTINER_XXXX## where XXX could be string or Id. 

頁的內容是從數據庫中抽取後,你把它傳遞給新的功能

public function insertFormContiner($pageContetnt) 
{ 
    // find the form container in $pageContent use regular expression to find it 
    // get the unique name of the form container CONTACT_US in this case 
    // build the form from the database (get the full html) 
    // replace the new created from with ##FORM_CONTINER_CONTACT_US## in this case 

    // view the finale content of the page 
    return $pageContent; 
} 

注意:您將需要建立其他功能(S)來處理在提交表單。