1

我想重定向通过用户登录块登录的用户。我所拥有的是一个包含以下代码的模块:

附录,3.9.2011,15:30h:根据 kiamlaluno 的建议更改了代码。

附录,3.9.2011,17:08h:小修复:将节点/管理员更改为管理员。

附录,3.9.2011,17:24h:已删除[] -> 代码现在是这样工作的,但不要忘记更改 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。
4

2 回答 2

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

为了让它工作,你应该首先 unset $form[#action],然后执行你已经在你的hook_form_alter()实现中执行的代码。

作为旁注,我将添加:

  • 如果您想确保您的代码有效地将用户重定向到您想要的位置,请确保您的模块最后执行;如果任何其他实现的模块hook_form_alter()添加了表单提交处理程序以将用户重定向到不同的页面,并且该模块在您之后执行,那么您的模块将没有任何效果。为了确保您的模块在其他模块之后执行,您应该在安装模块期间或在更新挂钩中使用类似于以下的代码。(将“MYMODULE”替换为模块的简称。)

    db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE');
    
  • 您可以使用 MYMODULE_form_user_login_block_alter()而不是使用MYMODULE_form_alter(),这不需要检查表单 ID。

  • 您应该附加新的表单提交处理程序,而不是替换现有的。这意味着您应该使用$form['#submit'][] = 'user_login_submit_redirected';.
  • 模块中实现的函数应以模块的简称为前缀,表示“ MYMODULE_”或“ _MYMODULE_”(后者用于私有函数)。不使用此类前缀可能会导致与其他模块(例如用户模块)的兼容性问题,因为您正在使用的函数的名称以“ user_.”开头。
于 2011-09-03T10:31:50.613 回答
-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;
  }
}
于 2011-09-03T08:44:42.750 回答