【问题标题】:hook_user(): inserting extra field into database not just formhook_user():在数据库中插入额外的字段,而不仅仅是表单
【发布时间】:2011-03-21 14:28:21
【问题描述】:

我可以在注册中添加一个额外的字段。我需要知道的是我需要采取什么步骤才能获取该输入并将其插入到drupal的用户表中。下面的代码在我的模块中,它只向表单添加了一个字段,但是当它提交时它不会对数据做任何事情。

function perscriptions_user($op, &$edit, &$account, $category = NULL){
  if ($op == 'register') {
    $form['surgery_address'] = array (
      '#type' => 'textarea',
      '#title' => t('Surgery Address'),
      '#required' => TRUE,
    );      

     return $form;     
  }

  if ($op == 'update') {
    // …
  }
}

【问题讨论】:

    标签: drupal-6 drupal-modules drupal-fields


    【解决方案1】:

    hook_user() documentation报道的:

    $op 正在执行什么样的操作。可能的值(按字母顺序):
    - “插入”:正在添加用户帐户。模块应将其对用户对象的自定义添加保存到数据库中,并在 $edit 中将保存的字段设置为 NULL。
    - “更新”:正在更改用户帐户。模块应将其对用户对象的自定义添加保存到数据库中,并在 $edit 中将保存的字段设置为 NULL。
    - "validate": 用户账号即将被修改。模块应验证其对用户对象的自定义添加,并根据需要注册错误。

    模块需要在hook_install()创建自己的数据库表。

    hook_user()可以用如下代码实现,例如:

    function perscriptions_user($op, &$edit, &$account, $category = NULL){
      if ($op == 'register' || ($op == 'form' && $category = 'account')) {
        $form['surgery_address'] = array (
          '#type' => 'textarea',
          '#title' => t('Surgery Address'),
          '#required' => TRUE,
        );
    
        return $form;     
      }
    
      if ($op == 'insert' || $op == 'update') {
        prescriptions_save_user_profile($account->uid, $edit['surgery_address']);
      }
      if ($op == 'validate' && $category == 'account') {
        // Verify the entered values are valid.
        // In this example, the value is contained in $edit['surgery_address'].
      }
    }
    

    prescriptions_save_user_profile() 是将用户配置文件值保存在数据库中的函数。代码检查类别以避免在用户配置文件编辑表单中显示的所有选项卡中显示相同的表单字段。

    【讨论】:

    • 所以你是说因为我已经定义了表单字段,如果它存在,它会自动将它添加到数据库中。我知道如何使用模式 api 和 hook_install()。我在这里偏离轨道了吗?还要澄清吗?我只是觉得很难理解文档的内容。
    • @Jonathan:不,是模块需要保存它在用户表单中添加的字段的值。 Drupal 核心代码无法将第三方模块添加的字段保存在数据库表中。实际上,Drupal 核心代码会保存$user->data 中的额外字段;这就是文档建议“在$edit 中将保存的字段设置为NULL”的原因。
    • 对,我了解更多,我是如此接近!我是否可以厚颜无耻地再花几分钟时间向我展示您如何从与我的迷你示例相关的表单中访问数据?我可以自己添加到数据库和架构中,我只需要弄清楚我需要在哪个阶段获取数据以及如何访问这些值。我保证我会给你高分! :-)
    • 轰隆隆!优秀。感谢您的宝贵时间,代码胜于雄辩! Youv'e帮助我了解了更多!非常感谢。
    • 我还添加了有关验证表单字段的部分,以防万一您需要它。在那种情况下我还没有编写代码,但是您应该使用form_set_error() (api.drupal.org/api/function/form_set_error) 报告任何错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2011-09-19
    相关资源
    最近更新 更多