Ajax im Backend für Plugin

Gesperrt
Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Ajax im Backend für Plugin

Beitrag von Faar » Fr 30. Aug 2013, 10:14

Hi,
ich wollte ein Ajax in einem Plugin für das Backend einbauen.
Aber jedesmal kommt entweder die Anmeldemaske (Login) für das Backend oder aber wenn ich die SessionID und Area durchschleife (wie unten im Code), eine leere HTML-Backendseiten-Struktur ohne Inhalte, aber nicht die Ausgabe der Ajax Anfrage. In dem Feld, das dann die Ajax Inhalte anzeigen sollte, war dann entweder ein Backendlogin zu sehen oder gar nichts (HTML ohne Inhalte im Quelltext).

Code: Alles auswählen

var action = "main.php?qr="+str+"&area="+area+"&contenido="+sess;
xmlhttp.open("GET",action,true);
Wie schaffe ich es, dass die Ajax-Anfrage genau in der Plugin-Datei landet (ich habe das "Ajax-PHP" in die Datei gepackt, die für den Content-Bereich des Plugins zuständig ist) und die Ausgabe der PHP-Routine dann wieder vom Ajax aufgenommen werden kann?

VG,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

marcus.gnass_4fb
Beiträge: 87
Registriert: Do 26. Apr 2012, 23:02
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von marcus.gnass_4fb » Sa 31. Aug 2013, 08:05

Welchen Wert hat die Variable sess bzw. die URL in der Variablen action?

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von Faar » Sa 31. Aug 2013, 09:47

Guten Morgen,

die Variable sess hat die aktuelle Session-ID und die url ist nur main.php.
Ich hab das main.php aus dem AMR Plugin übernommen.

Ich glaube, ich muss da noch ein frame=x einbauen, stimmts?

VG,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Ajax im Backend läuft nun, aber...

Beitrag von Faar » Sa 31. Aug 2013, 10:49

Moin,

die Ajax-Abfrage läuft nun (aus einer HTML Select-Liste wird ein Wert ausgewählt und dann holt sich das Ajax die zugehörigen Daten aus der Datenbank und zeigt sie in einer Div-Box an).
Es lag am fehlenden frame=4 Eintrag in der URL.
Erläuterung für Andere: Frame=4 gibt nicht nur den Frame an, sondern damit findet Contenido auch den Pfad zur richtigen Plugin-Datei, die für den Content an dieser Stelle zuständig ist. Diese Einträge macht man in der install.sql und finden sich in den Tabellen con_files und con_frame_files.


Aber, in der Div-Box wird außer den "Ajax-Daten" auch gleich noch der komplette Plugin-Seiteninhalt angezeigt, also quasi das Plugin im Plugin.
Ich vermute, dass Contenido hier den Plugin-Inhalt neu aufbaut, genauer gesagt, das Template content.html nochmal ausgibt.

Logischerweise müsste ich also die Template-Ausgabe in meiner php-Datei (include.xxx_content.php) unterbinden, wenn mit Ajax etwas abgefragt wird, stimmts?

Ich probier das mal.
Zuletzt geändert von Faar am Sa 31. Aug 2013, 10:58, insgesamt 1-mal geändert.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

solved: Ajax im Backend für Plugin läuft

Beitrag von Faar » Sa 31. Aug 2013, 10:53

Hab es probiert, wenn mit Ajax abgefragt wird, wird keine Template Ausgabe gemacht und nun tut es scheints genau das was ich will.
Und ich kann so oft in der Select-Liste auswählen wie ich will, jedesmal werden einfach nur die zugehörigen Daten angezeigt :)

VG,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Ajax im Backend läuft nun, aber...

Beitrag von Spider IT » Sa 31. Aug 2013, 12:06

Moin Frank,
Faar hat geschrieben:Frame=4 gibt nicht nur den Frame an, sondern damit findet Contenido auch den Pfad zur richtigen Plugin-Datei, die für den Content an dieser Stelle zuständig ist.
die Angabe frame=4 in der URL gilt nur und ausschließlich der Dateifindung, für den richtigen Frame (wenn nicht der aktuelle) ist der Parameter 'target' zuständig:

Code: Alles auswählen

<a href="..." target="right_bottom">...</a>
Gruß
René

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von Faar » Mo 2. Sep 2013, 09:06

Moin René,

