在自定义模块“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'];
}
答案 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变量应该足够了