1

基本的なフォームジェネレーターを作成しようとしています。したがって、ユーザーは、ある種の CMS システムで HTML フォームをクリックすることができます。このためのデータベース設計についてはまだ検討中ですが、チェックボックスに関しては質問があります。

私のデータベース設計は次のようになります。

田畑

pk_field_id | field_type | field_name   | default_value
1           | textfield  | text1        | Some default value
2           | textfield  | text2        | NULL
3           | radio      | radio1       | NULL
4           | checkbox   | check1       | NULL

それが基本的に、選択したフィールドを保存する方法です。このテーブルを読むと、switchステートメントを実行してfield_type値を読み取ることができるので、レンダリングするフィールドの種類がわかります。

しかし、それだけではありません。ラジオボタンのようなグループ化された要素が持つことができる「値」を含むテーブルもあります。

フィールド値:

fk_field_id | label    | value
3           | Radio 1  | radio1
3           | Radio 2  | radio2
4           | Check 1  | check1
4           | Check 2  | check2

だから今、私はテーブルを読むとき、私はテーブルを読むことfieldsができます。そうすれば、どのオプションが に属し、何が に属しているかがわかります。これはすべてうまくいっているようです。JOINfieldvaluesradiocheckbox

今、トリッキーな部分です。フォームが生成されたら、入力した値を保存する場所も必要です。したがって、そのForm Engineための追加のテーブルが自動的に作成されます。field_nameテーブル内の各列を作成しfieldsます。したがって、この場合、動的に作成されたテーブルは次のようになります。

マイフォーム

pk_form_id | text1 | text2 | radio1 | check1 | language_id

ユーザーが生成された HTML フォームにデータを入力すると、入力したすべてのデータを簡単に保存できます。テキストフィールドには 1 つの列しか必要ないためです。グループ化されたラジオ ボタンは、最終的に 1 つの値のみを送信します。ただし、2 つ以上のチェックボックスがオンになっている場合、チェックボックスのグループはもちろん複数の値を送信できます。

今私の問題は、どうすればそれをデータベースに保存できますか? 特定の文字で区切られた 1 つの列に複数の値を格納するのは良い考えではないと思います。それはまた、検索を実行することを困難にするからです.

簡単なクエリmyformでテーブルから行を簡単に取得できるため、最初はこれが良い方法だと思いました。SELECT ... WHERE

とにかく、これが適切な設定であるかどうかはわかりません...そして、チェックボックスが送信できる複数の値をどのように処理しますか?

これについてのアイデアはありますか?

4

2 に答える 2

1

値をXML/JSONとして保存するのが良い方法です。RDBMSによっては、dbがXMLをネイティブに処理したり、XPathを使用してドキュメントをクエリしたりできます。Drupalはこのタイプのストレージを多用しており、問題なく機能します。

于 2012-09-23T02:58:31.590 に答える
0

あなたの問題は、チェックコントロールが正しい方法であると考えていないことだと思います。各ラジオボタンまたはチェックボックスを独自のコントロールと考える必要があります。

ラジオボタンがグループ化されているという事実は、ラジオボタンの動作に影響を与える一面です。実際、各ラジオボタンには値があります(checked = true、false)。コントロール値テーブルには、各テキストボックスの場合と同様に、各ラジオボタン(およびチェックボックス)のエントリが含まれている必要があります。

オプションボタンとその値の子テーブルを保持する代わりに、この情報をメインコントロールテーブルに配置する必要があります。メインコントロールテーブルは、これらのコントロールをグループ化するためのメカニズムを提供するために展開する必要があります。control_groupからのオプションの外部キーを含むテーブルを作成することも、fields非正規化してテーブルにオプションのgroup-name列を作成することもできfieldsます。

于 2012-09-21T11:33:53.093 に答える