Je développe un composant personnalisé pour Joomla! 3.x et souhaitez faire un appel AJAX à l'intérieur pour récupérer des données. Quelle est la bonne façon de le faire?
component
ajax
development
joomla-3.x
Dmitry Rekun
la source
la source
Réponses:
Abstrait
Il n’existe pratiquement pas de solution officielle à ce problème, cela dépend en grande partie de la complexité et de la mesure dans laquelle vous souhaitez vous appuyer sur le modèle MVC pour effectuer le travail.
Vous trouverez ci-dessous quelques solutions possibles à ce qui devrait fonctionner dans Joomla 2.5 et 3.x. Le code n'est pas présenté pour un travail copier-coller, mais plutôt comme une idée générale.
Avant Joomla! 3.2 la seule chose dont vous avez besoin pour utiliser les exemples ci-dessous est un
component
. Après Joomla 3.2 (pour les tâches moins complexes), vous pouvez gérer les requêtes des modules et des plugins.Réponse HTML générique (suivant MVC hérité)
Votre URL pour la tâche doit ressembler à ceci:
index.php?option=com_similar&task=abc&format=raw
Vous créez ensuite le contrôleur qui utilisera la vue, par exemple
Abc
, qui contiendra le fichier view.raw.html (identique à un fichier de vue normale).Vous trouverez ci-dessous le code permettant de générer une réponse HTML brute:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Remarque: C’est la solution que j’utiliserais si je devais retourner du code HTML (il est plus propre et respecte la logique de Joomla). Pour renvoyer des données JSON simples, voir ci-dessous comment tout mettre dans le contrôleur.
Sous-contrôleurs
Si vous faites votre demande Ajax à un sous - contrôleur , par exemple:
index.php?option=com_similar&controller=abc&format=raw
Que le nom de votre sous-contrôleur (pour la vue brute) doit être
abc.raw.php
.Cela signifie également que vous aurez / pourrez avoir 2 sous-contrôleurs nommés Abc.
Si vous retournez JSON, il peut être judicieux d'utiliser
format=json
etabc.json.php
. Dans Joomla 2.5. J'ai eu quelques problèmes à faire fonctionner cette option (la sortie était corrompue), alors j'ai utilisé raw.Réponse JSON valide (après le nouveau / ancien legacy MVC)
Si vous devez générer une réponse JSON valide , consultez la page de documentation Génération d'une sortie JSON
Vous mettriez généralement ce code dans le contrôleur (vous appelerez un modèle qui renverra les données que vous encodez - un scénario très courant). Si vous avez besoin d'aller plus loin, vous pouvez également créer une vue JSON (view.json.php), similaire à l'exemple brut.
Sécurité
Maintenant que la requête Ajax fonctionne, ne fermez pas encore la page. Lire ci-dessous.
N'oubliez pas de vérifier les faux de demande.
JSession::checkToken()
être utile ici. Lisez la documentation sur Comment ajouter de l' anti-usurpation CSRF aux formulairesSites multilingues
Il peut arriver que si vous n'envoyez pas le nom de la langue dans la demande, Joomla ne traduira pas les chaînes de la langue souhaitée.
Pensez à ajouter en quelque sorte le paramètre lang à votre requête (du type
&lang=de
).Joomla! Interface Ajax
Nouveau dans Joomla 3.2! - vous permet de faire des requêtes sans construire de composant
Joomla! Interface Ajax - Joomla fournit désormais un moyen léger de gérer les demandes Ajax dans un plugin ou un module. Vous voudrez peut-être utiliser le logiciel Joomla! Ajax Interface si vous ne possédez pas déjà de composant ou si vous devez faire des demandes à partir d'un module que vous avez déjà.
la source
JRequest
? C'est obsolète devrait-il être simplement$this->input
depuis que j'utilise v3.x?JRequest
. MerciValid JSON Response
section.C'est une réponse tardive à cette question très bien répondue, mais je voulais ajouter cette solution parfaitement adaptée à ceux qui recherchent simplement un moyen simple d'obtenir les données de leurs composants avec un appel AJAX.
Avec toutes les versions de Joomla, les possibilités offertes par une tierce partie et les piratages que j'ai trouvés au cours de plusieurs jours passés sur google, c’était l’approche la plus simple que je pouvais proposer - et les retours sont définitivement appréciés.
execute
à mon contrôleur principal existantURL à appeler / exécuter la tâche:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Contrôleur principal modifié \ com_example \ controller.php
Nouveau sous-contrôleur \ com_example \ controllers \ forajax.php
Rendu JSON rendu
la source
La réponse de Valentin est bonne mais elle est un peu trop complexe si tout ce que vous avez à faire est d’ajouter 1 ou 2 appels ajax à un composant déjà construit. Il est parfaitement possible de se contenter de ne pas faire séparément
controller.raw.php
ouview.raw.php
fichiers.Pour faire cet appel ajax
Dans le
job
sous - contrôleurla source
La réponse de Valentin est bonne.
Je préfère un contrôleur json qui gère l'encodage et la gestion des erreurs pour cela. J'ai créé une classe de base json:
Ce contrôleur est étendu par la classe de contrôleur qui fait le travail, quelque chose comme ceci:
et vous appelez la requête comme ceci:
Le hachage du jeton est généré par JSession :: getFormToken (). Ainsi, l'appel complet complet pourrait ressembler à ceci:
Le second paramètre est défini sur "false" afin que nous puissions l'utiliser dans les appels javascript sans réécriture XML.
la source
JResponseJson
class pour le gérer?Si vous êtes sûr à 100% qu'il n'y a pas de plugin tiers qui ajoute une sortie Javascript, un json_encode pur fonctionne bien.
Mais ... par exemple, JomSocial ajoute "" à l'ensemble du site.
Alors ... un truc pratique, habillez json_encode avec des balises et traitez-le du côté Javascript.
la source
Vous pouvez accéder directement à un contrôleur en utilisant le nom du contrôleur dans la tâche:
appellera: controller.raw.php (le retour est brut)
va appeler: controller.php (le retour est html si vous n'utilisez pas
die;
)la source