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