Рейтинг:0

Изменить вкладку пользователя по умолчанию

флаг it
MMT

После входа в систему пользователи будут перенаправлены на страницу своего профиля пользователя. Я добавил новую вкладку, Мой Dashboard с использованием крюк_меню(). Все работает хорошо.

После входа пользователей я бы хотел, чтобы они были перенаправлены на Мой Dashboard, но я не могу заставить его работать.

Я пробовал двумя способами, у обоих одна и та же проблема.

Сначала я попробовал с этим кодом.

функция mymodule_menu() {
  $items['пользователь/%пользователь/приборная панель'] = массив(
    'title' => t('Моя панель управления'),
    'обратный вызов страницы' => 'mymodule_dashboard',
    'аргументы страницы' => массив (1),
    'обратный вызов доступа' => ИСТИНА,
    'тип' => MENU_DEFAULT_LOCAL_TASK,
    'вес' => -20, 
  );
  
  возврат $items;
}

функция mymenu_menu_alter(&$items) {
  $items['пользователь/%пользователь/представление'] = массив(
    'тип' => MENU_LOCAL_TASK,
  );
  
  возврат $items;
}

Затем я попытался использовать следующий код.

функция mymodule_menu_alter(&$items) {
  $items['пользователь/%пользователь/приборная панель'] = массив(
    'title' => t('Моя панель управления'),
    'обратный вызов страницы' => 'mymodule_dashboard',
    'аргументы страницы' => массив (1),
    'обратный вызов доступа' => ИСТИНА,
    'тип' => MENU_DEFAULT_LOCAL_TASK,
    'вес' => -20, 
  );

  $items['пользователь/%пользователь/представление'] = массив(
    'тип' => MENU_LOCAL_TASK,
  );
  
  возврат $items;
}

Я также почистил кеш.

Проблема в том, что после авторизации Вид вкладка исчезает как вкладка, "Моя панель управления" является активной вкладкой, но она имеет содержимое предыдущей Вид вкладка

Скриншот

URL-адрес после входа в систему https://example.com/users/myusername1, который не является URL-адресом панели мониторинга. Когда я нажимаю между вкладками, Мой Dashboard сохраняет этот неправильный URL-адрес и отображает содержимое вкладки *View.

Я попробовал несколько вариантов между крюк_меню() и hook_menu_alter(), но я не могу заставить его работать.

Как я могу иметь Мой Dashboard и его собственный контент отображается как вкладка по умолчанию после входа в систему?

apaderno avatar
флаг us
`hook_menu_alter()` не нужно возвращать какое-либо значение.Однако это не причина того, что код не работает.
флаг it
MMT
Спасибо, apaderno. Не претендуя на роль эксперта, я читаю здесь, что hook_menu_alter на самом деле принимает один параметр https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/ hook_menu_alter/7.x В любом случае, это второстепенная деталь, так как даже с проблемой или без нее проблема остается. Приветствуются любые другие идеи
Рейтинг:0
флаг us

Изменение вкладки по умолчанию, отображаемой для страницы, не является способом перенаправления пользователей после их входа в систему.Это также работает только тогда, когда пользователи перенаправляются на страницу своего профиля пользователя после входа в систему. Если они перенаправляются на другую страницу, изменение вкладки по умолчанию для страницы /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,
  );
Рейтинг:0
флаг de

Вам нужна комбинация hook_user_login() (вызывается после входа пользователя в систему) и drupal_goto() (перенаправляет пользователя). Я не работал с D7 в течение нескольких лет, но, выбрасывая память, вы сможете сделать что-то вроде этого:

функция hook_user_login(&$edit, $account) {
  drupal_goto('пользователь/' . $account['id']. '/приборная панель');
  друпал_выход();
}
флаг it
MMT
Спасибо Джейпан. Я пробовал, но это не решает проблему. Проблема в том, что после входа в систему URL-адрес не .../dashboard, а site.com/users/username8169 . Как только я ввожу правильный URL-адрес вручную site.com/user/8169, он работает нормально. Но как заставить пользователя после входа в систему перейти на страницу .../dashboard? Также странно, что пропала вкладка Вид.
Jaypan avatar
флаг de
Хорошо, извините, я неправильно понял вашу проблему. Я полностью изменил ответ.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.