我正在使用commerce模块创建一个在线商店。我正在修改产品.install文件以创建内容类型(因为我被告知这是必需的)并且作为该内容类型的一部分,我需要创建许多字段。该列表将包含大约50-60种不同的信息。
理想情况下,我希望将这些存储在一个表中,其中包含开头的productID和所有其他信息,但似乎并非如此;所有字段都存储在不同的表中。
我注意到同时用于商业的“地址”模块会创建一个字段类型,该字段类型包含大约15个不同的值,这些值都存储在同一个框中。这怎么可能?我注意到,如果我将基数设置为5,例如,它会创建不同的行。我只想要一张包含以下内容的表格:
ID - value1 - value2 - value3等等。
我也不需要任何模块/扩展,因为这一切都需要写在文件中。我也不认为改为mongoDB(我认为)是一种选择,那么在这种情况下我的选择是什么?
答案 0 :(得分:6)
这不是Drupal现场系统如何工作我恐怕one field == one table
(如果你为每个字段包含修订表,那么实际上就是2个表)。
地址模块使用hook_field_schema()
为该特定字段定义多个列(查看address.install
,您将看到我的意思。)
因此,如果您想将所有内容放在一个表格中,您只需要定义自己的字段类型(请参阅examples module,特别是field_example
以获取帮助)。
请记住,虽然安装模块后您在hook_field_schema()
中定义的列数将是静态的,并且您能够增加/减少它的唯一方法是使用{{ 1}}挂钩您的自定义模块。
此外,如果您正在攻击Commerce模块中包含的文件...... 停止!:商业仍处于初期阶段,您很可能不得不尽快更新。 ..你已经完成了你的代码更改将会消失,你的网站很可能处于不一致的状态。
Drupal的重点是,所有东西都被钩住/养殖,以便系统的其他部分可以改变它。在_update
中没有任何东西可以通过在另一个模块中实现Drupal钩子来实现。
如果你不确定,可以通过直接编辑一个contrib模块文件发布另一个问题,详细说明你想要完成的事情,SO上的一个Drupal专家会指出你正确的方向: - )
修改强>
只是说我已经在Drupal 7中使用Ubercart已经有一段时间了,并且发现它是一个非常非常好的解决方案(许多商业贡献的模块仍然在dev / alpha / beta;对于Ubercart贡献的模块来说,情况就不那么好了。可能值得一看。
更多信息
我认为你基本上有两个选择,但无论哪种方式,你都需要创建一个自定义模块(excellent set of instructions here)。
选项1:创建自定义字段
如果你是一个Drupal编码初学者,我建议这可能是你想要的最简单的方法,但它仍然不是完全直截了当。从上面的Drupal Examples模块链接中获取product.install
模块,查看field_example
文件,特别是.install
函数。这将定义将在该字段的表中的列。然后查看field_example_field_schema()
...几乎所有与field_example.module
评论的函数都是您要复制到模块中并根据自己的需要进行调整的函数。
我认为这会更容易,因为Drupal将为您处理表/表单字段的创建 所以你不必弄乱数据库,架构或表单API。
选项2:创建自定义模块
此选项涉及实现您自己的表(就像您在评论中建议的那样),其中主键是产品的实体ID,并且还包含所有自定义列。 (有关此问题,请参阅Schema API documentation)。
然后,您将实现hook_form_alter()
以添加用户输入数据所需的表单字段,然后实现Implements hook_x
和hook_node_insert()
以将此数据持久保存到数据库表中。如果没有实际编写代码就很难进入任何细节,而且代码相当多!
希望有所帮助,对不起我不能再具体了但是如果不了解情况的所有细节并不容易