Điểm:0

Thay đổi tab người dùng mặc định

lá cờ it
MMT

Sau khi đăng nhập, người dùng sẽ được chuyển hướng đến trang hồ sơ người dùng của họ. Tôi đã thêm một tab mới, Bảng điều khiển của tôi sử dụng hook_menu(). Mọi thứ hoạt động tốt.

Sau khi người dùng đăng nhập, tôi muốn họ được chuyển hướng đến Bảng điều khiển của tôi, nhưng tôi không thể làm cho nó hoạt động.

Tôi đã thử theo hai cách, cả hai đều có cùng một vấn đề.

Đầu tiên tôi đã thử với mã này.

hàm mymodule_menu() {
  $items['user/%user/dashboard'] = mảng(
    'tiêu đề' => t('Bảng điều khiển của tôi'),
    'gọi lại trang' => 'mymodule_dashboard',
    'đối số trang' => mảng (1),
    'truy cập gọi lại' => TRUE,
    'loại' => MENU_DEFAULT_LOCAL_TASK,
    'trọng lượng' => -20, 
  );
  
  trả lại các mặt hàng $;
}

hàm mymenu_menu_alter(&$items) {
  $items['user/%user/view'] = mảng(
    'loại' => MENU_LOCAL_TASK,
  );
  
  trả lại các mặt hàng $;
}

Sau đó, tôi đã thử với đoạn mã sau.

hàm mymodule_menu_alter(&$items) {
  $items['user/%user/dashboard'] = mảng(
    'tiêu đề' => t('Bảng điều khiển của tôi'),
    'gọi lại trang' => 'mymodule_dashboard',
    'đối số trang' => mảng (1),
    'truy cập gọi lại' => TRUE,
    'loại' => MENU_DEFAULT_LOCAL_TASK,
    'trọng lượng' => -20, 
  );

  $items['user/%user/view'] = mảng(
    'loại' => MENU_LOCAL_TASK,
  );
  
  trả lại các mặt hàng $;
}

Tôi cũng đã xóa bộ nhớ cache.

Vấn đề là sau khi đăng nhập, Lượt xem tab biến mất dưới dạng tab, "Trang tổng quan của tôi" là tab đang hoạt động, nhưng nó có nội dung của tab trước đó Lượt xem chuyển hướng.

ảnh chụp màn hình

URL sau khi đăng nhập là https://example.com/users/myusername1, không phải là URL trang tổng quan. Khi tôi nhấp vào giữa các tab, Bảng điều khiển của tôi giữ URL sai này và hiển thị nội dung của tab *Chế độ xem.

Tôi đã thử một vài biến thể giữa hook_menu()hook_menu_alter(), nhưng tôi không thể làm cho nó hoạt động.

Làm thế nào tôi có thể có Bảng điều khiển của tôi và nội dung của chính nó được hiển thị dưới dạng tab mặc định sau khi đăng nhập?

apaderno avatar
lá cờ us
`hook_menu_alter()` không cần trả lại bất kỳ giá trị nào.Tuy nhiên, đó không phải là lý do khiến mã không hoạt động.
lá cờ it
MMT
Cảm ơn apaderno, Không giả vờ là một chuyên gia, những gì tôi đang đọc ở đây là hook_menu_alter thực sự lấy một tham số https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/ hook_menu_alter/7.x Dù sao thì đây cũng là một chi tiết phụ, vì dù có hay không thì vấn đề vẫn còn đó. Bất kỳ ý tưởng nào khác sẽ được hoan nghênh
Điểm:0
lá cờ us

Thay đổi tab mặc định được hiển thị cho một trang không phải là cách để chuyển hướng người dùng sau khi họ đăng nhập.Nó cũng chỉ hoạt động khi người dùng được chuyển hướng đến trang hồ sơ người dùng của họ sau khi họ đăng nhập. Nếu họ được chuyển hướng đến một trang khác, việc thay đổi tab mặc định cho trang /user/%user sẽ không đạt được những gì bạn đang cố gắng đạt được.

Để chuyển hướng người dùng sau khi họ đã nhập thông tin đăng nhập vào biểu mẫu đăng nhập (bất cứ khi nào nó được hiển thị trên trang đăng nhập hoặc trong khối đăng nhập) là:

  • Thêm trình xử lý gửi biểu mẫu vào biểu mẫu đăng nhập
  • Trong trình xử lý gửi đó, hãy chuyển hướng người dùng đến URL mong muốn
