如何在注册期间组合字段以生成用户名?

时间:2011-05-06 00:34:50

标签: drupal forms drupal-hooks

在自定义模块“nade_reg”中,我更改了注册表单,以包含两个字段来收集用户的名字和姓氏,同时隐藏用户名字段。我不知道它是否与此相关,但我确实启用了登录雪橇模块。

在提交时,我希望用户名成为名字姓氏(带空格)

function nade_reg_form_alter(&$form, &$form_state, $form_id) {
  switch ($form_id) {
    // This is our form ID.
    case 'user_register':        
     $form['name']['#type'] = 'hidden';

     $form['field_uprofile_first_name1'] = array(
       '#type' => 'textfield',
       '#title' => t('First Name'),
       '#weight' => -40,
       '#required' => TRUE,
     );

     $form['field_uprofile_last_name1'] = array(
       '#type' => 'textfield',
       '#title' => t('Last Name'),
       '#weight' => -35,
       '#required' => TRUE,
     );

     break;
  }
}

我一直在尝试使用提交处理程序执行此操作,但似乎我的功能未被系统识别(即使在清除了很多缓存之后),因此无法分辨我的错误。

下面的代码是否正确,还是我需要与数组进行一些争论?

为什么系统不会看到这个?

function nade_reg_user_register_submit($form, &$form_state) {
  drupal_set_message(t('function redlemonade_register_user_register_submit sucessfully called.'));

  $name = $form_state['values']['field_uprofile_first_name1'] . ' ' . $form_state['values']['field_uprofile_last_name1'];
}

3 个答案:

答案 0 :(得分:3)

我有一个类似的要求,我希望用户名始终等于电子邮件。我通过隐藏注册表单中的用户名来完成,然后使用user_presave()挂钩。

对你而言,它看起来像这样;

function nade_reg_user_presave (&$edit, $account, $category) {

  // check that the names are being edited, or else you will overwrite 
  // with a blank username
  if (array_key_exists('first_name', $edit) && 
      array_key_exists('last_name', $edit)) {
    $edit['name'] = $edit['first_name'] . ' ' . $edit['last_name'];
  }

}
编辑:对于每个评论的Drupal 6(我认为这会做到这一点),我使用了hook_user()来完成我在D7中所做的事情,尽管它有点麻烦。

function nade_reg_user($op, &$edit, &$account, $category = NULL) {
  if (($op == 'insert' || $op == 'edit')  // if its the right operation
       && array_key_exists('first_name', $edit)  // and the right edits
       && array_key_exists('last_name', $edit)) {   
    $name = $edit['first_name'] . ' ' . $edit['last_name'];
    $qry = "UPDATE {users} SET name = '%s' WHERE uid = %d";
    if (db_query($qry, $name, $account->uid)) {
      $edit['name'] = $name; // update in the user array for access by other modules
    }
  }
}

答案 1 :(得分:0)

您需要设置$form_state['values']['name'],而不仅仅是$name

答案 2 :(得分:0)

您的提交处理程序不适用于现有表单,除非您指定了额外的提交处理程序。

这可以通过以下方式实现:     $ form ['#submit'] [] ='my_very_own_custom_submit_handler';

添加额外的验证处理程序也是一样。

或者,您可以通过hook_user捕获正在插入的用户 - 如前一个答案中所列 - 这相当于hook_nodeapi,但对于用户而言。在'insert'op。

期间更改$ edit变量应该足够了