2011-09-03 116 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