Drupal 6:将自定义字段添加到数据库中

时间:2009-12-15 21:44:45

标签: forms drupal

我需要核心配置文件模块无法提供的自定义字段(从SQL查询中填充的选择列表)。我能够成功添加具有适当选项的字段;但是,我不确定如何在提交后处理这个新领域。

根据我的理解,我需要编写一个处理我的SQL插入的函数,然后从hook_form_alter提交按钮调用该函数。

截至目前,它只传递字段名称,而不是值。并且字段名称被序列化并存储在用户表的“数据”字段中。我正试图将它传递给自己的专栏。

这是我的代码......

//takes value and inserts it to account field   
 function accountselect_submitaccount() {
        db_query( "INSERT INTO {user} (account)
                  VALUES {account_name}" );
      }

则...

//call the above function using custom submit (I suspect this is the troubled area)
  function accountselect_form_alter(&$form, $form_state, $form_id) {
    if($form_id == 'user-register')
    $form['#submit'][] = 'accountselect_submitaccount';
  }

2 个答案:

答案 0 :(得分:2)

如果我说得对,你试图改变用户的注册表格,这样除了插入“regualar”字段(用户名,密码等等)之外,还会要求用户填写其他字段。如果我做对了,这就是我要继续下去的方式(就像你说你是Drupal的新手一样,我试着尽我所能)。

初步说明

  1. 我不会修改用户。 Drupal 中的关键设计原则之一就是你永远不会修改别人的代码:你应该通过将你的东西挂钩到一般的回调和钩子系统来实现你想要的东西(不过请参见下面的注释) 。在极少数情况下,这在技术上是不可能的(并且修改的性质将增加公众的可用性/功能),您应该提交一个补丁以引起代码处理者的注意。
  2. 选择框始终返回其数组索引,而不是其数组值。这是因为有很多好理由。一劳永逸:数组的值很可能是某些文本在每种语言中都有所不同,因此表单通常在[bread] => t('bread')的行中定义,以便在其他语言中使用表单时,将显示选项“pain”或“bröd”或“pane”,但返回的值(可能存储在数据库中的值将始终为“bread”。
  3. 设计

    1. 创建自己的模块,并通过挂钩与核心用户进行交互。
    2. 创建自己的表:主键是users表中的用户uid(UID)。您可以根据需要在表格中包含任意数量的字段。在您的特定情况下,如果您使用MySQL,您可能会评估是否要使用枚举类型,或者只是编写PHP代码传递的值(我个人倾向于限制数据库中的约束数量并管理数据验证)代码,所以我会选择第二个选项...但这是风格问题,真的。)
    3. 实施hook_form_FORM_ID_alter() ,其中FORM_ID将是用户将用于注册的表单的ID。如果有多个可能的表单用于注册,请改为实现hook_form_alter(),并在其中创建一个开关/案例结构。
    4. 使用FAPI(表单API)定义验证和回调函数。您可以看到选择框here支持哪些字段。如果需要,您可以定义#element_validate字段以指定验证回调。您必须将追加(而不是 assign )提交回调函数的名称添加到用于提交整个表单的按钮的字段#submit
    5. 实施回调。处理表单的回调通常会收到两个参数,通常称为$form$form_state。后者包含用户选择的表单值。您的提交回调将包含drupal_write_record()指令,以便在您的自定义表格中保存相关数据。
    6. 最后的笔记

      1. 不幸的是,虽然CCK将其作为核心,但是创建用户配置文件作为自定义内容的可能性却没有,所以你真的希望很好地编写你的模块,因为它将是你最有可能使用的东西直到Drupal 8。
      2. 我发现(感谢另一个响应者对这个同样的问题), Drupal确实提供了一种改变用户表格的机制。我仍然不喜欢这背后的设计原则:

        • 因为它纠结了应该在逻辑上保持独立的东西(核心和自定义/贡献模块和数据)
        • 因为它不提供命名空间保护(假设你添加一个名为“timezone”的自定义字段,几个月后你想安装Date API(它还会尝试创建一个名为“timezone”的字段......)
        • 因为它使代码不易阅读且难以维护

        然而,要阅读的信息性线索是here。最后值得一提的是,这个功能背后的潜在机制是在D6到D7之间发生变化。

      3. HTH!

答案 1 :(得分:0)

据我所知,如果没有与字段名称匹配的列,则新字段仅添加到data列。您应该只需在用户表中创建一个account列,就可以填充该数据。

对于您发布的代码,您的提交功能存在许多问题:

  • 提交函数包含包含提交值的函数。 submit_function($form, &$form_state)可让您访问$form_state['values']数组。
  • INSERT永远不会有效。您需要UPDATE查询。
  • 您无法在查询中执行{account_name}。您需要实际使用$form_state['values']
  • 中的值