Phương thức / cách triển khai nhanh nhất cho một cuộc gọi lại Ajax là gì?


18

Tôi có một bản đồ tải các điểm đánh dấu qua ajax trên nhiều sự kiện bản đồ khác nhau. Hiện tại, tôi xác định một cuộc gọi lại trang tùy chỉnh cho hook_menu()mục của tôi in json / js của tôi.

Vì cuộc gọi lại trang của tôi không trả về bất kỳ nội dung nào và chỉ in nội dung, Drupal không hiển thị toàn bộ mẫu, menu, v.v. và do đó cho phép tôi trả lại một trang chỉ bằng JavaScript của mình.

Mặc dù điều này không hoạt động, tôi tin rằng Drupal vẫn hoàn toàn bootstrapping, điều đó có nghĩa là nó đang bổ sung rất nhiều chi phí mà tôi muốn bỏ.

Tôi đã xem xét trình xử lý gọi lại JavaScript hiệu suất cao , tự hào là "Trình xử lý gọi lại JavaScript hiệu suất cao" và nói ngắn gọn là nó cung cấp js.phplời khen index.phpđể hướng yêu cầu của bạn đến và tùy chỉnh / giới hạn / tối ưu hóa bootstrapping Drupal theo mặc định.

Thật không may, dự án js chưa có bản phát hành D7 ( kiến nghị cho một người ở đây ), điều này dẫn chúng ta đến sự khởi đầu ...

Cách nhanh nhất để thực hiện một cuộc gọi lại Ajax trong Drupal là gì?

Câu trả lời:


8

Tôi xác định một cuộc gọi lại trang tùy chỉnh cho hook_menu()mục của tôi in json / js của tôi.

Đó là những gì Drupal 6 cung cấp. Các khuôn khổ Drupal 7 AJAX có thể làm một chút nhiều hơn thế. Có nó bootstraps Drupal, nhưng nó cũng cung cấp rất nhiều tính năng miễn phí. Nói tóm lại, bạn có thể sử dụng ajax_deliver () làm phương thức phân phối trang và gửi lệnh đến trình duyệt.

... Ajax có thể được kích hoạt bằng cách thêm các lớp vào các nút và liên kết. Bằng cách thêm lớp 'use-ajax' vào một liên kết, liên kết sẽ được tải thông qua một cuộc gọi Ajax. Khi sử dụng phương pháp này, href của liên kết có thể chứa '/ nojs /' như một phần của đường dẫn. Khi khung công tác Ajax đưa ra yêu cầu, nó sẽ chuyển đổi nó thành '/ ajax /'. Sau đó, máy chủ có thể dễ dàng biết liệu yêu cầu này được thực hiện thông qua yêu cầu Ajax thực tế hay ở trạng thái xuống cấp và trả lời thích hợp.

Tuy nhiên, nếu bạn muốn bỏ qua khung vì lý do hiệu suất thì không có gì ngăn bạn gọi các tệp php trong mô-đun của bạn trực tiếp từ javascript. Bạn sẽ không nhận được lòng tốt của Drupal nhưng bạn cũng sẽ có toàn quyền kiểm soát trang.


Cảm ơn! Bất kể hiệu suất nào tôi thực sự nên sử dụng Khung công tác Ajax (bây giờ tôi đã biết về nó) b / c mọi cải tiến đối với quy trình yêu cầu trang ajax có thể sẽ xảy ra trong bối cảnh đó :)
electblake

2
Hãy xem các mô-đun mẫu, chúng sẽ giúp ích rất nhiều, khung được hướng tới các biểu mẫu nhưng có thể được sử dụng ở bất cứ đâu. Tôi đã chỉnh sửa câu trả lời của mình với một chút về lớp 'use-ajax'.
Jeremy Pháp

3
Gọi trực tiếp các tệp PHP là tốt. Bạn thậm chí có thể có tệp đó bao gồm bootstrap.inc và sau đó gọi api.drupal.org/api/drupal/includes--bootstrap.inc/feft/ trên đến mức cụ thể mà bạn cần.
chào đón

4

Một chút muộn, nhưng đặc biệt là nếu bạn đang sử dụng mà callback ajax cho bỏ phiếu (check thư mới chẳng hạn), có một sự thay thế thú vị: Drupal Node.js hội nhập .

Thay vì bỏ phiếu, nó cho phép bạn xây dựng một hệ thống giống như sự kiện, nơi người dùng (còn gọi là JS trên trang của họ) giữ kết nối mở với máy chủ node.js của bạn. Nếu có điều gì đó xảy ra, bạn có thể thông báo trực tiếp cho tất cả người dùng thông qua node.js.


Không bao giờ quá muộn cho các đề xuất tuyệt vời - thậm chí chưa bao giờ nghĩ đến việc sử dụng node.js cho loại điều này nhưng đột nhiên nó có ý nghĩa heh, cảm ơn!
electblake

3

Vì bạn muốn triển khai một cuộc gọi lại Ajax trong Drupal , sử dụng mô-đun JS có vẻ như là một sự đánh cược tốt. Tôi chỉ xem nhanh mã, và về cơ bản đó là những gì tôi đã đề xuất (nhưng chú ý nhiều hơn đến các chi tiết). Nhà bảo trì là một trong những nhà phát triển Drupal hàng đầu, quá.

Có vẻ như bạn sẽ phải sử dụng module_load_include()hoặc có lẽ là một include 'sites/all/modules/contrib/...';cách tiếp cận thủ công hơn nếu bạn cần sử dụng API từ các mô-đun khác.

Vấn đề mà bạn đang nói đến gần đây đã trở thành một chủ đề nóng. Bài phát biểu của Dries từ DrupalCon Chicago đã nói về việc Drupal 8 cần API tốt hơn để thực hiện các cuộc gọi lại và các định dạng đầu ra không phải HTML.


Vì vậy, trong ngắn hạn - tiếp tục nghiên cứu JS.php & do / project / js? Tôi sẽ bắt đầu kiến ​​nghị trong vấn đề xếp hàng cho bản phát hành D7. Cảm ơn về video!
electblake

Vâng, thật xấu hổ vì dự án JS chưa được chuyển sang D7. Thật xấu hổ khi rất khó để có được một yêu cầu trang nhẹ.
Matt Collins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.