web-dev-qa-db-fra.com

Utiliser AJAX dans un module personnalisé - comment le faire?

Je pense que cela pourrait être utile à l'avenir pour beaucoup d'autres. Tout d'abord, je sais qu'il existe un com_ajax pour ce type de travail, mais je ne veux pas l'utiliser. Y a-t-il une alternative?

Ce que j'ai:

default.php

<form method="post" name="filterForm">
    <input type="checkbox" name="checkboxList[]" value="1">value1</input>
    <input type="checkbox" name="checkboxList[]" value="2">value2</input>
    <input type="checkbox" name="checkboxList[]" value="3">value3</input>
</form>


jQuery(function($) { // DOM is now ready

    $("input[type=checkbox]").on("change", function() {
        var data = $("filterForm").serialize();
        $.ajax({
            url: "/modules/mod_mymodule/mymodule.php",
            type: "POST",
            async: true,
            cache: false,
            data: ({data: data}),
            dataType: "text",
        });
    });

});

mymodule.php

//defined('_JEXEC') or die; <-- So it's possible to access this file
print_r($_POST);

Je reçois un tableau vide. Qu'est-ce qui ne va pas?

3
Poo123

Je ne comprends pas pourquoi vous essayez de contourner le cadre. Je sais que cela concerne les ressources, mais cela vous expose à des risques de sécurité. L'autre chose est que vous ne pouvez pas utiliser les classes/fonctions du framework aussi facilement. Ce que je ferais c'est:

  • Au lieu d'utiliser une URL directe dans le fichier de module, utilisez l'URI actuel (JURI::current() autant que je m'en souvienne). Cela dirigera les données POST) vers une vue où votre module a été exécuté afin que vous puissiez y accéder à partir de votre module.
  • Ensuite, utilisez JFactory::getApplication()->input dans votre module pour accéder aux données de publication envoyées par la requête jQuery. De cette façon, vous êtes dans la structure, toutes les options de sécurité/filtrage sont disponibles et fonctionnent.
  • Selon ce que vous voulez faire avec les données, vous pouvez les stocker dans la base de données, les archiver ou les envoyer par courrier électronique.
  • Si vous devez informer jQuery du résultat de vos actions avec les données, vous pouvez quitter l'application JFactory::getApplication()->close("OK"), puis vérifiez simplement la réponse dans jQuery.
2
Artur Stępień

Se rapporte à Envoi POST données dans le module - AJAX

Et j'ai posté la réponse là déjà.

En deux mots: utilisez com_ajax.

Comment? Vérifiez la réponse dans le post mentionné ci-dessus. Ou regardez dans le code de com_ajax C'est assez simple: vous allez envoyer des requêtes à index.php?option=com_ajax&ignoreMessages&module=YMODULE&method=YMETHOD&format=json. La description de la logique du module se trouve dans l'article ci-dessus.

Et j'ajouterai la description call plugin Ici:

index.php?option=com_ajax&ignoreMessages&plugin=EVENT&group=PLUGINGROUP&format=json

il chargera les plugins du groupe PUGINGROUP (ajax le groupe par défaut) et déclenchera l'événement onAjaxEVENT()

1
Alexandr

si vous ne souhaitez pas utiliser com_ajax, vous pouvez créer votre propre composant pour gérer les appels ajax. Une autre solution consiste à utiliser un plug-in système qui capturerait votre URL et la traiterait.

si vous décidez d'utiliser votre propre fichier php au lieu de le traiter via le fichier index.php principal de joomla, vous risquez d'être confronté à de nombreux problèmes de sécurité, en particulier si vous distribuez votre module à différents clients/utilisateurs.

le pare-feu php idéal détecterait les exécutables php, alors que dans le site idéal, il n'y aurait que index.php. Par conséquent, refuser les fichiers exécutables en dehors du fichier 2 index.php dans joomla est l’une des meilleures mesures de sécurité dans le monde joomla.

1
user2241415