【问题标题】:Field data in one table, not many. for drupal7字段数据一张表,不多。对于 Drupal 7
【发布时间】:2011-10-05 13:10:11
【问题描述】:

我正在使用商务模块创建一个在线商店。我正在修改产品 .install 文件以创建内容类型(据我所知,这是必需的),作为该内容类型的一部分,我需要创建大量字段。该列表将包含大约 50-60 条不同的信息。

理想情况下,我希望将这些信息存储在一个表中,其中 productID 开头,所有其他信息也一起存储,但情况似乎并非如此;所有字段都存储在不同的表中。

我注意到,也用于 commerce 的“地址”模块创建了一个字段类型,其中大约 15 个不同的值都存储在同一个框中。这怎么可能?我注意到,例如,如果我将基数设置为 5,它会创建不同的行。我只想要一张包含以下内容的表格:

ID - value1 - value2 - value3 等等

我也不需要任何模块/扩展,因为这一切都需要写入文件。我也不认为更改为 mongoDB(我认为)是一种选择,那么在这种情况下我的选择是什么?

【问题讨论】:

    标签: drupal drupal-7


    【解决方案1】:

    恐怕 Drupal 字段系统不是这样工作的,one field == one table(如果您包含每个字段的修订表,实际上是 2 个表)。

    地址模块使用hook_field_schema() 为该特定字段定义几个(看看address.install,你就会明白我的意思了)。

    因此,如果您想将所有内容放在一个表中,您只需定义自己的字段类型(请参阅examples module,特别是field_example 以获得帮助)。

    请记住,一旦安装了模块,您在 hook_field_schema() 中定义的列数将是静态的,并且您能够增加/减少它的唯一方法是使用 _update 挂钩为您的自定义模块。

    此外,如果您正在破解 Commerce 模块中包含的文件...停止!:Commerce 仍处于起步阶段,您可能需要尽快对其进行更新。 ..一旦完成,您的代码更改就会消失,您的网站很有可能会处于不一致的状态。

    Drupal 的全部意义在于,所有内容都被挂钩/外包,以便系统的其他部分可以对其进行更改。在 product.install 中没有什么可以通过在另一个模块中实现 Drupal 挂钩来更改。

    如果您不确定,请发布另一个问题,详细说明您通过直接编辑 contrib 模块文件尝试完成的工作,并且 SO 上的 Drupal 专家之一将为您指明正确的方向 :-)

    编辑

    只是说我在 Drupal 7 中使用 Ubercart 已经有一段时间了,发现它是一个非常非常好的解决方案(许多 Commerce 贡献的模块仍处于 dev/alpha/beta 中;这是对于 Ubercart 贡献的模块来说则更少)。可能值得一看。

    更多信息

    我认为您在这里基本上有两个选择,但无论哪种方式,您都需要创建一个自定义模块 (excellent set of instructions here)。

    选项 1:创建自定义字段

    如果您是 Drupal 编码初学者,我建议这可能是完成您想要的最简单的方法,但它仍然不是完全直截了当。从上面的 Drupal 示例模块链接中获取field_example 模块并查看.install 文件,特别是field_example_field_schema() 函数。这定义了将在该字段的表中的列。然后查看field_example.module...几乎每个用Implements hook_x 注释的函数都是您想要复制到模块中并根据自己的需要进行调整的函数。

    我认为这会更容易,因为 Drupal 会为您处理表格/表单字段的创建 这样您就不必弄乱数据库、架构或表单 API。

    选项 2:创建自定义模块

    此选项涉及实现您自己的表(就像您在评论中建议的那样),其中主键是产品的实体 ID,并且还包含您的所有自定义列。 (有关这方面的帮助,请参阅 Schema API documentation)。

    然后您将实现hook_form_alter() 以添加用户输入数据所需的表单字段,然后实现hook_node_insert()hook_node_update() 以将此数据持久保存到您的数据库表中。如果不实际编写代码,很难深入了解更多细节,而且代码相当多!

    希望对您有所帮助,对不起,我不能再具体了,但是如果不了解情况的所有来龙去脉,这并不容易

    【讨论】:

    • 感谢 clive 非常详细的回复。当我被告知我必须做什么时,我可以在新网站上使用的方法非常有限。计划是创建一个“产品”表并在其中包含所有值。如果我创建一个内容类型然后将字段添加到这些值,这可能吗?从技术上讲,是否创建所有字段表并不重要,只要有一个带有“产品”的表并且所有列都在一个位置。我们有一个复杂的系统需要链接,所以拥有一张桌子会让生活更轻松!!
    • 澄清一下,你是说我应该制作一个新模块来做我想做的所有事情吗?如果是这样,我将如何将其正确链接到系统中?我注意到您需要保持所有名称与您在数据库中创建项目、名称挂钩等相同,所以如果我有一个不同的模块,那与我的 commerce->products 模块的名称不会有所不同吗?我也不能改用ubercart,因为我们必须使用商务。
    • 是的,Drupal 的命名约定是最好和最差的功能合二为一!我将用更多信息更新上面的答案,我认为单条评论有点多
    • 非常感谢您的详细回复。我有很多可以研究的选项,我希望能够尽快解决这个问题。在接下来的几天里,我会告诉你我最终是如何解决这个问题的。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多