我需要你的帮助。我有 drupal 7 cck 表单,匿名用户可以查看,但是当匿名用户填写表单并单击提交时,我想显示用户登录表单,登录后不刷新页面 cck 表单将自动提交并显示感谢信息。我为此搜索了很多,但没有得到任何解决方案。请帮助我,我不明白该怎么做。
问问题
1139 次
1 回答
1
您可以编写一个使用 form_alter 钩子的自定义模块。然后对于您的 CCK 表单,您可以检查用户是否已登录,如果没有,请在表单中添加用户名/密码字段以供用户填写。然后向表单添加自定义验证功能,以便在提交表单时您的验证功能尝试以编程方式登录用户。如果登录失败,则显示表单错误,否则将全局用户设置为登录用户。因此,当表单点击其提交功能时,用户应该已登录。
所以你的自定义模块是这样的:
<?php
function mymodule_form_alter(&$form,&$form_state,$form_id){
global $user;
//only for the form we are looking for, and if the user is anonymous
if (($form_id == 'my_form_id') && ($user->uid==0)){
$form['login'] = array(
'#type' => 'fieldset',
'#title' => 'Login',
);
$form['login']['username'] = array(
'#type' => 'textfield',
'#title' => 'Username',
'#required' => true,
);
$form['login']['password'] = array(
'#type' => 'password',
'#title' => 'Password',
'#required' => true,
);
$form['#validate'][] = 'mymodule_my_form_validate';
}
}
function mymodule_my_form_validate(&$form,&$form_state){
global $user;
//stop from re-login if there were other validation errors
if ($user->uid == 0){
$username = $form_state['values']['username'];
$password = $form_state['values']['password'];
//authenticate the user (attempt to login)
if ($uid = user_authenticate($username,$password)){
$user = user_load($uid);
//finalize login
user_login_finalize(array('name'=>$username,'pass'=>$password));
}else{
form_set_error('username','Invalid username or password');
}
}
}
于 2012-09-25T21:20:02.730 回答