Ich entwickle eine benutzerdefinierte Komponente für Joomla! 3.x und möchten einen AJAX-Aufruf ausführen, um einige Daten abzurufen. Was ist der richtige Weg, um es zu tun?
component
ajax
development
joomla-3.x
Dmitry Rekun
quelle
quelle
Antworten:
Abstrakt
Es gibt praktisch keine offizielle Möglichkeit, damit umzugehen. Dies hängt stark von der Komplexität ab und davon, wie sehr Sie sich bei der Ausführung der Arbeit auf das MVC-Muster verlassen möchten.
Nachfolgend sind einige mögliche Lösungen aufgeführt, die in Joomla 2.5 und 3.x funktionieren sollten. Der Code wird nicht zum Kopieren und Einfügen, sondern als allgemeine Idee angezeigt.
Vor Joomla! 3.2 Das einzige, was Sie zur Verwendung der folgenden Beispiele benötigen, ist a
component
. Nach Joomla 3.2 (für weniger komplexe Aufgaben) können Sie Anfragen von Modulen und Plugins bearbeiten.Generische HTML-Antwort (nach altem MVC)
Ihre URL für die Aufgabe muss folgendermaßen aussehen:
index.php?option=com_similar&task=abc&format=raw
Sie erstellen dann den Controller, der die Ansicht verwendet, beispielsweise
Abc
die Datei view.raw.html (identisch mit einer normalen Ansichtsdatei).Im Folgenden finden Sie den Code zum Generieren einer rohen HTML-Antwort:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Hinweis: Dies ist die Lösung, die ich verwenden würde, wenn ich HTML zurückgeben müsste (sie ist sauberer und folgt der Joomla-Logik). Informationen zum Zurückgeben einfacher JSON-Daten finden Sie unten, wie Sie alles in den Controller einfügen.
Subcontroller
Wenn Sie Ihre Ajax-Anfrage an einen Subcontroller richten , wie:
index.php?option=com_similar&controller=abc&format=raw
Dann muss der Name Ihres Subcontrollers (für die Rohansicht) lauten
abc.raw.php
.Dies bedeutet auch, dass Sie 2 Subcontroller mit dem Namen Abc haben werden / können.
Wenn Sie JSON zurückgeben, ist es möglicherweise sinnvoll,
format=json
und zu verwendenabc.json.php
. In Joomla 2.5. Ich hatte einige Probleme damit, diese Option zum Laufen zu bringen (irgendwie war die Ausgabe beschädigt), also habe ich raw verwendet.Gültige JSON-Antwort (nach neuem / älterem MVC)
Wenn Sie eine gültige JSON-Antwort generieren müssen , lesen Sie die Dokumentationsseite JSON-Ausgabe generieren
Sie würden diesen Code im Allgemeinen in den Controller einfügen (Sie rufen ein Modell auf, das die von Ihnen codierten Daten zurückgibt - ein sehr häufiges Szenario). Wenn Sie noch weiter gehen möchten, können Sie auch eine JSON-Ansicht (view.json.php) erstellen, ähnlich wie im Rohbeispiel.
Sicherheit
Schließen Sie die Seite noch nicht, da die Ajax-Anfrage funktioniert. Lesen Sie unten.
Vergessen Sie nicht, nach Fälschungen zu suchen.
JSession::checkToken()
hier nützlich sein. Lesen Sie die Dokumentation zum Hinzufügen von CSRF-Antispoofing zu FormularenMehrsprachige Websites
Es kann vorkommen, dass Joomla die gewünschten Sprachzeichenfolgen nicht übersetzt, wenn Sie den Namen der Sprache in der Anfrage nicht senden.
Erwägen Sie, den Parameter lang an Ihre Anfrage anzuhängen (wie
&lang=de
).Joomla! Ajax-Schnittstelle
Neu in Joomla 3.2! - Ermöglicht die Bearbeitung von Anfragen, ohne dass eine Komponente erstellt werden muss
Joomla! Ajax-Schnittstelle - Joomla bietet jetzt eine einfache Möglichkeit, Ajax-Anfragen in einem Plugin oder Modul zu bearbeiten. Vielleicht möchten Sie das Joomla! Ajax-Schnittstelle, wenn Sie noch keine Komponente haben oder Anforderungen von einem Modul stellen müssen, das Sie bereits haben.
quelle
JRequest
? Es ist veraltet, sollte es einfach sein,$this->input
da ich v3.x verwende?JRequest
. Vielen DankValid JSON Response
Abschnitt erwähnt.Dies ist eine späte Antwort auf diese sehr gut beantwortete Frage, aber ich wollte diese auf den Punkt gebrachte Lösung für diejenigen hinzufügen, die nur eine einfache Möglichkeit benötigen, mit einem AJAX-Aufruf an die Daten ihrer Komponenten zu gelangen.
Mit all den Joomla-Versionen, Möglichkeiten von Drittanbietern und Hacks, die ich in mehreren Tagen des Googelns gefunden habe, war dies der einfachste Ansatz, den ich mir einfallen lassen konnte - und Feedback wird auf jeden Fall geschätzt.
execute
zu meiner vorhandenen Hauptsteuerung hinzugefügtURL zum Aufrufen / Ausführen der Aufgabe:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Modifizierter Hauptcontroller \ com_example \ controller.php
Neuer Subcontroller \ com_example \ controller \ forajax.php
Gerenderte JSON-Ausgabe
quelle
Die Antwort von Valentin ist gut, aber etwas zu komplex, wenn Sie nur 1 oder 2 Ajax-Aufrufe zu einer bereits erstellten Komponente hinzufügen müssen. Es ist durchaus möglich, weg mit nicht getrennt zu machen
controller.raw.php
oderview.raw.php
Dateien.Um diesen Ajax-Anruf zu tätigen
Im
job
Subcontrollerquelle
Valentins Antwort ist gut.
Ich bevorzuge einen JSON-Controller, der die Codierung und Fehlerbehandlung übernimmt. Ich habe eine JSON-Basisklasse erstellt:
Dieser Controller wird um die Controller-Klasse erweitert, die die Arbeit erledigt:
und du rufst die Anfrage so an:
Der Token-Hash wird von JSession :: getFormToken () generiert. Der vollständige Aufruf könnte also so aussehen:
Der zweite Parameter ist auf "false" gesetzt, damit wir dies in Javascript-Aufrufen ohne xml-Neuschreibung verwenden können.
quelle
JResponseJson
Klasse umgehen?Wenn Sie zu 100% sicher sind, dass es kein Plugin für Drittanbieter gibt, das Javascript-Ausgaben hinzufügt, funktioniert ein reiner json_encode.
Aber ... zum Beispiel fügt JomSocial "" der gesamten Site hinzu.
Also ... ein praktischer Trick, wickeln Sie json_encode in Tags ein und verarbeiten Sie ihn auf der Javascript-Seite.
quelle
Sie können direkt auf einen Controller zugreifen, indem Sie den Controllernamen in der Task verwenden:
ruft auf: controller.raw.php (return ist raw)
ruft auf: controller.php (return ist html wenn du es nicht verwendest
die;
)quelle