การเปลี่ยนแท็บเริ่มต้นที่แสดงสำหรับเพจไม่ใช่วิธีเปลี่ยนเส้นทางผู้ใช้หลังจากเข้าสู่ระบบนอกจากนี้ยังใช้งานได้เฉพาะเมื่อผู้ใช้ถูกเปลี่ยนเส้นทางไปยังหน้าโปรไฟล์ผู้ใช้หลังจากที่เข้าสู่ระบบแล้ว หากผู้ใช้ถูกเปลี่ยนเส้นทางไปยังหน้าอื่น การเปลี่ยนแท็บเริ่มต้นสำหรับหน้า /user/%user จะไม่บรรลุตามที่คุณต้องการ
หากต้องการเปลี่ยนเส้นทางผู้ใช้หลังจากที่ป้อนข้อมูลประจำตัวในแบบฟอร์มการเข้าสู่ระบบแล้ว (เมื่อใดก็ตามที่ปรากฏในหน้าเข้าสู่ระบบหรือในบล็อกการเข้าสู่ระบบ) ให้ดำเนินการดังนี้
- เพิ่มตัวจัดการการส่งแบบฟอร์มในแบบฟอร์มการเข้าสู่ระบบ
- ในตัวจัดการการส่งนั้น ให้เปลี่ยนเส้นทางผู้ใช้ไปยัง URL ที่ต้องการ
ฟังก์ชัน mymodule_form_user_login_alter(&$form, &$form_state) {
$form['#submit'][] = 'mymodule_user_login_submit';
}
ฟังก์ชัน mymodule_user_login_submit($form, &$form_state) {
ถ้า (!empty($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 = $บัญชี;
user_login_finalize();
flood_clear_event('pass_reset_user', $account->uid);
watchdog('user', 'User %name used one-time login link at time %timestamp.', array(
'%name' => $บัญชี->ชื่อ,
'%timestamp' => $timestamp,
));
drupal_set_message(t('คุณเพิ่งใช้ลิงค์เข้าสู่ระบบแบบใช้ครั้งเดียว ไม่จำเป็นต้องใช้ลิงค์นี้ในการเข้าสู่ระบบอีกต่อไป กรุณาเปลี่ยนรหัสผ่าน'));
$token = drupal_random_key();
$_SESSION['pass_reset_' . $user->uid] = $โทเค็น;
drupal_goto('user/' . $user->uid . '/edit', อาร์เรย์(
'query' => อาร์เรย์(
'pass-reset-token' => $โทเค็น,
),
));
โทร drupal_goto()
ข้างใน hook_user_login()
รบกวนสิ่งนั้นและกรณีอื่น ๆ และไม่อนุญาตให้ Drupal เรียกใช้ทั้งหมด hook_user_login()
การใช้งาน
ก hook_user_login()
สามารถตั้งค่าการใช้งานได้ $แก้ไข['เปลี่ยนเส้นทาง']
เพื่อเปลี่ยนเส้นทางผู้ใช้
ฟังก์ชัน mymodule_user_login (&$ แก้ไข, $บัญชี) {
ถ้า (is_array($ แก้ไข)) {
$edit['redirect'] = "ผู้ใช้/{$account->uid}/dashboard";
}
}
drupal_goto()
, เรียกจาก drupal_process_form()
(ทาง drupal_redirect_form()
) เมื่อส่งแบบฟอร์มโดยไม่มีข้อผิดพลาด ให้ใช้ค่าของ $_GET['ปลายทาง']
เมื่อค่าไม่ใช่ URL ภายนอก เพื่อให้แน่ใจว่าผู้ใช้ถูกเปลี่ยนเส้นทางไปยังเส้นทางที่ต้องการ การใช้งานอาจคล้ายกับเส้นทางต่อไปนี้
ฟังก์ชัน mymodule_user_login (&$ แก้ไข, $บัญชี) {
ถ้า (strpos(current_path(), 'ผู้ใช้/รีเซ็ต/') !== 0) {
// หลีกเลี่ยงการเปลี่ยนเส้นทางผู้ใช้ที่รีเซ็ตรหัสผ่าน
$_GET['destination'] = "ผู้ใช้/{$account->uid}/dashboard";
}
}
โค้ดควรตรวจสอบว่าไม่ได้เปลี่ยนเส้นทางผู้ใช้ในกรณีที่ไม่ควรเปลี่ยน และตรวจสอบว่าไม่ได้ทำให้เกิดปัญหากับโมดูลอื่นๆ ที่ติดตั้ง เช่น การรับรองความถูกต้องด้วยสองปัจจัย (TFA) โมดูล. ด้วยเหตุนี้ฉันจึงหลีกเลี่ยงการตั้งค่า $_GET['ปลายทาง']
และใช้วิธีแก้ปัญหาอื่นที่ฉันอธิบายไว้ในคำตอบนี้
ส่วน https://example.com/users/myusername1 ปรากฏเป็น URL ซึ่งใช้นามแฝงของเส้นทาง โมดูลที่ใช้ hook_menu()
ไม่ต้องกังวลเกี่ยวกับชื่อแทนพาธ เนื่องจาก Drupal ใช้ชื่อแทนพาธเพื่อค้นหาหน้าที่จะแสดงและเรียกการเรียกกลับของเพจที่เกี่ยวข้องกับเพจนั้น
หากคุณต้องการเปลี่ยนแท็บเริ่มต้นที่แสดงบน user/%user ด้วยเหตุผลที่ต่างกัน ฉันจะใช้โค้ดที่คล้ายกับอันต่อไปนี้
ฟังก์ชัน mymodule_menu_alter(&$items) {
ถ้า (isset($items['user/%user'])) {
$items['user/%user/view'] = array(
'title' => 'ดู',
'ประเภท' => MENU_LOCAL_TASK,
'น้ำหนัก' => -10,
'page callback' => 'user_view_page',
'อาร์กิวเมนต์หน้า' => อาร์เรย์(1),
'เข้าถึงการโทรกลับ' => 'user_view_access',
'อาร์กิวเมนต์การเข้าถึง' => อาร์เรย์(1),
);
$items['user/%user'] = อาร์เรย์(
'title' => 'บัญชีของฉัน',
'title callback' => 'user_page_title',
'อาร์กิวเมนต์หัวเรื่อง' => อาร์เรย์(1),
'page callback' => 'mymodule_dashboard',
'อาร์กิวเมนต์หน้า' => อาร์เรย์(1),
'เข้าถึงการโทรกลับ' => 'user_view_access',
'อาร์กิวเมนต์การเข้าถึง' => อาร์เรย์(1),
'menu_name' => 'การนำทาง',
);
$items['user/%user/dashboard'] = อาร์เรย์(
'title' => 'แดชบอร์ดของฉัน',
'ประเภท' => MENU_DEFAULT_LOCAL_TASK,
'น้ำหนัก' => -20,
);
}
}
เหตุผลว่าทำไม $items['user/%user/dashboard']
มีไม่กี่รายการนั่นคือ MENU_DEFAULT_LOCAL_TASK
รายการเมนูสืบทอดการเรียกกลับหน้า อาร์กิวเมนต์ของเพจ การเรียกกลับการเข้าถึง และการเข้าถึงอาร์กิวเมนต์จากรายการเมนูหลัก ในกรณีนี้ $รายการ['ผู้ใช้/%ผู้ใช้']
.
สิ่งนี้อธิบายไว้ใน hook_menu()
เอกสารประกอบ และยังเป็นเหตุผลที่รายการเมนูต่อไปนี้ซึ่งนำมาจากโค้ดหลักของ Drupal ถูกกำหนดในลักษณะนั้น
$items['node/%node'] = อาร์เรย์(
'title callback' => 'node_page_title',
'อาร์กิวเมนต์หัวเรื่อง' => อาร์เรย์(1),
'page callback' => 'node_page_view',
'อาร์กิวเมนต์หน้า' => อาร์เรย์(1),
'เข้าถึงการโทรกลับ' => 'node_access',
'อาร์กิวเมนต์การเข้าถึง' => อาร์เรย์ ('ดู', 1),
);
$items['node/%node/view'] = อาร์เรย์(
'title' => 'ดู',
'ประเภท' => MENU_DEFAULT_LOCAL_TASK,
'น้ำหนัก' => -10,
);
$items['admin/config/search/path'] = อาร์เรย์(
'title' => 'URL นามแฝง',
'description' => "เปลี่ยนเส้นทาง URL ของไซต์ของคุณโดยใช้นามแฝง",
'page callback' => 'path_admin_overview',
'access arguments' => array('ดูแล url aliases'),
'น้ำหนัก' => -5,
'ไฟล์' => 'path.admin.inc',
);
$items['admin/config/search/path/list'] = อาร์เรย์(
'title' => 'รายการ',
'ประเภท' => MENU_DEFAULT_LOCAL_TASK,
'น้ำหนัก' => -10,
);
$items['admin'] = อาร์เรย์(
'title' => 'การบริหาร',
'อาร์กิวเมนต์การเข้าถึง' => อาร์เรย์ ('เข้าถึงหน้าการดูแลระบบ'),
'page callback' => 'system_admin_menu_block_page',
'น้ำหนัก' => 9,
'menu_name' => 'การจัดการ',
'ไฟล์' => 'system.admin.inc',
);
$items['admin/tasks'] = อาร์เรย์(
'title' => 'งาน',
'ประเภท' => MENU_DEFAULT_LOCAL_TASK,
'น้ำหนัก' => -20,
);