5

私は練習と同じようにPHPを使用してCMSを作成しており、ユーザーがWebサイトのサインアップ/登録で使用できるカスタムフォームフィールドを作成できるようにしたいと考えています(SocialEngineまたはPHPFoxと同様)。しかし、私はこれをどのように達成するのかについて本当に良い考えを持っていません。ある種のプラグイン(「フック」)システムを作成する必要がありますか?私はもともとこれを念頭に置いていましたが、これが本当に良い方法かどうかはわかりません:

CMSの管理者には、作成するフォームフィールドの名前、フィールドのタイプ(文字列、ブール値、日付など)、フィールドのカテゴリ、およびフィールドであるかどうかのオプションを含むフォームが提供されます。必須フィールド。

次に、値は「custom_form_fields」というデータベーステーブルに次の列で渡されますid, field_name, field_type, category, required。また、これらのフィールドの値を格納します。すべてのユーザーのデータが格納されている「users」テーブルに列が追加されます。

ALTER TABLE users ADD the_custom_form_field_name datatype

しかし、PHPでさまざまなフォームフィールドを表示する方法と、フォームフィールドからユーザーのテーブルにそのデータを挿入する方法について混乱しています。

私の質問がわからない場合は、http ://www.phpfox.com/features/custom-fields/をご覧ください。これは、私が達成しようとしていることを示しています。

誰かがこれで私を助けることができますか?

ありがとう

4

1 に答える 1

4

少し減速する必要があります。最初は、HTMLフォームを動的に生成するためのjs / phpコードについての質問のように見えましたが、その後、データベースフィールドについて話し始めました。

あなたの質問はまだ私には100%明確ではありませんが、あなたの状況で私がすることは、データベース設計から始めて、他には何も焦点を当てないことです。

ユーザーテーブルの変更を検討していることがわかります。それは必要ないと思いますし、良いデザインでもありません。

各ユーザーが主キー、つまりusers.idフィールドを持っている限り、次のようなフォームフィールドデータを格納するためだけに新しいテーブルを作成できます。

CREATE TABLE users_custom_form_data(
  id INT NOT NULL,
  FOREIGN KEY(id) REFERENCES (users.id) ON DELETE CASCADE,
  /* then store any data you need to store about a form field */
  field_type ENUM("text","number","phone","email","submit","etc"),
  field_default_value VARCHAR(100) /* or what you think is necessary */,
  field_name VARCHAR(100),
  field_id VARCHAR(50),
  field_class VARCHAR(50)
  /* and any others you need */
) ENGINE = InnoDB;

各レコードをユーザーIDに割り当てるので、後でどのユーザーがどのカスタムフォームフィールドを所有しているかを追跡できます。

これで始められるといいのですが。


質問を明確にしたので、今見ているのは、レコードを所有するユーザーIDのフィールド、カスタムフィールドを参照するためのカスタム属性テーブルIDのフィールドを持つテーブルだと思います。次のようになります。

CREATE TABLE tbl_user_attributes(
    user_id INT NOT NULL,
    FOREIGN KEY(user_id) REFERENCES(tbl_users.id) ON DELETE CASCADE,
    attribute_id INT NOT NULL,
    FOREIGN KEY(attribute_id) REFERENCES(tbl_attributes.id) ON DELETE CASCADE
) ENGINE=InnoDB;

次に、属性IDは、ユーザーがCMSに追加したフィールドの種類を示します。属性テーブルは、ユーザーによって事前に入力され、ユーザーによって定義されます(デフォルトのフィールドを使用)。次のようになります。

CREATE TABLE tbl_attributes(
    id INT NOT NULL AUTO_INCREMENT,
    text_label VARCHAR(100),
    type ENUM("TextArea","CheckGroup","DropDown"),
    data BLOB
) ENGINE=InnoDB;

したがって、そのテーブルにオプションを入力すると、ユーザーはこれらのタイプのフィールドのいずれかを(デフォルトのフィールドの上に)追加して名前を付けることができるはずです。つまり、「Movies」は「text_label」という名前のフィールドに保存されます。タイプは「TextArea」になります。次に、そのtbl_attributes.idは、それを作成したユーザーのユーザーIDを使用してtbl_user_attributesに挿入されます。次に、データベースを読み取ることにより、プログラムが残りの作業を行います。その中にユーザーデータを保存する場合は、「データ」フィールドに保存します(常にテキストの場合は、BLOBの代わりにTEXTタイプを使用できますが、BLOBを使用しても問題はありません。 'type'フィールドで判断するデータを処理する必要があります。つまり、TextAreaは、テキストがBLOBに格納されたことを意味します。

お役に立てれば。

于 2012-07-20T22:35:11.417 に答える