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.
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 übermittelt</h4>"+msg_add2;
return;
}
if (str=="0")
{
document.getElementById("txtWert").innerHTML=msg_add1+"<h4>Kein Wert ausgewä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:
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.