2012-08-29 43 views
0

我創建了一個模塊,它向用戶登錄塊窗體添加一個字段以顯示錯誤。我想在新字段中顯示錯誤,而不是使用form_set_error()。我能夠看到登錄塊中的警告字段。但是,當我提交錯誤時,它不會顯示錯誤。未使用form_set_error()顯示Drupal登錄錯誤消息()

代碼如下。一旦出現錯誤,我不明白如何刷新表單的值。

function usermoved_form_user_login_block_alter(&$form, &$form_state) { 
    $form['warning'] = array(
    '#value' => t('oops'), 
    '#weight' => 11 
); 
    $form['#submit'][] = 'usermoved_form_submit_code'; 
} 

function usermoved_form_submit_code($form, &$form_state) { 
    global $user; 
    if (!$user->uid) { 
    $form['warning']['value']= "changed to someting"; 
    } 
} 

回答

0

你的代碼是錯誤的:不要使用$form['warning']['value']的,就應該使用$form['warning']['#value']。即使這樣做,消息(應傳遞給t())也不會顯示給用戶,因爲$form未通過引用傳遞,並且它不是從表單提交處理程序返回的值,該值不會返回任何值。

當表單驗證處理程序產生錯誤時,表單提交處理程序從不會被調用。如果您正在檢查用戶標識以查看用戶是否未登錄,那麼您無法在表單提交處理程序中執行該操作,因爲未登錄的用戶意味着在驗證階段出現錯誤,並且表單提交處理程序不會被調用。

你可以使用的是一個表單驗證處理程序。

function usermoved_form_user_login_block_alter(&$form, &$form_state) { 
    $message = (empty($_SESSION['usermoved_form_user_login_block_alter']) ? t('Initial message') : $_SESSION['usermoved_form_user_login_block_alter']); 

    $form['warning'] = array(
    '#value' => $message, 
    '#weight' => 11 
); 

    $form['#validate'][] = 'usermoved_form_validate_code'; 
} 

function usermoved_form_validate_code($form, &$form_state) { 
    if (empty($form_state['uid'])) { 
    $_SESSION['usermoved_form_user_login_block_alter'] = t('The error message'); 
    } 
    else { 
    unset($_SESSION['usermoved_form_user_login_block_alter']); 
    } 
} 

$form_state['uid']是從user_login_authenticate_validate(),由Drupal的調用的第二驗證處理程序設定的值。如果未設置,則表示在Drupal嘗試對用戶進行身份驗證之前發生了一些錯誤,或者用戶未進行身份驗證。第一種情況可能發生在用戶被阻止時(user_login_name_validate()驗證),或者用戶嘗試過多次進行身份驗證(請參閱user_login_authenticate_validate(),其使用flood_is_allowed()來驗證用戶沒有嘗試過多次進行身份驗證);當用戶沒有輸入正確的密碼時,後一種情況會發生。 (見user_login_final_validate()

由於旁註:

  • 我以前t('Initial message')作爲默認的消息,但可能與''被替換,如果你沒有任何消息顯示給用戶在登錄之前英寸
  • 用戶登錄塊未顯示爲已登錄的用戶。 $user->uid(其中$user是全局變量)始終爲0,此時登錄塊顯示,登錄失敗;檢查$user->uid的值,同時顯示登錄塊沒有意義。
+0

我完全按照您提到的方式複製了代碼。我在usermoved_form_user_login_block_alter和usermoved_form_submit_code中輸入了echo命令。第一次在GLOBAL Array和消息中加載不了任何值。然後我輸入錯誤的id和pw stil在$ message變量中沒有值。我發現提交函數沒有被調用。因爲我也在這裏輸入了echo語句。 – user1480032

+0

當表單驗證處理程序引發錯誤時,表單提交處理程序不會被調用;當用戶輸入錯誤的用戶名或密碼錯誤時會發生這種情況。我已經更新了我的答案。 – kiamlaluno

+0

非常感謝您的回覆。但仍然存在一個問題。第一次我提交了錯誤的密碼,並且它沒有顯示錯誤。然後第二次輸入錯誤的密碼,並顯示錯誤。然後,我再次登錄並註銷,並嘗試相同的事情,但只有第二次顯示錯誤。我不明白原因 – user1480032