2013-10-12 84 views
0

我正在使用Bootstrap Form Builder的變體爲應用程序創建表單。每個表格都以HTML格式存儲在數據庫中(沒有<form>標籤,只是內部輸入)。稍後我通過將這些數據附加到列表中來將每個對象的表單代碼添加到列表中。從數據庫重新填充靜態HTML表單

foreach($object as $o) 
{ 
    $formHTML .= $o->form_html; 
} 

整個過程對於表單創建,編輯表單和使用這些表單收集數據非常有用。問題是,當使用這個表單數據來編輯一個對象時,我無法重新填充表單,因爲它的工作方式。

那麼,我該如何從數據庫中取出HTML代碼,將它與數據庫中保存的表單值配對並重新填充表單?我一直在考慮用JavaScript填充表單,但複選框,單選按鈕等將是一場噩夢。

有沒有辦法在json/xml/etc中存儲表單的表示形式,以便我可以重建表單本身?
格式將不得不支持給每個項目一個值屬性 - 我所看到的大部分「HTML表單到json」的東西都不支持這一點。

還有其他想法嗎?

+0

我不確定是否得到了它......例如,在數據庫中有一堆''標記。然後你把它全部抓起來,並相互追加一個,使表單HTML?你想能夠動態地添加/編輯一個'value'屬性嗎? – rmobis

回答

1

我認爲最好的辦法例如,對於電子郵件中的表單元素可以被存儲爲一個字符串(單引號,以防止插值)將其加載到DomDocument中。爲了提高性能,我更喜歡另一個解析器,但是您的表單生成器不兼容XHTML,所以我們無法將它作爲純XML處理。

DomDocument有一個功能loadHTML。只要它是有效的HTML,這並不介意一些未關閉的輸入字段。

$html = ''; 
foreach ($fields as $field) { 
    $domDocument = new DomDocument(); 
    $domDocument->loadHTML($field); 

    $html .= $domDocument->saveXML($domDocument->documentElement); 
} 

var_dump($html); 

現在我們有一個非常煩人的DomDocument功能。它會自動添加頭部和身體標籤。幸運的是其他一些智能傢伙也知道如何處理這個問題。 https://stackoverflow.com/a/6953808/2314708(謝謝你,亞歷克斯)

// remove <!DOCTYPE 
$domDocument->removeChild($domDocument->firstChild); 
// remove <html><body></body></html> 
$domDocument->replaceChild($domDocument->firstChild->firstChild->firstChild, $domDocument->firstChild); 

現在我們可以像操縱我們想要的元素:

// I am asuming there is only one element and that one element should be modified. if it is otherwise just use another selector. 
$element = $domDocument->documentElement; 
$element->appendChild(new DOMAttr("value", "someValue")); 

,當我們把所有的這一起,我們可以創造我們想要的東西。

//this would be in your DB or anywhere else. 
$fields = array(
    '<input id="test1">', 
    '<input id="test2">', 
    '<input id="test3" value="oldValue">', 
    '<input id="test4" value="oldValue">', 
); 

$values = array(
    "test1" => 123, // set a new integer value 
    "test2" => "just a text", // set a new string value 
    "test3" => "newValue", // override an existing value 
); 

$domDocument = new DomDocument(); 

$html = ''; 
foreach ($fields as $field) { 

    $domDocument->loadHTML($field); 
    // now we have a very annoying functionality of DomDocument. It automatically adds head and body tags. 
    // remove <!DOCTYPE 
    $domDocument->removeChild($domDocument->firstChild); 
    // remove <html><body></body></html> 
    $domDocument->replaceChild($domDocument->firstChild->firstChild->firstChild, $domDocument->firstChild); 

    $element = $domDocument->documentElement; 
    $elementId = $element->getAttribute('id'); 
    if (array_key_exists($elementId, $values)) { 
     // this adds an attribute or it overrides if it exists 
     $element->appendChild(new DOMAttr("value", $values[$elementId])); 
    } 
    $html .= $domDocument->saveXML($element); 
} 

var_dump($html); 

對於您的收音機/複選框,您可以使用其他方式選擇元素,當然也可以設置正確的類型。基本上,他們會像JS實現一樣,採取一些簡單的工作,除非您在服務器上執行操作時不會煩擾用戶的瀏覽器/系統。

+0

感謝您花時間把它們放在一起。看起來是最可行的解決方案。 –

-1

這樣做的一種方法是使用eval。但被警告eval是非常危險的。

http://php.net/manual/en/function.eval.php

比方說,你有你想要的,其值在從數據庫中加載的表單元素來填充的對象調用$用戶。當你的foreach循環

$element = '<input type=\"text\" name=\"email\" value=\"$email\">'; 

然後:

$email = "[email protected]"; 
... 
... 
... 
foreach($object as $o) { eval("\$formHTML .= \"$o->form_html\";"); } 
+0

不幸的是,他們當前沒有值 - 我需要爲每行添加一個值。即使他們有價值,它也不會是一個PHP變量,它將是空白的。 –

0

爲此,有一個非常好的項目名爲Alpaca。您可以從JSON文件加載結構,選項和數據。檢查this example