2011-05-06 59 views
0

在自定义模块“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

我有一个类似的要求,我希望用户名始终等于电子邮件。我通过隐藏注册表单中的用户名,然后使用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 
    } 
    } 
} 
+0

这看起来不错,但不适合我。我的坏 - 我忽略提及我的网站是Drupal 6. – baaj 2011-05-06 04:55:03

+0

@baaj我添加了D6的编辑,让我知道如果这有帮助,它对我有用,但我只是交换电子邮件到用户名 – goggin13 2011-05-06 05:23:59

+0

这工作很好,非常感谢! – baaj 2011-05-09 16:30:41

0

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

0

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

这可以通过: $ form ['#submit'] [] ='my_very_own_custom_submit_handler';

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

或者,您可以通过hook_user捕获正在插入的用户 - 如以前的答案中所列 - 等同于hook_nodeapi,但用于用户。在'insert'操作期间更改$ edit变量应该足够了。