2012-08-03 74 views
1

我需要你的幫助。 我有drupal 7 cck表單,匿名用戶可查看,但當匿名用戶填寫表單並點擊提交時,我想顯示用戶登錄表單,並且在登錄後不刷新頁面,cck表單將自動提交併顯示感謝信息。 我搜索了很多,但我沒有得到任何解決方案。 請幫我,我不明白如何做到這一點。對錶格提交檢查用戶登錄或不Drupal 7

回答

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'); 
     } 
    } 
}