จนถึงตอนนี้ฉันได้พบกับ 3 ฟังก์ชั่นเหล่านี้ใน Drupal 7 แต่ฉันไม่แน่ใจจริงๆว่าความแตกต่างระหว่างพวกเขาคืออะไรและสิ่งใดที่เหมาะสมกว่าที่จะได้รับ ID โหนดในฟังก์ชั่นการเตรียมบล็อก
คุณสามารถให้ข้อมูลเชิงลึกใด ๆ ให้ฉัน
จนถึงตอนนี้ฉันได้พบกับ 3 ฟังก์ชั่นเหล่านี้ใน Drupal 7 แต่ฉันไม่แน่ใจจริงๆว่าความแตกต่างระหว่างพวกเขาคืออะไรและสิ่งใดที่เหมาะสมกว่าที่จะได้รับ ID โหนดในฟังก์ชั่นการเตรียมบล็อก
คุณสามารถให้ข้อมูลเชิงลึกใด ๆ ให้ฉัน
คำตอบ:
ฉันไม่แน่ใจจริงๆว่าความแตกต่างระหว่างพวกเขาคืออะไร
menu_get_object()
จะส่งคืนออบเจ็กต์โหนดสำหรับโหนดที่มี ID เป็น 1 หากหน้ากำลังแสดงคือ example.com/user/1 menu_get_object('user')
จะส่งคืนออบเจกต์ผู้ใช้สำหรับผู้ใช้ที่มี ID คือ 1 node_load
) ที่จะถูกเรียกให้โหลดวัตถุที่สอดคล้องกับส่วนหนึ่งของเส้นทางปัจจุบัน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 สำหรับความคิดเห็น
วิธีการทำงานในtemplate_preprocess_pageของ Drupal Core :
บรรทัด 2267 ของtheme.incและต่อไป:
if ($node = menu_get_object()) {
$variables['node'] = $node;
}
ใช้ template_preprocess_page menu_get_object หลังจากนั้นเป็นเพียงเรื่องของการตรวจสอบว่าโหนดถูกกำหนดและรับ $ node-> nid
สิ่งหนึ่งที่คุณต้องระวังคือนามแฝงของเส้นทาง
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];
arg(1);
ไม่ใช่วิธีที่แย่ในการทำ arg ()ทำงานบนพา ธ ภายในดังนั้นจะไม่ได้รับผลกระทบจากสมนามพา ธ
menu_get_object
(ซึ่งเพิ่งล้อมรอบmenu_get_item
ดังนั้นมันก็ดีพอ ๆ กัน)
if (arg(0) == 'node' && is_numeric(arg(1)))
จากนั้นarg(1)
เกือบ 99% จะส่งคืน ID โหนดให้คุณ แต่เพียงผู้เดียวarg(1)
ก็สามารถส่งคืน ID อื่น ๆ ให้คุณได้มากมาย
ใน Drupal 8 คุณสามารถรับอาร์กิวเมนต์ของ URL ตามสิ่งที่อยู่ในเส้นทาง
ในการรับ ID เพียงอย่างเดียว:
$nid = \Drupal::routeMatch()->getRawParameter('node');
หากคุณวางแผนที่จะโหลดวัตถุโหนดคุณสามารถรับมันด้วยวิธีนี้:
$node = \Drupal::routeMatch()->getParameter('node');
ในการค้นหาชื่อพารามิเตอร์คุณสามารถใช้:
$possible_parameters = \Drupal::routeMatch()->getParameters();