วิธี / การนำไปใช้ที่รวดเร็วที่สุดสำหรับการโทรกลับ Ajax คืออะไร


18

ฉันมีแผนที่ที่โหลดเครื่องหมายผ่านอาแจ็กซ์ในกิจกรรมแผนที่หลายแห่ง ขณะนี้ฉันกำหนดการเรียกกลับหน้าเว็บที่กำหนดเองสำหรับhook_menu()รายการของฉันซึ่งพิมพ์ json / js ของฉัน

ตั้งแต่การเรียกกลับหน้าเว็บของฉันไม่ได้กลับเนื้อหาใด ๆ และเพียงพิมพ์เนื้อหา Drupal ไม่ทำให้แม่แบบเต็มรูปแบบเมนู ฯลฯ และจึงช่วยให้ผมกลับไปหน้าเว็บที่มีเพียง JavaScript ของฉัน

แม้ว่าจะใช้งานได้ แต่ฉันเชื่อว่า Drupal ยังคง bootstrapping อย่างสมบูรณ์ซึ่งหมายความว่าจะเพิ่มค่าใช้จ่ายจำนวนมากที่ฉันต้องการจะลดลง

ฉันได้ดูตัวจัดการการเรียกกลับ JavaScript ที่มีประสิทธิภาพสูงซึ่งมีตัวเองว่าเป็น "ตัวจัดการการเรียกกลับที่มีประสิทธิภาพสูงของ JavaScript" และในระยะสั้นดูเหมือนว่าจะเสนอคำjs.phpชมเชยindex.phpเพื่อส่งคำขอของคุณไปยังและกำหนด / จำกัด / เพิ่มประสิทธิภาพ bootstrapping Drupal ทำตามค่าเริ่มต้น

น่าเสียดายที่โครงการjsยังไม่มีการเปิดตัว D7 ( คำร้องหนึ่งรายการที่นี่ ) ซึ่งนำเราไปสู่จุดเริ่มต้น ...

วิธีที่เร็วที่สุดในการใช้งาน Ajax callback ใน Drupal คืออะไร

คำตอบ:


8

ฉันกำหนดการโทรกลับหน้ากำหนดเองสำหรับhook_menu()รายการของฉันซึ่งพิมพ์ json / js ของฉัน

นั่นคือสิ่งที่ Drupal 6 เสนอ กรอบ Drupal 7 AJAXสามารถทำเล็ก ๆ น้อย ๆ มากไปกว่านั้น ใช่มัน bootstraps Drupal แต่มันยังให้คุณสมบัติมากมายฟรี ในระยะสั้นคุณสามารถใช้ajax_deliver ()เป็นวิธีการจัดส่งหน้าและส่งคำสั่งไปยังเบราว์เซอร์

... Ajax อาจเปิดใช้งานโดยเพิ่มคลาสให้กับปุ่มและลิงก์ โดยการเพิ่มคลาส 'use-ajax' ลงในลิงก์ลิงก์จะถูกโหลดผ่านการเรียก Ajax เมื่อใช้วิธีนี้ href ของลิงก์สามารถมี '/ nojs /' เป็นส่วนหนึ่งของเส้นทาง เมื่อเฟรมเวิร์ก Ajax ทำการร้องขอมันจะแปลงค่านี้เป็น '/ ajax /' เซิร์ฟเวอร์สามารถบอกได้อย่างง่ายดายว่าคำขอนี้ทำผ่านคำขอ Ajax จริงหรืออยู่ในสถานะเสื่อมโทรมและตอบสนองอย่างเหมาะสม

อย่างไรก็ตามหากคุณต้องการหลีกเลี่ยงเฟรมเวิร์กด้วยเหตุผลด้านประสิทธิภาพแล้วไม่มีอะไรที่จะหยุดคุณเรียกไฟล์ php ในโมดูลของคุณโดยตรงจาก javascript คุณจะไม่ได้รับความดีจาก Drupal แต่คุณจะสามารถควบคุมเพจได้อย่างสมบูรณ์


