当前位置: 首页 > 知识库问答 >
问题:

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

汤弘文
2023-03-14

我正在用PHP制作一个CMS,希望用户能够创建自定义表单字段,用于他们的网站注册(类似于SocialEngine或PHPFox)。然而,我真的没有一个好主意,我将如何实现这一点。我需要做一些插件(“钩子”)系统吗?我最初是这么想的,但我不知道这是否真的是一个好方法:

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

然后将这些值传递到名为“自定义表单字段”的数据库表中,该表包含以下列:id、字段名称、字段类型、类别、必填项。还要存储这些字段的值;将向“用户”表中添加一列,其中存储了所有用户数据。

ALTER TABLE users ADD the_custom_form_field_name datatype

但是现在我对如何在PHP中显示不同的表单字段以及如何将表单字段中的数据插入用户表感到困惑。

如果您不理解我的问题,请查看:http://www.phpfox.com/features/custom-fields/它显示了我正在努力实现的目标。

有人能帮我解决这个问题吗?

谢谢


共有1个答案

潘高洁
2023-03-14

你需要慢一点;起初,您的问题似乎是关于动态生成HTML表单的js/php代码,但随后您开始讨论数据库字段。

你的问题对我来说仍然不是100%清楚,但是在你的情况下,我会从数据库设计开始,不关注其他事情。

我可以看出您正在考虑更改用户表。我不认为这是必要的,也没有好的设计。

只要每个用户都有一个主键,即用户。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_属性。然后,id将与创建它的用户的用户id一起插入tbl_user_属性。然后,您的程序将通过读取数据库来完成其余的工作。如果您想在其中存储用户数据,请将其存储在“数据”字段中(如果其始终为文本,则可以使用文本类型而不是BLOB,但使用BLOB不是问题,因为您可以通过“类型”字段判断您需要对数据做些什么,即TextArea表示文本存储在BLOB中。

希望这有帮助。

 类似资料:
  • 问题内容: 我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量… 例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 040011”。 我无法更改这些值- 它们通过他们的公司存在,已经在州,客户等中注册。我知道将年份和其余年份分隔到单独的列中会很好,但这是不可能的。我什至不能真正做到“内部”,因为每一

  • 我希望用户能够编辑管理后端面板上自己的电子邮件内容,用户可以使用一些指令,如: 因此,例如,用户可以在 : 我如何在Laravel中创建一些自定义指令,任何我可以用来简化开发的库?当然,用户不允许使用PHP代码。 我知道有Laravel刀片,但我不确定这是安全的,用于公众用户编辑内容和只允许客户指令。

  • 我需要使用 restlet 客户端放置以下 rest 请求: 我可以在一个单独的调用中获取XToken,但是在当前的调用中,我无法在我的ClientResource对象中设置“Authorization”头。 有人可以建议我需要为我拥有的以下代码行添加哪些代码: 在restlet中创建和添加“Authorization”标头会导致restlet客户端库中出现错误。 提前谢谢 阿希什·夏尔马

  • 在创建新的字段类型之前,请考虑其他自定义字段的方法是否适合您的需求。 如果您的应用程序需要存储新的值类型,或者希望为现有的值类型创建新的UI,则可能需要创建一个新的字段类型。 要创建一个新字段,请执行以下操作: 实现一个构造函数 注册一个JSON密钥并实现fromJson 处理块上UI和事件侦听器的初始化 处理事件侦听器(已为您进行了UI处理) 实现值处理 添加字段值的文本表示形式,以实现可访问性

  • 通过“自定义字段”方法创建数据后,数据里没有任何记录,需要到地图编辑模块添加数据。新建数据时,请注意选择到数据类型(点线面),创建完成后不可以修改。 选择通过自定义字段创建,需要手动输入属性列,并选择好属性列的类型,如文本/数值等。其中数值列可以用于统计。

  • 为了简化JavaFx应用程序的使用,我希望允许用户定义一个键盘组合/快捷键来触发应用程序最重要的操作。 我知道如何在代码中定义并将其设置为或在KeyEvent侦听器中使用它,但我希望允许用户只需在键盘上的某个设置对话框中按下它,就可以定义自己的KeyCodeCombination。 基本上沿着这个伪代码: