ฉันจะรับ node ID จาก URL ได้อย่างไร


47

จนถึงตอนนี้ฉันได้พบกับ 3 ฟังก์ชั่นเหล่านี้ใน Drupal 7 แต่ฉันไม่แน่ใจจริงๆว่าความแตกต่างระหว่างพวกเขาคืออะไรและสิ่งใดที่เหมาะสมกว่าที่จะได้รับ ID โหนดในฟังก์ชั่นการเตรียมบล็อก

คุณสามารถให้ข้อมูลเชิงลึกใด ๆ ให้ฉัน


คุณกำลังทำสิ่งนี้ใน node.tpl.php หรืออะไรทำนองนั้น? ถ้าใช่คุณสามารถใช้ $ node-> nid
บาร์ต

ไม่ฉันทำสิ่งนี้ในฟังก์ชั่นบล็อกการประมวลผลล่วงหน้าแม้ว่าบล็อกจะพิมพ์บนหน้าโหนด
silkAdmin

คำตอบ:


63

ฉันไม่แน่ใจจริงๆว่าความแตกต่างระหว่างพวกเขาคืออะไร

  • menu_get_object ()ส่งคืนวัตถุที่เชื่อมโยงกับหน้าที่แสดงอยู่ในปัจจุบัน หากโค้ดถูกเรียกใช้งานเมื่อ Drupal แสดงหน้า example.com/node/1 menu_get_object()จะส่งคืนออบเจ็กต์โหนดสำหรับโหนดที่มี ID เป็น 1 หากหน้ากำลังแสดงคือ example.com/user/1 menu_get_object('user')จะส่งคืนออบเจกต์ผู้ใช้สำหรับผู้ใช้ที่มี ID คือ 1
  • menu_get_item ()ส่งคืนอาร์เรย์ที่มีดัชนีสำหรับแต่ละฟิลด์ที่อยู่ในตาราง "menu_router" รวมถึง:
    • เส้นทาง: เส้นทางปัจจุบันของการโทรกลับเมนู
    • load_functions: อาร์เรย์ของชื่อฟังก์ชั่น (เช่นnode_load) ที่จะถูกเรียกให้โหลดวัตถุที่สอดคล้องกับส่วนหนึ่งของเส้นทางปัจจุบัน
    • access_callback: การเรียกกลับที่ตรวจสอบว่าผู้ใช้ที่เข้าสู่ระบบในปัจจุบันมีการเข้าถึงรายการเมนูหรือไม่
    • page_callback: ชื่อของฟังก์ชันที่แสดงหน้าเว็บ
    • title: ชื่อเรื่องของหน้าที่เกี่ยวข้องกับรายการเมนู
  • drupal_lookup_path ()เป็นฟังก์ชันที่ส่งคืนพา ธ ภายในที่เกี่ยวข้องกับนามแฝงที่ส่งผ่านเป็นอาร์กิวเมนต์ ถ้า "หน้าแรก" เป็นนามแฝงที่เกี่ยวข้องกับ example.com/node/1 แล้วจะกลับมาdrupal_lookup_path("homepage") "node/1"นามแฝงของเส้นทางสามารถเชื่อมโยงกับเส้นทางภายในใด ๆ ไม่เพียง แต่กับเส้นทางของโหนด

และสิ่งใดที่เหมาะสมกว่าในการรับ ID โหนดในฟังก์ชันบล็อกการประมวลผลล่วงหน้า

หากสิ่งที่คุณต้องการได้รับคือ ID โหนดของโหนดที่แสดงในปัจจุบันจากนั้นคุณเพียงแค่ต้องใช้รหัสต่อไปนี้:

if (arg(0) == 'node') {
  $nid = arg(1);
}

หากคุณต้องการรับวัตถุโหนดคุณสามารถใช้รหัสต่อไปนี้:

if ($node = menu_get_object()) {
  // Use the node object.
}

ของตัวอย่างเหล่านั้นที่สองจะดีกว่าเพราะมันจะส่งกลับวัตถุโหนดที่ถูกต้องสำหรับเส้นทางภายในเช่นโหนด / 1 / revisions / 3 / ดู

เก็บไว้ในใจว่าบางฟังก์ชั่น preprocess $variables['node']เช่นคนสำหรับหน้าหรือโหนดมีอยู่แล้ว ซึ่งหมายความว่าในกรณีเหล่านั้นคุณเพียงแค่ต้องใช้ข้อมูลโค้ดต่อไปนี้ในฟังก์ชัน preprocess ของคุณโดยไม่ต้องกังวลว่าจะใช้ฟังก์ชันใด

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

สำหรับฟังก์ชั่น preprocess อื่น ๆ ตรวจสอบเอกสารเพื่อดูว่ามีตัวแปรใด ๆ ที่มีวัตถุโหนด ตัวอย่างเช่นเป็นกรณีtemplate_preprocess_comment()ที่ทำให้$variables['node']ฟังก์ชั่น preprocess สำหรับความคิดเห็น


7

วิธีการทำงานในtemplate_preprocess_pageของ Drupal Core :

บรรทัด 2267 ของtheme.incและต่อไป:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

ใช้ template_preprocess_page menu_get_object หลังจากนั้นเป็นเพียงเรื่องของการตรวจสอบว่าโหนดถูกกำหนดและรับ $ node-> nid


4

สิ่งหนึ่งที่คุณต้องระวังคือนามแฝงของเส้นทาง

drupal_get_normal_path($path)

เพื่อรับเส้นทางปัจจุบันใช้ตัวแปรระบบ $_SERVER["REQUEST_URI"]

(หากคุณอยู่ในหน้าโหนดที่คุณสามารถโทร$node->uri['path']ได้นี่จะส่งคืนเส้นทางที่ไม่ใช่นามแฝงจากนั้นอีกครั้งหากคุณอยู่ในหน้าโหนดคุณสามารถใช้งาน$node->nidได้)

สิ่งนี้จะส่งคืนโหนด / XXXX

ลองทำสิ่งที่ชอบ

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];

3
arg(1);

ไม่ใช่วิธีที่แย่ในการทำ arg ()ทำงานบนพา ธ ภายในดังนั้นจะไม่ได้รับผลกระทบจากสมนามพา ธ


สิ่งนี้เป็นจริงมันจะไม่ได้รับผลกระทบจากสมนามพา ธ แต่ถ้าคุณอยู่บน node / XXXXX คุณก็สามารถใช้ $ node-> nid ได้ @ ฝรั่งเศสคุณจะใช้ ARG (1) อีกที่ไหนและจะคืนสิ่งที่คุณต้องการ
iStryker

หากคุณอยู่ใน hook โมดูลคุณจะไม่สามารถเข้าถึงโหนด อาร์กิวเมนต์ของวิวอาจเป็นตัวอย่างได้เช่นกัน
Jeremy French

ขอบคุณ jeremy และ istryker ฉันได้อัปเดตคำถามของฉันแล้วมันอาจชัดเจนกว่านี้ .. ถึงแม้ว่าฉันจะลองวิธีแก้ปัญหาของคุณทั้งคู่ขอบคุณ
silkAdmin

1
มันเป็นความคิดที่แย่มากที่จะใช้ arg () คุณผูกตัวเองกับเส้นทางใช้menu_get_object(ซึ่งเพิ่งล้อมรอบmenu_get_itemดังนั้นมันก็ดีพอ ๆ กัน)

if (arg(0) == 'node' && is_numeric(arg(1)))จากนั้นarg(1)เกือบ 99% จะส่งคืน ID โหนดให้คุณ แต่เพียงผู้เดียวarg(1)ก็สามารถส่งคืน ID อื่น ๆ ให้คุณได้มากมาย
leymannx

2

ใน Drupal 8 คุณสามารถรับอาร์กิวเมนต์ของ URL ตามสิ่งที่อยู่ในเส้นทาง

ในการรับ ID เพียงอย่างเดียว:

$nid = \Drupal::routeMatch()->getRawParameter('node');

หากคุณวางแผนที่จะโหลดวัตถุโหนดคุณสามารถรับมันด้วยวิธีนี้:

$node = \Drupal::routeMatch()->getParameter('node');

ในการค้นหาชื่อพารามิเตอร์คุณสามารถใช้:

$possible_parameters = \Drupal::routeMatch()->getParameters();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.