ขอบคุณ! โดยไม่คำนึงถึงประสิทธิภาพการทำงานที่ผมควรจะใช้กรอบอาแจ็กซ์ (ตอนนี้ที่ผมรู้เกี่ยวกับมัน) B / C การปรับปรุงใด ๆ ดำเนินการตามคำขอหน้าอาแจ็กซ์มีแนวโน้มที่จะเกิดขึ้นในบริบทที่ :)
electblake

2
ลองดูตัวอย่างโมดูลพวกมันจะช่วยได้มากเฟรมเวิร์กมุ่งไปที่แบบฟอร์ม แต่สามารถใช้ได้ทุกที่ ฉันได้แก้ไขคำตอบของฉันเล็กน้อยเกี่ยวกับคลาส 'use-ajax'
Jeremy French

3
บางครั้งการเรียกไฟล์ PHP โดยตรงก็ถือว่าใช้ได้ คุณสามารถให้ไฟล์นั้นรวม bootstrap.inc แล้วเรียกapi.drupal.org/api/drupal/includes--bootstrap.inc/function/…ไปยังระดับที่คุณต้องการ
Greggles

4

สายไปนิด แต่โดยเฉพาะอย่างยิ่งถ้าคุณกำลังใช้โทรกลับที่อาแจ็กซ์สำหรับการลงคะแนนเลือกตั้ง (ตรวจสอบข้อความใหม่เป็นต้น) มีทางเลือกที่น่าสนใจ: บูรณาการ Drupal Node.js

แทนที่จะทำการสำรวจความคิดเห็นจะช่วยให้คุณสร้างระบบที่มีลักษณะคล้ายเหตุการณ์ซึ่งผู้ใช้ (หรือที่รู้จักกันในชื่อ JS บนหน้าเว็บของพวกเขา) ยังคงเปิดการเชื่อมต่อกับเซิร์ฟเวอร์ node.js ของคุณ หากมีสิ่งใดเกิดขึ้นคุณสามารถแจ้งผู้ใช้ทั้งหมดโดยตรงผ่าน node.js


ไม่สายเกินไปสำหรับคำแนะนำที่ดี - อย่าคิดแม้แต่จะใช้ node.js สำหรับสิ่งนี้ แต่ทันใดนั้นมันก็สมเหตุสมผลแล้ว
electblake

3

เนื่องจากคุณต้องการใช้การเรียกกลับ Ajax ใน Drupal การใช้โมดูล JS ดูเหมือนเป็นเดิมพันที่ดี ฉันเพิ่งดูโค้ดสั้น ๆ และมันก็เป็นสิ่งที่ฉันอยากจะแนะนำ (แต่ด้วยความใส่ใจในรายละเอียด) ผู้ดูแลเป็นหนึ่งในนักพัฒนาของ Drupal เช่นกัน

ดูเหมือนว่าคุณจะต้องใช้module_load_include()หรืออาจเป็นinclude 'sites/all/modules/contrib/...';แนวทางแบบแมนนวลถ้าคุณจำเป็นต้องใช้ API จากโมดูลอื่น ๆ

ปัญหาที่คุณกำลังพูดถึงเป็นประเด็นร้อนแรงเมื่อเร็ว ๆ นี้ คำปราศรัยของ Dries จาก DrupalCon Chicagoพูดคุยเกี่ยวกับวิธีที่ Drupal 8 ต้องการ API ที่ดีกว่าสำหรับการโทรกลับและรูปแบบเอาต์พุตที่ไม่ใช่ HTML


ดังนั้นในการวิจัย JS.php & do / project / js ต่อไป ฉันจะเริ่มร้องเรียนในปัญหาคิวสำหรับการเปิดตัว D7 ขอบคุณสำหรับวิดีโอ!
electblake

ใช่มันเป็นความอัปยศจริงที่โครงการ JS ยังไม่ได้รับการย้ายไปยัง D7 มันเป็นความอัปยศมันยากที่จะได้รับคำขอหน้าเบา
Matt Collins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.