web-dev-qa-db-fra.com

Appel simple AJAX) à un composant générant une erreur 403 (interdite)

Clause de non-responsabilité: Joomla et le développement Web ne sont pas au courant de mes débuts, alors je commets probablement une erreur stupide pour débutant. Jusqu’à présent, j’ai travaillé sur la majeure partie du tutoriel MVC dans la documentation de Joomla, et j’ai lu les réponses à la question Quelle est la bonne façon de créer un AJAX appeler dans le composant? question, mais j'ai toujours des problèmes.

Je modifie un composant existant (J2Store), je n'utilise donc pas com_ajax. Je souhaite qu'un script JavaScript puisse utiliser une méthode dans un sous-contrôleur (com_j2store/controllers/products.php) pour récupérer des données. Dans ma classe de sous-contrôleur, j'ai une méthode fictive pour le tester:

site/composants/com_j2store/controllers/products.php

<?php
/**
 * @package J2Store
 * @copyright Copyright (c)2014-17 Ramesh Elamathi / J2Store.org
 * @license GNU GPL v3 or later
 */
// No direct access to this file
use Joomla\Registry\Format\Json;

defined('_JEXEC') or die;

require_once(JPATH_ADMINISTRATOR.'/components/com_j2store/controllers/productbase.php');
class J2StoreControllerProducts extends J2StoreControllerProductsBase
{
...

  // My method
  public function doSomething(){
    echo "something";
  }

}

Sur la base de ce que j'ai lu, j'ai bricolé l’appel AJAX) suivant:

site/templates/my_template/js/user.js

// menu select options

jQuery(document).ready(function() {
  ...

  jQuery.ajax({
    url: "index.php?option=com_j2store&format=raw&task=products.doSomething", 
    type: "GET",
    success: function(response){ 
      alert(response); 
    }
  });

  ...
}

(C’est un projet dont j’ai hérité et le développeur précédent a fait le choix de créer et de mettre du code dans le fichier de modèle user.js. Je mets mon code dans ce fichier également parce que je modifie ce qu’il a fait.)

Ce que j'attends de ce qui se passe lorsque je déclenche l'appel AJAX est une fenêtre d'alerte qui s'affiche et dit "quelque chose". Cependant, lorsque l'appel AJAX est déclenché enregistre une erreur 403 (interdite) et le numéro de ligne indiqué est en effet le numéro de ligne de l'appel AJAX.

En raison de mon inexpérience et du nombre d'aspects différents impliqués dans ce problème, il m'est difficile de savoir ce qui cause le problème. En particulier, je ne sais pas si j'ai structuré mon code de manière incorrecte dans la structure de Joomla ou si mon appel AJAX est tout simplement faux. J'espère que quelqu'un pourra m'aider à clarifier les choses.

update mixahlos a fait remarquer que mon ancienne URL "index.php? option = com_j2store & format = raw & controller = produits & task = doQuelque chose était incorrecte, mais je continue à obtenir l'erreur

2
William

Lorsque vous commencez tout juste à développer un composant joomla, vous vous êtes mis au travail. J2Store est un composant assez bien construit (j'aime bien l'utiliser et l'utiliser), mais il est construit avec l'utilisation de FOF (et en plus de cela, avec l'ancien FOF et par un développeur assez avancé). Vous aurez donc peu de choses à étudier et un peu de mal de tête aussi (chronique :)).

Je n'ai pas encore testé les éléments suivants, mais dans la mesure où je connais ce composant, essayez de créer votre URL d'appel ajax comme ceci:

url: 'index.php?option=com_j2store&view=products&task=doSomething',

Cela devrait faire l'appel requis à la fonction de contrôleur J2Store ciblée selon moi, même si cela ne ressemble pas à cela. Donnez-moi des commentaires.

... teste toujours les appels sur l'hôte local ...

Si vous utilisez votre Joomla sur localhost, il est préférable d'utiliser l'URL de l'appel avec une barre oblique inverse d'ouverture, comme:

url: '/index.php?option=com_j2store&view=callback&task=callback&method=doSomething',

Premièrement, ce n'est pas une mauvaise idée de placer et de tester votre fonction doSomething () dans le contrôleur contrôleur de rappel J2Store (callback.php) car ce composant utilise principalement cette classe. pour les appels ajax que je vois. Vous trouverez cette classe parmi les contrôleurs de composants.

class J2StoreControllerCallback extends F0FController
{
}

Si j'appelle une fonction ici dans cette classe avec l'URL ci-dessus, alors j'ai 200 OK réponse. Et comme je le vois dans cette classe, la protection csrf est également désactivée, ce qui peut également vous aider à réussir vos appels ajax. Choses intéressantes...

Donc, je mets le script d'appel ajax suivant dans le components/com_j2store/templates/default/default.php

<script type="text/javascript">
     $ = jQuery.noConflict();        
        $(document).ready(function() {
            $('#mybutton2').on('click', function() {
                $.ajax({
                    url: '/index.php?option=com_j2store&view=callback&task=callback&method=doSomething',
                    cache: false,
                    type: 'GET',                        
                    success: function(data) {
                        alert('its good');
                        console.log(data);
                    },
                    error: function(){
                        console.log('its not working');
                    },
                });
            });
        });

</script>

Je viens également de placer un bouton dans ce même fichier de modèle (quelque part dans le div du haut) pour tester l'appel ajax:

<div>
     <button class="btn btn-primary" type="button" id="mybutton2">MyButton</button>
</div>

Le modèle ci-dessus est le modèle de liste de produits principal de la boutique. Donc, l'appel ajax passe ici, cependant de nombreux tests doivent être effectués, d'où et à quelle classe les appels ajax doivent être effectués, ainsi que quelques autres choses ... J'espère juste que vous pourrez suivre cela.

Maintenant, pour clore vraiment cette question, nous avons n appel ajax réussi à l’un des contrôleurs J2Store (callback.php) qui vérifie immédiatement l’appel et le redirige vers le Modèle (composants/com_j2store/models/callback.php), quel Model reçoit l'appel et vérifie s'il a une $ méthode correspondante, définie dans cette classe, comme dans la méthode définie dans le appel ajax. J'ai donc placé notre fonction DoSomething () au bas de cette classe de modèle de rappel (models/callback.php):

function doSomething() 
{
        $mymessage = 'this is from the callback function';
        echo new JResponseJson($mymessage);
        $status = true;
        return $status;
}

Et dans ce modèle de rappel, la fonction de la classe: fonction runCallback ($ method) {} j'ai inséré un 3-liner si vérifiant à la ligne 23, qui ressemble à ceci:

if ($rawDataGet['method'] == 'doSomething')
{
    $this->doSomething();
    return true;
}

Et maintenant ma fonction doSomething () est en cours d’exécution et j’obtiens la réponse que je définis dans ma fonction doSomething (). C'est ainsi que les appels ajax devraient fonctionner dans un MVC structuré de cette manière avec FOF.

2
Zollie

On dirait que l'URL dans votre appel Ajax est faux. Vous ne devez pas utiliser le contrôleur en tant que var dans l'URL mais en tant que préfixe suivi de la tâche. Aussi après le "?" va l'option et ensuite le reste de URL vars.

Essayez de remplacer:

url: "index.php? format = raw & option = com_j2store & controller = produits & task = quelque chose",

Avec

url: "index.php?option=com_j2store&format=raw&task=products.doSomething",
1
mixahlos