Изменение вкладки по умолчанию, отображаемой для страницы, не является способом перенаправления пользователей после их входа в систему.Это также работает только тогда, когда пользователи перенаправляются на страницу своего профиля пользователя после входа в систему. Если они перенаправляются на другую страницу, изменение вкладки по умолчанию для страницы /user/%user не приведет к тому, чего вы пытаетесь достичь.
Чтобы перенаправить пользователей после того, как они ввели свои учетные данные в форму входа (всякий раз, когда они отображаются на странице входа или в блоке входа), необходимо:
- Добавьте обработчик отправки формы в форму входа
- В этом обработчике отправки перенаправьте пользователей на нужный URL-адрес.
функция mymodule_form_user_login_alter(&$form, &$form_state) {
$form['#submit'][] = 'mymodule_user_login_submit';
}
функция mymodule_user_login_submit($form, &$form_state) {
если (!пусто($form_state['uid'])) {
// Пользователь успешно авторизовался.
// $form_state['uid'] устанавливается функцией user_login_authenticate_validate(), когда учетные данные для входа верны.
$form_state['redirect'] = "пользователь/{$form_state['uid']}/панель управления";
}
}
С hook_user_login()
реализации вызываются из user_login_finalize()
, они вызываются не только после входа пользователей в систему через пользовательский интерфейс; например, они вызываются после того, как пользователь перешел по ссылке для сброса своего пароля, что приводит к запуску Drupal. user_pass_reset()
, функция, содержащая следующий код.
если ($ действие == 'логин') {
$пользователь = $аккаунт;
user_login_finalize();
flux_clear_event('pass_reset_user', $account->uid);
watchdog('user', 'Пользователь %name использовал одноразовую ссылку для входа в систему в момент времени %timestamp.', array(
'%name' => $account->имя,
'%timestamp' => $timestamp,
));
drupal_set_message(t('Вы только что использовали одноразовую ссылку для входа. Больше нет необходимости использовать эту ссылку для входа. Пожалуйста, измените свой пароль.'));
$токен = drupal_random_key();
$_SESSION['pass_reset_' . $user->uid] = $токен;
drupal_goto('пользователь/' . $user->uid . '/edit', массив(
'запрос' => массив(
'pass-reset-token' => $токен,
),
));
Вызов drupal_goto()
внутри hook_user_login()
мешает этому и другим случаям и не позволяет Drupal вызывать все hook_user_login()
реализации.
А hook_user_login()
реализация может установить $изменить['перенаправить']
для перенаправления пользователей.
функция mymodule_user_login(&$edit, $account) {
если (is_array($edit)) {
$edit['redirect'] = "user/{$account->uid}/dashboard";
}
}
drupal_goto()
, звонил из друпал_процесс_форма()
(с помощью drupal_redirect_form()
) когда форма отправляется без ошибок, использует значение $_GET['пункт назначения']
когда его значение не является внешним URL. Чтобы убедиться, что пользователи перенаправляются по нужному пути, реализация может быть аналогична следующей.
функция mymodule_user_login(&$edit, $account) {
если (strpos(current_path(), 'user/reset/') !== 0) {
// Избегайте перенаправления пользователей, которые сбросили свой пароль.
$_GET['destination'] = "user/{$account->uid}/dashboard";
}
}
Код также должен проверять, не перенаправляет ли он пользователей в тех случаях, когда этого не следует делать, и проверять, что он не вызывает проблем с другими установленными модулями, например Двухфакторная аутентификация (TFA) модуль. По этой причине я бы не стал устанавливать $_GET['пункт назначения']
и используйте одно из других решений, которые я описал в этом ответе.
Что касается https://example.com/users/myusername1 отображается как URL-адрес, который использует псевдоним пути. Модули, реализующие крюк_меню()
не нужно беспокоиться о псевдонимах пути, так как Drupal использует псевдоним пути, чтобы найти страницу для отображения и вызывает обратный вызов страницы, связанный с этой страницей.
Если затем вам нужно изменить вкладку по умолчанию, отображаемую на user/%user, по разным причинам, я бы использовал код, аналогичный следующему.
функция mymodule_menu_alter(&$items) {
если (isset($items['пользователь/%пользователь'])) {
$items['пользователь/%пользователь/представление'] = массив(
'название' => 'Вид',
'тип' => MENU_LOCAL_TASK,
'вес' => -10,
'обратный вызов страницы' => 'user_view_page',
'аргументы страницы' => массив (1),
'обратный вызов доступа' => 'user_view_access',
'аргументы доступа' => массив (1),
);
$items['пользователь/%пользователь'] = массив(
'title' => 'Мой аккаунт',
'обратный вызов title' => 'user_page_title',
'аргументы заголовка' => массив (1),
'обратный вызов страницы' => 'mymodule_dashboard',
'аргументы страницы' => массив (1),
'обратный вызов доступа' => 'user_view_access',
'аргументы доступа' => массив (1),
'menu_name' => 'навигация',
);
$items['пользователь/%пользователь/приборная панель'] = массив(
'title' => 'Моя панель инструментов',
'тип' => MENU_DEFAULT_LOCAL_TASK,
'вес' => -20,
);
}
}
Причина почему $items['пользователь/%пользователь/приборная панель']
содержит несколько элементов, является то, что MENU_DEFAULT_LOCAL_TASK
пункт меню наследует обратный вызов страницы, аргументы страницы, обратный вызов доступа и аргументы доступа от своего родительского пункта меню, в этом случае $items['пользователь/%пользователь']
.
Это описано в крюк_меню()
документации, а также по этой причине следующие пункты меню, взятые из основного кода Drupal, определены таким образом.
$items['узел/%узел'] = массив(
'обратный вызов title' => 'node_page_title',
'аргументы заголовка' => массив (1),
'обратный вызов страницы' => 'node_page_view',
'аргументы страницы' => массив (1),
'обратный вызов доступа' => 'node_access',
'аргументы доступа' => массив('представление', 1),
);
$items['узел/%узел/представление'] = массив(
'название' => 'Вид',
'тип' => MENU_DEFAULT_LOCAL_TASK,
'вес' => -10,
);
$items['admin/config/search/path'] = массив(
'title' => 'Псевдонимы URL',
'description' => "Измените URL-пути вашего сайта, назначив им псевдонимы.",
'обратный вызов страницы' => 'path_admin_overview',
'аргументы доступа' => массив('администрирование псевдонимов URL'),
'вес' => -5,
'файл' => 'путь.admin.inc',
);
$items['admin/config/search/path/list'] = array(
'название' => 'Список',
'тип' => MENU_DEFAULT_LOCAL_TASK,
'вес' => -10,
);
$items['admin'] = массив(
'title' => 'Администрация',
'аргументы доступа' => массив('доступ к административным страницам'),
'обратный вызов страницы' => 'system_admin_menu_block_page',
'вес' => 9,
'menu_name' => 'управление',
'файл' => 'system.admin.inc',
);
$items['admin/tasks'] = массив(
'title' => 'Задачи',
'тип' => MENU_DEFAULT_LOCAL_TASK,
'вес' => -20,
);