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 に答える