0

Bootstrap Form Builder のバリアントを使用して、アプリケーションのフォームを作成しています。各フォームは HTML としてデータベースに保存されます (<form>タグなし、内部入力のみ)。このデータを使用して、後で各オブジェクトのフォーム コードをリストに追加することにより、組み合わせたフォームを作成します。

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

このプロセス全体は、フォームの作成、フォームの編集、およびこれらのフォームを使用したデータの収集に最適です。問題は、オブジェクトを編集するためにこのフォーム データを使用する場合、この動作方法が原因でフォームを再作成できないことです。

では、データベースから HTML コードを取得し、それをデータベースに保存されているフォームの値とペアにして、フォームに再入力するにはどうすればよいでしょうか? JavaScript を使用してフォームの読み込み後にデータを入力することを検討してきましたが、チェックボックス、ラジオ ボタンなどは悪夢です。

フォーム自体を再構築できるように、フォームの表現を json/xml/etc に保存する方法はありますか?
フォーマットは、各アイテムに value 属性を与えることをサポートする必要があります-私が見た「HTMLフォームからjsonへ」のもののほとんどはこれをサポートしていません。

他のアイデアはありますか?

4

3 に答える 3

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 の非常に厄介な機能があります。head タグと body タグを自動的に追加します。幸いなことに、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);

ラジオ/チェックボックスの場合、要素を選択し、もちろん正しいタイプを設定する他の方法を使用できます。基本的に、サーバー上で実行するときにユーザーのブラウザー/システムに迷惑をかけないことを除いて、JS 実装と同じくらい多くの作業が必要です。

于 2013-10-30T10:36:02.580 に答える
0

このために、Alpacaという名前の本当に素晴らしいプロジェクトがあります。json ファイルから構造、オプション、およびデータをロードできます。この例を確認してください。

于 2014-10-26T16:49:50.207 に答える
-1

これを行う 1 つの方法は、eval を使用することです。ただし、eval は非常に危険であることに注意してください。

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

データベースからロードされたフォーム要素に値を入力したい $user というオブジェクトがあるとします。たとえば、電子メールのフォーム要素は文字列として保存できます (補間を防ぐために単一引用符で囲みます)。

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

そして、あなたのforeachループにいるとき:

$email = "me@example.com";
...
...
...
foreach($object as $o) { eval("\$formHTML .= \"$o->form_html\";"); }
于 2013-10-12T21:32:26.113 に答える