我正在使用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/它显示了我想要实现的目标。
任何人都可以帮我解决这个问题吗?
由于
答案 0 :(得分: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插入到tbl_user_attributes中,其中包含创建它的用户的用户ID。然后你的程序将通过读取数据库完成剩下的工作。如果你想存储用户数据,将它存储在'data'字段中(如果它的ALWAYS文本,你可以使用TEXT类型而不是BLOB但是使用BLOB不是问题因为你可以解决你的问题需要通过'type'字段判断数据,即TextArea意味着文本存储在BLOB中。
希望这有帮助。