Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库重新填充静态HTML表单_Php_Json_Forms_Laravel - Fatal编程技术网

Php 从数据库重新填充静态HTML表单

Php 从数据库重新填充静态HTML表单,php,json,forms,laravel,Php,Json,Forms,Laravel,我正在使用Bootstrap Form Builder的一个变体为应用程序创建表单。每个表单都以HTML形式存储在数据库中(没有标记,只有内部输入)。稍后,通过将每个对象的表单代码附加到列表中,我使用这些数据构建组合表单 foreach($object as $o) { $formHTML .= $o->form_html; } 整个过程对于表单创建、编辑表单以及使用这些表单收集数据非常有用。问题是,当使用此表单数据编辑对象时,由于其工作方式,我无法重新填充表单 那么,如何从数据库

我正在使用Bootstrap Form Builder的一个变体为应用程序创建表单。每个表单都以HTML形式存储在数据库中(没有
标记,只有内部输入)。稍后,通过将每个对象的表单代码附加到列表中,我使用这些数据构建组合表单

foreach($object as $o)
{
   $formHTML .= $o->form_html;
}
整个过程对于表单创建、编辑表单以及使用这些表单收集数据非常有用。问题是,当使用此表单数据编辑对象时,由于其工作方式,我无法重新填充表单

那么,如何从数据库中获取HTML代码,将其与数据库中保存的表单值配对并重新填充表单?我一直在考虑在表单加载后使用JavaScript填充表单,但复选框、单选按钮等将是一场噩梦

有没有一种方法可以将表单的表示形式存储在json/xml/etc中,这样我就可以重建表单本身了?
该格式必须支持为每个项赋予一个值属性——我看到的大多数“HTML表单到json”的内容都不支持这一点


还有其他想法吗

一种方法是使用eval。但要注意,评估是非常危险的

假设您有一个名为$user的对象,您希望在从数据库加载的表单元素中填充该对象的值。例如,电子邮件的表单元素可以存储为字符串(单引号以防止插入):


我认为最好的方法是将其加载到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功能。它会自动添加头部和身体标记。 幸运的是,其他一些聪明人知道如何处理这件事。 (谢谢亚历克斯)

当我们把所有这些放在一起,我们就能创造出我们想要的

//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);
//这将在数据库或其他任何地方。
$fields=数组(
'',
'',
'',
'',
);
$values=数组(
“test1”=>123,//设置一个新的整数值
“test2”=>“只是一个文本”,//设置一个新的字符串值
“test3”=>“newValue”,//覆盖现有值
);
$domDocument=新的domDocument();
$html='';
foreach($fields作为$field){
$domDocument->loadHTML($field);
//现在我们有一个非常烦人的DomDocument功能,它自动添加头部和身体标签。
//删除removeChild($domDocument->firstChild);
//除去
$domDocument->replaceChild($domDocument->firstChild->firstChild->firstChild,$domDocument->firstChild);
$element=$domDocument->documentElement;
$elementId=$element->getAttribute('id');
如果(数组\键\存在($elementId,$values)){
//这会添加一个属性,如果该属性存在,则会覆盖该属性
$element->appendChild(新的DOMAttr(“value”),$values[$elementId]);
}
$html.=$domDocument->saveXML($element);
}
变量转储($html);

对于收音机/复选框,您可以使用其他方式选择元素,当然也可以设置正确的类型。基本上,它们的工作方式与JS实现差不多,只是在服务器上执行时不会打扰用户的浏览器/系统。

为此,有一个非常不错的项目,名为。您可以从json文件加载结构、选项和数据。检查。

不幸的是,它们当前根本没有值-我需要为每行添加一个值。即使他们有一个值,它也不会是一个PHP变量,它会是空的。我不确定我是否得到了它。。。例如,在数据库中有一堆
标记。然后你抓住它,并将一个附加到另一个,使表单成为HTML?您希望能够动态添加/编辑它的
属性`?感谢您花时间将其组合在一起。看起来是最可行的解决方案。
$html = '';
foreach ($fields as $field) {
    $domDocument = new DomDocument();
    $domDocument->loadHTML($field);

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

var_dump($html);
// 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);