Was ist die schnellste Methode / Implementierung für einen Ajax-Rückruf?

18

Ich habe eine Karte, die Markierungen über Ajax auf verschiedenen / zahlreichen Kartenereignissen lädt. Derzeit definiere ich einen benutzerdefinierten hook_menu()Seitenrückruf für meinen Artikel, der meine json / js druckt.

Da mein Seitenrückruf keinen Inhalt zurückgibt und nur Inhalt druckt , rendert Drupal nicht die vollständige Vorlage, das Menü usw. und ermöglicht mir daher, eine Seite nur mit meinem JavaScript zurückzugeben.

Obwohl dies funktioniert, glaube ich, dass Drupal immer noch vollständig bootet, was bedeutet, dass es eine Menge Overhead hinzufügt, den ich gerne fallen lassen würde.

Ich habe mir Hochleistungs-JavaScript-Callback-Handler angesehen , der sich als "Hochleistungs-JavaScript-Callback-Handler" ausgibt und der, kurz gesagt, ein js.phpKompliment bietet index.php, um Ihre Anforderungen an / limit / zu richten und anzupassen. Optimieren Sie das Bootstrapping, das Drupal standardmäßig durchführt.

Leider hat das js- Projekt noch kein D7-Release ( Petition für eines hier ), was uns an den Anfang führt ...

Was ist der schnellste Weg, um einen Ajax-Rückruf in Drupal zu implementieren?

electblake
quelle

Antworten:

8

Ich definiere einen benutzerdefinierten hook_menu()Seitenrückruf für meinen Artikel, der meine json / js druckt.

Das hat Drupal 6 geboten. Das Drupal 7 AJAX-Framework kann ein bisschen mehr. Ja, es bootet Drupal, aber es gibt auch viele kostenlose Funktionen. Kurz gesagt, Sie können ajax_deliver () als Methode zur Übermittlung von Seiten verwenden und Befehle an den Browser senden.

... Ajax kann durch Hinzufügen von Klassen zu Schaltflächen und Links aktiviert werden. Durch Hinzufügen der Klasse 'use-ajax' zu einem Link wird der Link über einen Ajax-Aufruf geladen. Bei dieser Methode kann die href des Links '/ nojs /' als Teil des Pfades enthalten. Wenn das Ajax-Framework die Anfrage stellt, konvertiert es diese in '/ ajax /'. Der Server kann dann auf einfache Weise feststellen, ob diese Anforderung über eine tatsächliche Ajax-Anforderung oder in einem herabgesetzten Zustand erfolgt ist, und entsprechend reagieren.

Wenn Sie das Framework jedoch aus Performance-Gründen umgehen möchten, dann gibt es nichts, was Sie daran hindert, PHP-Dateien in Ihrem Modul direkt von Javascript aus aufzurufen. Sie werden keine Drupal-Güte erhalten, aber Sie werden auch die vollständige Kontrolle über die Seite haben.

Jeremy French
quelle
Vielen Dank! Unabhängig von der Leistung sollte ich wirklich das Ajax-Framework verwenden (jetzt, da ich davon weiß). In diesem Kontext werden wahrscheinlich Verbesserungen des Ajax-Seitenanforderungsprozesses auftreten :)
electblake
2
Schauen Sie sich die Beispielmodule an, sie werden viel helfen, das Framework ist auf Formen ausgerichtet, kann aber überall eingesetzt werden. Ich habe meine Antwort mit ein bisschen über die Klasse 'use-ajax' bearbeitet.
Jeremy French
3
Das direkte Aufrufen von PHP-Dateien ist manchmal in Ordnung. Sie können diese Datei sogar die Datei bootstrap.inc einbinden lassen und dann api.drupal.org/api/drupal/includes--bootstrap.inc/function/… für die von Ihnen benötigte Ebene aufrufen .
Greggles
4

Ein bisschen spät, aber vor allem , wenn Sie , dass die Ajax - Rückruf für den Abruf (Check für neue Nachrichten zum Beispiel) verwenden, gibt es eine interessante Alternative: Drupal node.js Integration .

Anstatt eine Abfrage durchzuführen, können Sie ein ereignisähnliches System erstellen, in dem Benutzer (auch bekannt als JS auf ihrer Seite) eine offene Verbindung zu Ihrem node.js-Server halten. Wenn etwas passiert, können Sie alle Benutzer direkt über node.js benachrichtigen.

Berdir
quelle
Nie zu spät für großartige Vorschläge - habe noch nie daran gedacht, node.js für solche Dinge zu verwenden, aber plötzlich macht es Sinn, danke!
Electblake
3

Da Sie einen Ajax-Callback in Drupal implementieren möchten, bietet sich die Verwendung des JS-Moduls an. Ich habe nur einen kurzen Blick auf den Code geworfen und es ist im Grunde das, was ich vorgeschlagen hätte (aber mit viel mehr Liebe zum Detail). Der Maintainer ist auch einer der besten Drupal-Entwickler.

Es sieht so aus , als müssten Sie module_load_include()einen manuelleren include 'sites/all/modules/contrib/...';Ansatz verwenden, wenn Sie APIs aus anderen Modulen verwenden möchten.

Das Problem, von dem Sie sprechen, war in letzter Zeit ein heißes Thema. Dries 'Keynote von DrupalCon Chicago sprach darüber, wie Drupal 8 bessere APIs für Callbacks und Nicht-HTML-Ausgabeformate benötigt.

Adam DiCarlo
quelle
Also, kurz gesagt - recherchieren Sie weiter in JS.php & do / project / js? Ich beginne in der Issue Que eine Petition für die D7-Version einzureichen. Danke für das Video!
Electblake
Ja, es ist eine echte Schande, dass das JS-Projekt noch nicht auf D7 portiert wurde. Es ist eine Schande, dass es so schwer ist, eine einfache Seitenanfrage zu bekommen.
Matt Collins