ich ging einfach davon aus, dass diejenigen die mitlesen, schon mitbekommen haben, dass ich von Plugins und Backend-PHP mit Ajax und DB-Aktionen schreibe und nicht von HTML-Ankern.
Von daher meinte ich, dass man mit frame=4 in der URL den Rahmen unten rechts ansteuert.
Contenido bekommt das dann scheints ganz gut hin, den richtigen HTML-Frame anzusteuern, darum muss ich mich dann weiter nicht kümmern.
Ich verstehe daher jetzt nicht den Zusammenhang mit Deinem Hinweis auf den HTML-Anker?
Wo sollte der Anker hin?

Viele Grüße,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Ajax im Backend für Plugin

Beitrag von Spider IT » Mo 2. Sep 2013, 09:27

Moin Frank,

das ist die Angabe im Link, weil Contenido eben NICHT anhand der Angabe "frame=4" in der URL den richtigen Frame ansteuern kann.
Das ist nämlich Sache des Browsers, der die Antwort vom Server zu diesem Frame weiterleitet.
Wichtig ist diese Angabe also dann, wenn aus Frame x eine Seite in Frame y aufgerufen werden soll (z.B. aus dem linken unteren Frame (Navibereich) im rechten unteren Frame (Contentbereich).

Die Angabe "frame=4" in der URL sagt Contenido lediglich, dass es bei diesem Aufruf die Ausgabe für den rechten unteren Frame generieren soll, wo die dann landet ist wie gesagt Sache des Browsers.

Gruß
René

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von rethus » Fr 24. Jan 2014, 12:19

@Faar:
Könntest du hier mal ein kleines Ajax-Beispiel zu deiner Umsetzung posten? Bin gerade an dem gleichen Problem, allerdings möchte ich aus einem Modul heraus eine Selectliste im BE anzeigen, so dass man dort einen Wert wählt, der über das Plugin in der DB gespeichert wird.

Da ich nun nicht möchte, das der Redakteur im BE (visual Editing) irgendwo einen Submit-Button drücken muss, möchte ich es über Ajax machen. Sobald in der Liste etwas ausgewählt wird, wird ajax angestoßen um die Eingabe zu speichern.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von rethus » Fr 24. Jan 2014, 14:01

Habe gerade einem alten Posting entnommen, dass in /contenido/ajaxmain.php, wohl schon eine Implementierung erdacht ist, diese aber scheinbar noch nicht ausreichend dokumentiert wurde.

Ich möchte hier einen Verbesserungsvorschlag für ajaxmain.php machen:

In Zeile 138 - 144 findet sich folgendes:

Code: Alles auswählen

if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') {
    $oAjax = new cAjaxRequest();
    $sReturn = $oAjax->handle($_REQUEST['ajax']);
    echo $sReturn;
} else {
    include_once($backendPath . $cfg['path']['includes'] . 'ajax/include.ajax.' . $area . '.php');
}
Wird also nicht der Parameter ajax übergeben, hat man die Möglichkeit eine eigene ajax-Include-Datei zu laden.
Hier würde ich mir wünschen, das die Pfaderstellung für diese Include-Datei optimiert wird.

Aktuell brauche ich z.B. ein ajax-File, dass ich "der Ordnung halber" gerne in meinem Pluginverzeichnis wissen möchte, und nicht wie derzeit Implementiert unter /contenido/includes/ajax/. Denkbar wäre über eine neue $_REQUEST['ajax_plugin'] den Wert abzufragen.

Code: Alles auswählen

if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] != '') {
    $oAjax = new cAjaxRequest();
    $sReturn = $oAjax->handle($_REQUEST['ajax']);
    echo $sReturn;
} elseif(isset($_REQUEST['ajax_plugin']) && $_REQUEST['ajax_plugin'] != '') {
    $ajax_plugin_path = "plugins/".strip_tags($_REQUEST['ajax_plugin']."/");
	include_once($backendPath .$ajax_plugin_path . $cfg['path']['includes'] . 'ajax/include.ajax.php');
}
else {
    include_once($backendPath . $cfg['path']['includes'] . 'ajax/include.ajax.' . $area . '.php');
}
Rufe ich nun einen Link in etwa so auf:

Code: Alles auswählen

