5

我正在使用 PHP 制作一个 CMS,并希望让用户能够创建可用于其网站注册/注册的自定义表单字段(类似于 SocialEngine 或 PHPFox)。但是,我真的不知道如何实现这一目标。我是否必须制作某种插件(“钩子”)系统?我最初有这个想法,但我不知道这是否真的是一个好方法:

CMS 的管理员将获得一个表单,其中包含他们想要创建的表单字段名称、字段类型(字符串、布尔值、日期等)、字段类别以及它是否是必填项目。

然后将这些值传递到名为“custom_form_fields”的数据库表中,其中包含以下列:id, field_name, field_type, category, required。还要存储这些字段的值;将在存储所有用户数据的“用户”表中添加一列。

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;

由于我们将每条记录分配给一个 USER 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;

因此,一旦您使用选项填充该表,用户应该能够添加任何类型的字段(在默认字段之上)并为其命名,即“电影”将存储在名为“text_label”的字段中它将属于“TextArea”类型。然后,该 tbl_attributes.id 将被插入到 tbl_user_attributes 中,其中包含创建它的用户的用户 ID。然后你的程序将通过读取数据库来完成剩下的工作。如果您想在其中存储用户数据,请将其存储在“数据”字段中(如果它始终是文本,您可以使用 TEXT 类型而不是 BLOB,但使用 BLOB 不是问题,因为您可以计算出您的需要处理由“类型”字段判断的数据,即TextArea 表示文本存储在BLOB 中。

希望这可以帮助。

于 2012-07-20T22:35:11.417 回答