it-swarm.com.de

Einfacher AJAX Aufruf einer Komponente, die den Fehler 403 (Verboten) ausgibt

Haftungsausschluss: Ich bin ziemlich neu in Joomla und der Webentwicklung, daher mache ich wahrscheinlich einen blöden Anfängerfehler. Bisher habe ich einen Großteil des MVC-Tutorials in der Joomla-Dokumentation durchgearbeitet und Antworten auf die Was ist der richtige Weg dazu? eine AJAX Aufruf in Komponente? Frage, aber ich habe immer noch Probleme.

Ich ändere eine vorhandene Komponente (J2Store), sodass ich com_ajax nicht verwende. Ich möchte, dass ein JavaScript-Skript eine Methode in einem Subcontroller (com_j2store/controller/products.php) zum Abrufen von Daten verwenden kann. In meiner Subcontroller-Klasse habe ich eine Dummy-Methode, um dies zu testen:

site/components/com_j2store/controller/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";
  }

}

Basierend auf dem, was ich gelesen habe, habe ich den folgenden AJAX Aufruf zusammengeschustert:

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); 
    }
  });

  ...
}

(Dies ist ein Projekt, das ich geerbt habe, und der vorherige Entwickler hat die Entscheidung getroffen, Code zu erstellen und in die Vorlagendatei user.js einzufügen. Ich füge meinen Code auch in diese Datei ein, weil ich das ändere, was er getan hat.)

Was ich erwarte, wenn ich den AJAX - Aufruf auslöse, ist ein Warnfenster, das auftaucht und "etwas" sagt. Wenn jedoch der Aufruf AJAX ausgelöst wird, protokolliert die Konsole einen 403-Fehler (Verboten), und die angegebene Zeilennummer ist in der Tat die Zeilennummer des Aufrufs AJAX.

Aufgrund meiner Unerfahrenheit und der Vielzahl von Aspekten, die an diesem Problem beteiligt sind, ist es für mich schwierig zu wissen, was das Problem verursacht. Insbesondere weiß ich nicht, ob ich meinen Code falsch in der Joomla-Struktur strukturiert habe oder ob mein AJAX -Aufruf einfach falsch ist. Hoffentlich kann jemand helfen, die Dinge für mich zu klären.

pdate mixahlos hat darauf hingewiesen, dass meine alte URL "index.php? option = com_j2store & format = raw & controller = products & task = doSomething" falsch war, aber ich erhalte immer noch den Fehler

2
William

Als Sie gerade mit der Entwicklung einer Joomla-Komponente begonnen haben, haben Sie sofort einen schweren Job gemacht. J2Store ist eine recht gut gebaute Komponente (ich mag das und benutze das), aber sie wurde mit FOF erstellt (und obendrein mit dem alten FOF und von einem ziemlich fortgeschrittenen Entwickler). Sie haben also ein paar zusätzliche Dinge zu lernen und ein bisschen Kopfschmerzen (chronisch :)).

Ich habe Folgendes noch nicht getestet, aber soweit ich diese Komponente kenne, versuche ich, deine Ajax-Aufruf-URL wie folgt zu erstellen:

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

Dies sollte nach meinem Dafürhalten den erforderlichen Aufruf der anvisierten J2Store-Controller-Funktion bewirken, auch wenn dies nicht so aussieht. Gib mir ein Feedback.

... testet immer noch die Anrufe auf dem lokalen Host ...

Wenn Sie Ihr Joomla ausführen auf localhost, ist es besser, die URL im Aufruf mit einem öffnenden Backslash zu verwenden, wie:

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

Erstens ist es keine schlechte Idee, Ihre doSomething () - Funktion in der J2Store Callback Controller -Klasse (callback.php) zu platzieren und zu testen, da diese Komponente diese Klasse hauptsächlich verwendet nach ajax ruft wie ich sehe. Sie finden diese Klasse unter den Komponenten-Controllern.

class J2StoreControllerCallback extends F0FController
{
}

Wenn ich hier in dieser Klasse eine Funktion mit der obigen URL aufrufe, erhalte ich 200 OK Antwort. Und wie ich sehe, ist in dieser Klasse auch der csrf-Schutz deaktiviert, was Ihnen auch bei erfolgreichen Ajax-Aufrufen helfen kann. Interessante Dinge...

Also habe ich das folgende Ajax-Aufrufskript in das components/com_j2store/templates/default/default.php eingefügt

<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>

Ich habe in der gleichen Vorlagendatei (in der oberen Hälfte) auch eine Schaltfläche platziert, um den Ajax-Aufruf zu testen:

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

Die obige Vorlage ist die Hauptvorlage für die Produktliste des Shops. Der Ajax-Anruf kommt hier durch, es sollten jedoch noch viele Tests durchgeführt werden, von wo und zu welcher Klasse die Ajax-Anrufe getätigt werden sollen und ein paar andere Dinge ... Ich hoffe nur, dass Sie dem folgen können.

Um diese Frage wirklich zu schließen, haben wir einen erfolgreichen Ajax-Aufruf an einen der J2Store-Controller (callback.php) gerichtet, der den Aufruf sofort prüft und ihn an Model) umleitet (components/com_j2store/models/callback.php), welches Model den Aufruf erhält und prüft, ob es eine $ method entsprechende, in dieser Klasse definierte Methode hat, wie in der in der definierten Ajax-Anruf. Also habe ich unsere doSomething () - Funktion am Ende dieser Callback-Modellklasse (models/callback.php) platziert:

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

Und in der Funktion dieser Callback-Modellklasse: function runCallback ($ method) {} Ich habe in Zeile 23 einen 3-Liner eingefügt wenn überprüft, was so aussieht:

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

Und jetzt meine Funktion doSomething () wird ausgeführt und ich erhalte die Antwort, die ich in meiner Funktion doSomething () definiert habe. So sollten Ajax-Aufrufe in einer MVC funktionieren, die mit FOF so strukturiert ist.

2
Zollie

Sieht so aus, als ob die URL in Ihrem Ajax-Aufruf falsch ist. Sie sollten den Controller nicht als Variable in der URL verwenden, sondern als Präfix, gefolgt von der Aufgabe. Auch nach dem "?" geht die option und dann den rest der url vars.

Versuchen Sie zu ersetzen:

uRL: "index.php? format = raw & option = com_j2store & controller = products & task = doSomething",

Mit

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