$tpl->assign('ajaxUrl',		$sess->url(cRegistry::getBackendUrl()."ajaxmain.php?ajax_plugin=xst_contactTeaser"));
wird meine Plugin-Basierte Ajax-Datei sauber integriert.

Würde mich freuen, wenn das Einzug in den Core halten würde.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

xmurrix
Beiträge: 3149
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von xmurrix » Sa 25. Jan 2014, 13:03

Das würde auch ohne die Änderung in der ajaxmain.php funktionieren, eigentlich braucht man die ajaxmain.php nicht.

Man kann im Controller (include-Datei) anhand des Request-Typs die entsprechende Ausgabe machen, HTML bei einem regulären Request oder was anderes, wenn es ein AJAX-Request ist.

Das Plugin "form_assistant" macht einige AJAX-Requests und funktioniert ohne diese Requests an die ajaxmain.php zu senden. Diese gehen an main.php, die main.php entscheidet welches includes eingebunden werden soll und das include entscheidet was es ausgibt. So hat mein im Backend einen "Einstiegspunkt" für Anfragen und weniger Redundanz.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von rethus » Mo 27. Jan 2014, 12:45

xmurrix hat geschrieben: Man kann im Controller (include-Datei) anhand des Request-Typs die entsprechende Ausgabe machen, HTML bei einem regulären Request oder was anderes, wenn es ein AJAX-Request ist.
Gruß
xmurrix
Kannste da mal ein kurzes anschauliches Beispiel mit kurzer Erklärung Posten?
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von Faar » Mo 27. Jan 2014, 15:34

rethus hat geschrieben:@Faar:
Könntest du hier mal ein kleines Ajax-Beispiel zu deiner Umsetzung posten? Bin gerade an dem gleichen Problem, allerdings möchte ich aus einem Modul heraus eine Selectliste im BE anzeigen, so dass man dort einen Wert wählt, der über das Plugin in der DB gespeichert wird.

Da ich nun nicht möchte, das der Redakteur im BE (visual Editing) irgendwo einen Submit-Button drücken muss, möchte ich es über Ajax machen. Sobald in der Liste etwas ausgewählt wird, wird ajax angestoßen um die Eingabe zu speichern.
Das war auch mein Beweggrund, dass der Redakteur nur die Select-Liste bedienen muss und schwupps, sind die Daten da (und funktioniert auch so).
Aber ganz so trivial ist es nicht mit Contenido, man muss ja alles mitziehen.

Client-Bereich:
1. In der Select-Auswahl stehen die Daten, die der Redakteur auswählen soll. Diese Daten werden schon beim Aufruf der Backendseite in das Select geschrieben. Dann sieht es in Code ungefähr so aus:

Code: Alles auswählen

<select name="werteliste" onchange="showWert(this.value)">{WERT}</select>
showWert() ruft also die Ajax-Funktion auf, die natürlich irgendwie in der Datei des Plugins eingebunden sein muss. "onchange" dürfte klar sein und this.value nimmt genau den Option-Wert, der ausgewählt wurde.

2. Natürlich braucht es auch irgendwo einen Platz, worin die Ausgabe dann angezeigt wird. Ich habe das dicht darunter gemacht, in eine div-Box.

Code: Alles auswählen

<!-- Ajax Ausgabebox -->
<div id="txtWert"> </div>
3. Der Ajax-Code sieht dann in etwa so aus (Original gibts den irgendwo im Netz, hab den für Contenido und mein Projekt angepasst):

Code: Alles auswählen

