1

我需要你的帮助。我有 drupal 7 cck 表单,匿名用户可以查看,但是当匿名用户填写表单并单击提交时,我想显示用户登录表单,登录后不刷新页面 cck 表单将自动提交并显示感谢信息。我为此搜索了很多,但没有得到任何解决方案。请帮助我,我不明白该怎么做。

4

1 回答 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 回答