重写Drupal 6中的用户登录提交以重定向经过身份验证的用户
我想重定向通过用户登录块登录的用户。我拥有的是一个包含以下代码的模块: 附录,2011年9月3日,15:30h:根据kiamlaluno的建议更改代码 附录,2011年9月3日,17:08h:小补丁:将节点/管理员更改为管理员 附录,2011年9月3日17时24分:删除重写Drupal 6中的用户登录提交以重定向经过身份验证的用户,drupal,login,customizing,Drupal,Login,Customizing,我想重定向通过用户登录块登录的用户。我拥有的是一个包含以下代码的模块: 附录,2011年9月3日,15:30h:根据kiamlaluno的建议更改代码 附录,2011年9月3日,17:08h:小补丁:将节点/管理员更改为管理员 附录,2011年9月3日17时24分:删除[] ->代码现在是这样工作的,但不要忘记更改DB中的模块优先级 function _MYMODULE_user_login_submit($form, &$form_state) { global $user;
[]
->代码现在是这样工作的,但不要忘记更改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');
}
它不会重定向用户;似乎只忽略了\u MYMODULE\u user\u login\u submit()
我已经知道:
- 我不能使用规则/触发器,因为我不在登录页面上登录,而是在用户登录块上登录
- 人们总是说:“在帖子上使用Logintobogan”,但我只有“注册时”和“确认时”的重定向选项,但我需要“身份验证时”或“登录后”
- 无论如何,我不想使用更多的模块,我更喜欢几行PHP
- 你能试试这个吗
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;
}
}
您的代码不起作用,因为为表单设置了“#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\u form\u alter()实现中已经执行的代码
作为旁注,我将补充:
- 如果你想确保你的代码有效地将用户重定向到你想要的地方,确保你的模块是最后执行的;如果实现
hook\u form\u alter()
的任何其他模块添加表单提交处理程序以将用户重定向到其他页面,并且该模块在您的页面之后执行,那么您的模块将不会产生任何效果。为了确保您的模块在其他模块之后执行,您应该在模块安装期间或在更新挂钩中使用类似于以下的代码。(将“MYMODULE”替换为模块的短名称。)
- 您可以使用“MYMODULE\u form\u user\u login\u block\u alter()”来代替使用
MYMODULE\u form\u alter()
- 您应该附加新的表单提交处理程序,而不是替换现有的表单提交处理程序。这意味着您应该使用
$form['#submit'][]='user_login_submit_redirected'代码>
- 在模块中实现的函数应以模块的短名称作为前缀,这意味着“
MYMODULE\uu
”或“\umymodule\u
”(后者用于专用函数)。不使用此前缀可能会造成与其他模块(如用户模块)的兼容性问题,因为您正在使用的函数的名称以“User\uu
”开头
只是一个旁注-管理员有uid 1(您的代码检查0,这可能是匿名用户)。@HenrikOpel:这一点很好。谢谢。非常感谢你的回答和分享你的知识:你的补充笔记对我非常有用。但是我不明白为什么重定向必须控制在表单操作上。因为您发布的代码(相当于用户登录块的当前drupal实现)表明可以使用提交字段进行重定向:drupal函数确实执行重定向。我在第一个代码块中编写的代码是实际使用的用户登录块()
中的代码。该函数将该值用于“#action”,以始终将用户重定向到包含该块的页面,并允许在不使用任何附加函数(如表单提交处理程序)的情况下执行此操作。如果您想重定向使用登录块登录的用户,我认为您唯一的选择是我在回答中描述的。感谢您的澄清,因为user\u login\u submit函数也会使用以下行进行重定向:$form\u state['redirect']='user/'$用户->用户标识
I但操作可能不会更改,因为它可能会触发身份验证,而不是登录后的页面。重定向仅从登录表单发生,而不是从登录块发生。我在Drupal6测试站点中测试了它,同时以匿名用户的身份查看节点;登录后,我没有被重定向到用户页面。我的测试站点没有安装第三方模块;这意味着我描述的行为是Drupal 6的标准行为。我试图遵循您的方法。但它还没有起作用。我不知道如何确保我的代码在所有其他模块中最后运行。谢谢你的建议。但它没有起作用。实际上,我甚至可以在global$user之后设置exit()或die()代码>它没有任何效果,正如我所说,它似乎根本没有被调用。
db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE');