0

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

提交时,我想将用户名变成 Firstname Lastname(带空格)

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'];
}
4

3 回答 3

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
    }
  }
}
于 2011-05-06T00:50:07.763 回答
0

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

于 2011-05-06T00:40:23.977 回答
0

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

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

添加额外的验证处理程序也是如此。

或者,您可以通过 hook_user 捕获正在插入的用户 - 如上一个答案中所列 - 这相当于 hook_nodeapi,但对于用户。在“插入”操作期间更改 $edit 变量就足够了。

于 2011-05-07T14:27:49.067 回答