2011-09-03 121 views
1

我想的是已登錄過的用戶登錄塊將用戶重定向。我所擁有的是一個包含下面的代碼模塊:覆蓋user_login_submit重定向已認證的用戶

附錄,2011年9月3日,15:30H:根據kiamlaluno的建議改變的代碼。

附錄,2011年9月3日,17:08H:小修正:更改節點/管理員聯繫。

附錄,3.9.2011,17:24小時:刪除[] - >代碼現在就像這樣工作,但不要忘記在DB中更改模塊優先級。

function _MYMODULE_user_login_submit($form, &$form_state) { 
    global $user; 
    if ($user->uid == 1) { 
    $form_state['redirect'] = 'admin'; 
    } elseif ($user->uid) { 
    $form_state['redirect'] = 'node/add/image'; 
    return; 
    } 
} 

/** 
* Modifies the outfit and behaviour of the user login block. 
*/ 
function MYMODULE_form_user_login_block_alter(&$form, $form_state) { 
    unset($form['#action']); 
    // removes the forgot password and register links 
    $form['links'] = array(); 
    // Redirects the user to the image upload page after login 
    // This cannot be done by a rule, the rule based redirect is only 
    // working for the login page not the user login block. 
    $form['#submit'] = array('_MYMODULE_user_login_submit'); 
} 

它不重定向用戶;它好像_MYMODULE_user_login_submit()簡單地被忽略。

我知道的已經:

  • 我不能使用規則/觸發器,因爲我還沒有登錄過的登錄頁面,但它總是說,用戶登錄區塊
  • :「使用logintoboggan」上的帖子,但在那裏我只有「註冊」和「確認」的重定向選項,但我需要「身份驗證」或「登錄後」。
  • 反正,我不希望使用更多的模塊,我更喜歡PHP的幾行。
+0

只是一個側面說明 - 管理員已的uid 1(代碼檢查0,這將是匿名用戶)。 –

+0

@HenrikOpel:好點。謝謝。 – spikey

回答

1

您的代碼不起作用,因爲user_block_login()設置窗體的「#action」屬性;在這種情況下,提交後重定向表單不起作用。

$form = array(
    '#action' => url($_GET['q'], array('query' => drupal_get_destination())), 
    '#id' => 'user-login-form', 
    '#validate' => user_login_default_validators(), 
    '#submit' => array('user_login_submit'), 
); 

要使其工作,你應該首先取消設置$form[#action],然後執行您在hook_form_alter()實施已經執行代碼。

作爲旁註,我會補充:

  • 如果你想確保你的代碼有效重定向你想要,可以確保您的模塊對最後執行的用戶;如果任何其他實現了hook_form_alter()的模塊添加了表單提交處理程序以將用戶重定向到其他頁面,並且該模塊在您的模塊之後執行,那麼您的模塊將不起作用。爲確保您的模塊在其他模塊之後執行,您應在模塊安裝期間或在更新掛鉤中使用類似於以下的代碼。 (替換「MyModule的」與模塊的簡稱。)

    db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE'); 
    
  • 而不是使用MYMODULE_form_alter()的,你可以用`MYMODULE_form_user_login_block_alter(),它不會要求檢查表單ID。

  • 你應該追加新的表單提交處理程序,而不是替換現有的。這意味着你應該使用$form['#submit'][] = 'user_login_submit_redirected';。一個模塊中實現
  • 函數應該與模塊,意思是「MYMODULE_」或「_MYMODULE_」(後者是用於私人函數)的短名稱前綴。不使用這樣的前綴可能會與其他模塊(例如用戶模塊)產生兼容性問題,因爲您正在使用的功能名稱的起始名稱爲「user_」。
+0

非常感謝您的回答並分享您的知識:您的其他筆記對我來說非常有用。但我不明白爲什麼重定向必須通過表單動作來控制。因爲你發佈的代碼(什麼是等於當前的Drupal實現user_login_block的)表明重定向可以與#submit領域進行:Drupal的函數[user_login_submit](http://api.drupal.org/api/ drupal/modules - user - user.module/function/user_login_submit/6)確實做了重定向。 – spikey

+0

我在第一個代碼塊中寫的代碼是'user_login_block()'實際使用的代碼。該函數將「#action」的值用於始終將用戶重定向到包含該塊的頁面,並且允許在不使用任何其他函數(如表單提交處理程序)的情況下執行此操作。如果你想重定向使用登錄塊登錄的用戶,我認爲你唯一的選擇就是我在我的答案中描述的那個。 – kiamlaluno

+0

感謝您澄清,因爲user_login_submit函數也使用該行重定向:'$ form_state ['redirect'] ='user /'。 $ user-> uid;'我不會改變這個動作,因爲它可能會觸發認證,而不是登錄後的頁面。 – spikey

-1

ü可以試試這個請

function user_login_submit_redirected($form, &$form_state) { 
    global $user; 
    if ($user->uid == 0) { 
    $form_state['redirect'] = 'node/admin'; 
    drupal_goto('node/admin') ; 
    } elseif ($user->uid) { 
    $form_state['redirect'] = 'node/add/image'; 
    drupal_goto('node/add/image') ; 
    return; 
    } 
} 
+0

謝謝你的建議。但它沒有奏效。實際上,我甚至可以在'global $ user'之後設置exit()或die();它不起作用,正如我所說的,它似乎根本不會被調用。 – spikey