function mymodule_form_user_login_alter(&$form, &$form_state) {
  $form['#submit'][] = 'mymodule_user_login_submit';
}

function mymodule_user_login_submit($form, &$form_state) {
  if (!empty($form_state['uid'])) {
    // Người dùng đã đăng nhập thành công.
    // $form_state['uid'] được đặt bởi user_login_authenticate_validate() khi thông tin đăng nhập chính xác.
    $form_state['redirect'] = "người dùng/{$form_state['uid']}/dashboard";
  }
}

Từ hook_user_login() triển khai được gọi từ user_login_FINFINize(), chúng không chỉ được gọi sau khi người dùng đăng nhập từ giao diện người dùng; ví dụ: chúng được gọi sau khi người dùng nhấp vào liên kết để đặt lại mật khẩu của họ, điều này khiến Drupal chạy user_pass_reset(), hàm chứa đoạn mã sau.

if ($action == 'đăng nhập') {
  $user = $account;
  user_login_finalize();
  flood_clear_event('pass_reset_user', $account->uid);
  watchdog('user', 'User %name đã sử dụng liên kết đăng nhập một lần tại thời điểm %timestamp.', array(
    '%name' => $account->name,
    '%dấu thời gian' => $dấu thời gian,
  ));
  drupal_set_message(t('Bạn vừa sử dụng liên kết đăng nhập một lần của mình. Không cần sử dụng liên kết này để đăng nhập nữa. Vui lòng thay đổi mật khẩu của bạn.'));
  $token = drupal_random_key();
  $_SESSION['pass_reset_' . $user->uid] = $token;
  drupal_goto('user/' . $user->uid . '/edit', array(
    'truy vấn' => mảng (
      'pass-reset-token' => $token,
    ),
  ));

gọi drupal_goto() phía trong hook_user_login() can thiệp vào trường hợp đó và các trường hợp khác, đồng thời không cho phép Drupal gọi tất cả các hook_user_login() triển khai.

Một hook_user_login() thực hiện có thể thiết lập $edit['chuyển hướng'] để chuyển hướng người dùng.

function mymodule_user_login(&$edit, $account) {
  nếu (is_array($edit)) {
    $edit['redirect'] = "người dùng/{$account->uid}/dashboard";
  }
}

drupal_goto(), gọi từ drupal_ process_form() (qua drupal_redirect_form()) khi một biểu mẫu được gửi mà không có lỗi, hãy sử dụng giá trị của $_GET['điểm đến'] khi giá trị của nó không phải là một URL bên ngoài. Để đảm bảo người dùng được chuyển hướng đến đường dẫn mong muốn, việc triển khai có thể tương tự như sau.

function mymodule_user_login(&$edit, $account) {
  if (strpos(current_path(), 'user/reset/') !== 0) {
    // Tránh chuyển hướng người dùng đặt lại mật khẩu của họ.
    $_GET['destination'] = "người dùng/{$account->uid}/dashboard";
  }
}

Mã này cũng phải kiểm tra xem nó có đang chuyển hướng người dùng trong trường hợp không nên không và xác minh rằng nó không gây ra sự cố với các mô-đun đã cài đặt khác, chẳng hạn như Xác thực hai yếu tố (TFA) mô-đun. Vì lý do này, tôi sẽ tránh thiết lập $_GET['điểm đến'] và sử dụng một trong những giải pháp khác mà tôi đã mô tả trong câu trả lời này.

Đối với https://example.com/users/myusername1 xuất hiện dưới dạng URL, nghĩa là đang sử dụng bí danh đường dẫn. Các mô-đun thực hiện hook_menu() không cần lo lắng về bí danh đường dẫn, vì Drupal sử dụng bí danh đường dẫn để tìm trang hiển thị và gọi lệnh gọi lại trang được liên kết với trang đó.

Nếu sau đó bạn cần thay đổi tab mặc định được hiển thị trên người dùng/% người dùng, vì những lý do khác nhau, tôi sẽ sử dụng mã tương tự như sau.

hàm mymodule_menu_alter(&$items) {
  if (isset($items['user/%user'])) {
    $items['user/%user/view'] = mảng(
      'tiêu đề' => 'Xem',
      'loại' => MENU_LOCAL_TASK,
      'trọng lượng' => -10,
      'gọi lại trang' => 'user_view_page',
      'đối số trang' => mảng (1),
      'gọi lại truy cập' => 'user_view_access',
      'đối số truy cập' => mảng (1),
    );

    $items['user/%user'] = mảng(
      'tiêu đề' => 'Tài khoản của tôi',
      'gọi lại tiêu đề' => 'user_page_title',
      'đối số tiêu đề' => mảng (1),
      'gọi lại trang' => 'mymodule_dashboard',
      'đối số trang' => mảng (1),
      'gọi lại truy cập' => 'user_view_access',
      'đối số truy cập' => mảng (1),
      'menu_name' => 'điều hướng',
    );

    $items['user/%user/dashboard'] = mảng(
      'title' => 'Bảng điều khiển của tôi',
      'loại' => MENU_DEFAULT_LOCAL_TASK,
      'trọng lượng' => -20, 
    );
  }
}

Lý do tại sao $items['user/%user/dashboard'] chứa ít mục là một MENU_DEFAULT_LOCAL_TASK mục menu kế thừa gọi lại trang, đối số trang, truy cập gọi lại và truy cập đối số từ mục menu chính của nó, trong trường hợp này $items['user/%user'].
Điều này được mô tả trong hook_menu() tài liệu, và đó cũng là lý do các mục menu sau đây, được lấy từ mã lõi Drupal, được định nghĩa theo cách đó.

  $items['node/%node'] = mảng(
    'gọi lại tiêu đề' => 'node_page_title',
    'đối số tiêu đề' => mảng (1),
    'gọi lại trang' => 'node_page_view',
    'đối số trang' => mảng (1),
    'gọi lại truy cập' => 'node_access',
    'đối số truy cập' => mảng ('khung nhìn', 1),
  );

  $items['node/%node/view'] = mảng(
    'tiêu đề' => 'Xem',
    'loại' => MENU_DEFAULT_LOCAL_TASK,
    'trọng lượng' => -10,
  );
  $items['admin/config/search/path'] = mảng(
    'tiêu đề' => 'Bí danh URL',
    'description' => "Thay đổi đường dẫn URL của trang web của bạn bằng cách đặt tên cho chúng.",
    'gọi lại trang' => 'path_admin_overview',
    'đối số truy cập' => mảng ('quản lý bí danh url'),
    'trọng lượng' => -5,
    'tệp' => 'path.admin.inc',
  );

  $items['admin/config/search/path/list'] = mảng(
    'tiêu đề' => 'Danh sách',
    'loại' => MENU_DEFAULT_LOCAL_TASK,
    'trọng lượng' => -10,
  );
  $items['admin'] = mảng(
    'tiêu đề' => 'Quản lý',
    'đối số truy cập' => mảng ('truy cập trang quản trị'),
    'gọi lại trang' => 'system_admin_menu_block_page',
    'trọng lượng' => 9,
    'menu_name' => 'quản lý',
    'tệp' => 'system.admin.inc',
  );

  $items['admin/tasks'] = mảng(
    'tiêu đề' => 'Nhiệm vụ',
    'loại' => MENU_DEFAULT_LOCAL_TASK,
    'trọng lượng' => -20,
  );
Điểm:0
lá cờ de

Bạn cần một sự kết hợp của hook_user_login() (được gọi sau khi người dùng đăng nhập) và drupal_goto() (chuyển hướng người dùng). Tôi đã không làm việc với D7 trong một vài năm, nhưng khi tắt bộ nhớ, bạn sẽ có thể làm một việc như thế này:

function hook_user_login(&$edit, $account) {
  drupal_goto('user/' . $account['id'] . '/dashboard');
  drupal_exit();
}
lá cờ it
MMT
Cảm ơn Jaypan. Tôi đã thử nó nhưng nó không giải quyết được vấn đề. Vấn đề là sau khi tôi đăng nhập, url không phải là .../dashboard, mà thay vào đó là site.com/users/username8169 . Sau khi tôi nhập đúng url theo cách thủ công site.com/user/8169 thì nó sẽ hoạt động tốt. Nhưng làm cách nào để người dùng sau khi đăng nhập đến được trang .../dashboard? Thật kỳ lạ khi tab Chế độ xem biến mất.
Jaypan avatar
lá cờ de
Ok, xin lỗi tôi đã hiểu sai vấn đề của bạn. Tôi đã thay đổi hoàn toàn câu trả lời.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.