PHP/MySQL - 允许用户为CMS创建自定义表单字段

7
我正在使用PHP制作CMS,仅仅作为练习,并希望让用户能够创建自定义表单字段,以便在其网站的注册/登录中使用(类似于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/,它展示了我想要实现的内容。
有谁能帮助我解决这个问题吗?
谢谢。
1个回答

5
你需要稍微放慢一下速度;起初,你的问题似乎是关于生成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;

所以,一旦您使用选项填充了该表格,用户就应该能够添加任何类型的字段(在默认字段之上),并给它命名,例如,“电影”将存储在名为“text_label”的字段中,并且它将是“TextArea”类型。然后,tbl_attributes.id将插入到tbl_user_attributes中,并具有创建它的用户的用户ID。然后,您的程序会通过读取数据库来完成其余工作。如果要在其中存储用户数据,请将其存储在“data”字段中(如果它始终是文本,则可以使用TEXT类型而不是BLOB,但使用BLOB也没有问题,因为您可以通过“type”字段判断需要进行哪些操作,即TextArea表示文本存储在BLOB中。

希望这能帮到您。


谢谢您的建议,但我实际上是在询问如何让我正在制作的CMS的管理员为其网站的注册表单创建自定义表单字段,就像SocialEngine或PHPFox一样。http://www.phpfox.com/features/custom-fields/ 显示了我想要实现的内容。 - user1302430
你的意思是像基本信息/兴趣爱好/+自定义的一个吗? - Ozzy
@user1302430 这很简单,但是你需要存储哪些信息?它们都只是像“电影”和“兴趣”这样的几个文本区域吗? - Ozzy
是的,我猜是这样,很抱歉回复晚了。 - user1302430

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接