Score:0

เปลี่ยนแท็บผู้ใช้เริ่มต้น

ธง it
MMT

หลังจากเข้าสู่ระบบ ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าโปรไฟล์ผู้ใช้ของตน ฉันได้เพิ่มแท็บใหม่ แดชบอร์ดของฉัน โดยใช้ hook_menu(). ทุกอย่างทำงานได้ดี

หลังจากที่ผู้ใช้เข้าสู่ระบบ ฉันต้องการให้พวกเขาเปลี่ยนเส้นทางไปที่ แดชบอร์ดของฉันแต่ฉันไม่สามารถทำให้มันใช้งานได้

ฉันลองใช้สองวิธีซึ่งทั้งสองมีปัญหาเดียวกัน

ก่อนอื่นฉันลองด้วยรหัสนี้

ฟังก์ชัน mymodule_menu () {
  $items['user/%user/dashboard'] = อาร์เรย์(
    'title' => t('แดชบอร์ดของฉัน'),
    'page callback' => 'mymodule_dashboard',
    'อาร์กิวเมนต์หน้า' => อาร์เรย์(1),
    'เข้าถึงการโทรกลับ' => TRUE,
    'ประเภท' => MENU_DEFAULT_LOCAL_TASK,
    'น้ำหนัก' => -20, 
  );
  
  คืนสินค้า $;
}

ฟังก์ชัน mymenu_menu_alter(&$items) {
  $items['user/%user/view'] = array(
    'ประเภท' => MENU_LOCAL_TASK,
  );
  
  คืนสินค้า $;
}

จากนั้นฉันลองด้วยรหัสต่อไปนี้

ฟังก์ชัน mymodule_menu_alter(&$items) {
  $items['user/%user/dashboard'] = อาร์เรย์(
    'title' => t('แดชบอร์ดของฉัน'),
    'page callback' => 'mymodule_dashboard',
    'อาร์กิวเมนต์หน้า' => อาร์เรย์(1),
    'เข้าถึงการโทรกลับ' => TRUE,
    'ประเภท' => MENU_DEFAULT_LOCAL_TASK,
    'น้ำหนัก' => -20, 
  );

  $items['user/%user/view'] = array(
    'ประเภท' => MENU_LOCAL_TASK,
  );
  
  คืนสินค้า $;
}

ฉันยังล้างแคช

ปัญหาคือหลังจากเข้าสู่ระบบแล้ว ดู แท็บหายไปเป็นแท็บ "แดชบอร์ดของฉัน" เป็นแท็บที่ใช้งานอยู่ แต่มีเนื้อหาของแท็บก่อนหน้า ดู แท็บ

ภาพหน้าจอ

URL หลังจากการเข้าสู่ระบบคือ https://example.com/users/myusername1ซึ่งไม่ใช่ URL แดชบอร์ด เมื่อฉันคลิกระหว่างแท็บ แดชบอร์ดของฉัน เก็บ URL ที่ไม่ถูกต้องนี้ไว้และแสดงเนื้อหาของแท็บ *ดู

ฉันลองใช้รูปแบบต่างๆ ระหว่าง hook_menu() และ hook_menu_alter()แต่ฉันไม่สามารถทำให้มันใช้งานได้

ฉันจะมีได้อย่างไร แดชบอร์ดของฉัน และเนื้อหาของตัวเองแสดงเป็นแท็บเริ่มต้นหลังจากเข้าสู่ระบบ?

apaderno avatar
us flag
`hook_menu_alter()` ไม่จำเป็นต้องคืนค่าใดๆนั่นไม่ใช่เหตุผลที่รหัสไม่ทำงาน
it flag
MMT
ขอบคุณ apaderno สิ่งที่ฉันกำลังอ่านอยู่นี้โดยไม่แอบอ้างเป็นผู้เชี่ยวชาญคือ hook_menu_alter ใช้หนึ่งพารามิเตอร์จริง ๆ https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/ hook_menu_alter/7.x อย่างไรก็ตาม นี่เป็นรายละเอียดด้านข้าง แม้ว่าจะมีหรือไม่มีปัญหาก็ตาม ความคิดอื่น ๆ จะได้รับการต้อนรับ
Score: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) {
  ถ้า (!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,
  );
Score:0
ธง de

คุณต้องการส่วนผสมของ hook_user_login() (เรียกหลังจากผู้ใช้เข้าสู่ระบบ) และ drupal_goto() (เปลี่ยนเส้นทางผู้ใช้) ฉันไม่ได้ทำงานกับ D7 มาสองสามปีแล้ว แต่คุณควรจะทำสิ่งนี้ได้:

ฟังก์ชัน hook_user_login (&$ แก้ไข, $บัญชี) {
  drupal_goto('user/' . $account['id'] . '/แดชบอร์ด');
  drupal_exit();
}
it flag
MMT
ขอบคุณเจ๊ปาน. ฉันลองแล้ว แต่ไม่สามารถแก้ปัญหาได้ ปัญหาคือหลังจากที่ฉันเข้าสู่ระบบแล้ว url ไม่ใช่ .../dashboard แต่เป็น site.com/users/username8169 แทน เมื่อฉันพิมพ์ URL ที่ถูกต้องด้วยตนเอง site.com/user/8169 มันก็ใช้งานได้ดี แต่จะรับผู้ใช้หลังจากเข้าสู่ระบบเพื่อไปยังหน้า .../แดชบอร์ดได้อย่างไร เป็นเรื่องแปลกที่แท็บมุมมองหายไป
Jaypan avatar
de flag
ตกลง ขอโทษที่ฉันเข้าใจปัญหาของคุณผิด ฉันเปลี่ยนคำตอบโดยสิ้นเชิง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา