Hallo martin_vo,
ich hatte zu Beginn des Posts ein Schritt-für-Schritt Szenario für die Entwicklung erstellt.
Der folgende Punkt war leider nicht ganz korrekt.
A: JavaScript im Web-Browser, Teil 1:
- Sendet einen AJAX-Request mit den gewählten Daten-IDs und dem gewählten Status an das Custom-Plugin.
Es muss stattdessen wie folgt lauten:
- Sendet einen AJAX-Request mit den gewählten Daten-IDs und dem gewählten Status an eine kleine eigene Controller-Klasse.
Ein AJAX-Request kann nur im Rahmen der Joomla-MVC Logik empfangen werden.
Du braucht allerdings nur die Controller-Klasse und keine Modell-Klasse und keine View-Klasse.
Im Folgenden ein lauffähiges minimal kleines Beispiel für einen eigenen AJAX-Request an eine eigenen kleine Controller-Klasse.
Aus Sicherheitsgründen ist im Beispiel die Auswertung des Joomla Session-Sicherheits-Tokens durch die Controller-Klasse enthalten.
Ohne diese Auswertung wäre der AJAX-Request vollkommen ungeschützt und nicht empfehlenswert.
Einen AJAX-Request an eine kleine eigene Controller-Klasse senden:
Die folgende Datei enthält deine eigene Controller-Klasse für Visforms:
components/com_visforms/src/Controller/MyController.php
Der folgende Code ist der Inhalt deiner Controller-Datei MyController.php:
Code:
<?php
namespace Visolutions\Component\Visforms\Site\Controller;
defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\Application\CMSApplicationInterface;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\CMS\Session\Session;
use Joomla\Input\Input;
class MyController extends BaseFormController
{
protected $formModel;
public function __construct($config = [], MVCFactoryInterface $factory = null, ?CMSApplicationInterface $app = null, ?Input $input = null) {
parent::__construct($config, $factory, $app, $input);
$this->formModel = $this->getModel('Visforms', 'Site');
}
public function test() {
// get data
$json = $_POST['data'];
$data = json_decode($json);
// test session token
if (!isset($data->token) || Session::getFormToken() !== $data->token) {
$response = array("success" => false, "message" => "Invalid Token");
echo json_encode($response);
$this->app->close();
return;
}
// send response
$response = array("success" => true);
echo json_encode($response);
$this->app->close();
}
}
Der folgende JavaScript Code zeigt die Hilfs-Funktion sendAjax(), die einen AJAX-Request mit Nutzdaten sendet und das Ergebnis empfängt und in die Konsole schreibt.
Code:
function sendAjax() {
const fid = jQuery('form.visform').attr('id');
const token = jQuery("form.visform input[type='hidden']:last-child").attr('name');
// prepare data to send
var data = 'data=' + JSON.stringify({parameter1: 'value1', parameter2: 'value2', token: token});
jQuery.ajax({
type: 'POST',
// mandatory data: input 'id' is form id and used to initialize VisformsModel in Controller
url: 'index.php?option=com_visforms&task=my.test&format=raw' + '&id=' + fid,
data: data,
success: function (data, textStatus, jqXHR) {
console.log('ajax success');
console.log(data);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log('ajax error');
console.log(jqXHR.responseText);
},
dataType: 'json',
async: true
});
}
Die JavaScript Funktion sendAjax() macht das Folgende:
- Ermittelt die Formular-ID.
- Schreibt die Formular-ID in die Aufrufs-URL (url) als URL-Parameter (&id=) zu späteren Verwendung durch das VisformsModel.
- Ermittelt den Session-Sicherheits-Token und fügt ihn den Nutzdaten hinzu (data).
- Sendet den AJAX-Request an den Controller MyController an seine Funktion test(): task=my.test.
Der Controller muss 'MyController' heißen (task=my) und im Verzeichnis 'components/com_visforms/src/Controller/' liegen (option=com_visforms)
Die Funktion im Controller muss test() heißen (task=my.test).
- Wartet und Empfängt das Ergebnis.
- Schreibt das Ergebnis in die Web-Browser-Konsole.
Die Controller-Klasse 'MyController' macht das Folgende:
Konstruktor:
- Initialisiert den Basis-Controller.
- Initialisiert das Visforms Modell für das Frontend: components/com_visforms/src/Model/VisformsModel.php.
Funktion test():
- Ermittelt die Nutzdaten und konvertiert diese von JSON in ein PHP stdClass-Objekt.
- Testet auf das korrekte Joomla Session-Sicherheits-Token.
- Sendet eine Erfolgsmeldung zurück.
Hiermit hast du ein vollständiges lauffähiges Beispiel für Aufruf, Backend-Empfang, Bearbeitung und Client-Empfang des Ergebnisses für einen AJAX-Request.
Liebe Grüße, Ingmar