function showWert(str)
		{
		var msg_add1 = "<table class=\"contenttable\" cellspacing=\"0\" cellpadding=\"3\" border=\"0\" width=\"1000px\"><tr><td align=\"center\">";
		var msg_add2 = "<td><tr></table>";

		if (str=="")
		  {
		  document.getElementById("txtWert").innerHTML=msg_add1+"<h4>Keine Daten &uuml;bermittelt</h4>"+msg_add2;
		  return;
		  }
		if (str=="0")
		  {
		  document.getElementById("txtWert").innerHTML=msg_add1+"<h4>Kein Wert ausgew&auml;hlt</h4>"+msg_add2;
		  return;
		  }
		if (window.XMLHttpRequest)
		  {// code for IE7+, Firefox, Chrome, Opera, Safari
		  xmlhttp=new XMLHttpRequest();
		  }
		else
		  {// code for IE6, IE5
		  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		  }
		xmlhttp.onreadystatechange=function()
		  {
		  if (xmlhttp.readyState==4 && xmlhttp.status==200)
		    {
		    document.getElementById("txtWert").innerHTML=xmlhttp.responseText;
		    }
		  }
    var area = document.getElementById("id1").value;
    var frame = document.getElementById("id2").value;
    var sess = document.getElementById("id3").value;
    var suchwert = "main.php?qwert="+str+"&area="+area+"&frame="+frame+"&contenido="+sess;
    //document.write(suchwert);
		xmlhttp.open("GET",suchwert,true);
		xmlhttp.send();
}
Der ausgewählte Select-Wert wird als Variable str durch die Funktion geschleift und findet sich dann im GET-Aufruf der Contenido eigenen main.php wieder.
Wie oben angemerkt, muss man natürlich con_area, con_frame und die Session durchleiten. Folglich müssen die irgendwo auch abgespeichert sein. Ich habe das einfach ins HTML des Plugins übergeben (id1, id2, id3), dort kann man es einfach abgreifen (document.getElementByID() ).
Damit wäre die Client Seite erledigt.

Fehlt noch die Backend Seite.
Ich habe die gleiche Plugin-Datei genommen, die dem Redakteur die Auswahl und folglich auch die Ausgabe zusammenstellt (die Anzeige selbst wird ja dem HTML-Template überlassen, Contenido 4.8 standard).
Dort in der Plugin-Datei irgendwo vor der HTML_Template-Ausgabe muss dann das Ajax Angebot angenommen werden.

Code: Alles auswählen

if($_GET['qwert']){
... übliche PHP-Backend Verarbeitungsschritte.
Ausgabe
}
Ich habe mir hier erspart, das irgendwie aufzudröseln, denn GET Anfragen und nachfolgende Datenbankabfragen und Variablenzuzweisungen setze ich mal voraus.
Ich habe mir halt alles, was ich ausgeben will, in der Variablen $ajax gesammelt.

Code: Alles auswählen

$ajax .= "<table class=\"contenttable\" width=\"1000px\">
...
$ajax .= "<input type=\"checkbox\" >
...
Am Ende wird dann alles mit einem simplen Echo ausgegeben:

Code: Alles auswählen

echo $ajax;
Ajax bekommt dann dieses HTML zu sehen, sonst nichts!

Der Witz dabei ist, die nochmalige Template-Ausgabe der Datei wird unterbunden, indem ich entweder eine GET-Anfrage bearbeite oder normal die Backendseite des Plugins ausgebe:

Code: Alles auswählen

if($_GET['qwert']){
... Ajax
}else{
... Standardausgabe über HTML-Template
}
Das wars.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 3149
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Ajax im Backend für Plugin

Beitrag von xmurrix » Mo 27. Jan 2014, 22:10

Faar hat schon alles Wichtige in seinem Beispiel gesagt, dem gibt es nichts hinzuzufügen.

Im Grunde machst ein Request auf deine include-Datei, das kann z. B. deine Plugin include-Datei sein. Beim Plugin übergibst du als Parameter die area und die action, damit CONTENIDO weiß, welche Datei eingebunden werden soll.

Wenn dein Script sowohl AJAX-Requests verarbeitet, als auch reguläre Request, kannst du in deinem Script prüfen, ob es ein AJAX-Request ist oder nicht.
Einige Frameworks senden beim AJAX-Request einen speziellen HTTP-Request Header, den kann man dann in PHP mit

Code: Alles auswählen

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 'XMLHttpRequest' === $_SERVER['HTTP_X_REQUESTED_WITH']) {
    // das ist ein AJAX-Request
}
Willst du auf Nummer sicher gehen, dann sende z. B. einen Parameter ajax=1 mit, und prüfe auf das in deiner include-Datei.

Wenn die ankommenden Parameter sowie die Rechte des Users stimmen, kannst du die Aktion ausführen, das Ergebnis ausgeben und das Script beenden.

Ist die Ausgabe nicht ein HTML-Schnipsel, z. B. JSON, dann solltest du vorher noch den richtigen HTTP-Response Header ausgeben

Code: Alles auswählen

header('Content-type: application/json');
Hier erkennen einige JavaScript Frameworks, dass die Antwort ein JSON String ist und konvertieren es dann gleich in ein JSON-Objekt.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Gesperrt