2013-10-12 3 views
0

Я использую вариант Bustrap Form Builder для создания форм для приложения. Каждая форма хранится в базе данных как HTML (без тегов <form>, только внутренние входы). Я использую эти данные для создания комбинированных форм позже, добавив код формы каждого объекта в список.Репопуляция статической HTML-формы из базы данных

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

Весь этот процесс отлично подходит для создания форм, редактирования форм и использования этих форм для сбора данных. Проблема в том, что при использовании данных этой формы для редактирования объекта я не могу повторно заполнить форму из-за того, как это работает.

Итак, как я могу взять HTML-код из базы данных, сопоставить его с сохраненными значениями формы в базе данных и повторно заполнить форму? Я рассматривал возможность использования JavaScript для заполнения формы после загрузки, но Checkboxes, Radio buttons и т. Д. Будет кошмаром.

Есть ли способ сохранить представление формы в json/xml/etc, чтобы я мог перестроить форму?
Формат должен поддерживать предоставление каждому элементу атрибута value - большая часть «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. Он автоматически добавляет теги головы и тела. К счастью, некоторые другие умные парни на SO знают, как с этим бороться. 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); 

для радио/флажков вы можете использовать другие способы выбора элемента и, конечно, установить правильный тип. В основном, они будут восприниматься как работа mutch как реализация JS, за исключением того, что вы не раздражаете браузер пользователя/систему, когда делаете это на сервере.

+0

Спасибо, что нашли время, чтобы собрать это вместе. Похоже, самое эффективное решение. –

-1

Один из способов сделать это - использовать eval. Но будьте осторожны, eval очень опасен.

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

Допустим, у вас есть объект $ пользователя, значения которого вы хотите быть заполнены в виде элементов, загруженных из базы данных. Например, элемент формы для электронной почты может храниться в виде строки (одинарные кавычки, чтобы предотвратить интерполирования):

$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.

Смежные вопросы