Autor |
|
Freespacer
 Registriert: 03.10.2006
Beiträge:
205
Wohnort: Essen

|
Sidebox + Ajax-Technik
Geschrieben: 14.01.2007 18:37
So, ich glaube, ich habe mich mal wieder selbst übertroffen.
Die Ajax-Klasse habe ich einer Diät-Kur unterzogen.
@Stefan: Du wolltest es ja vollkommen automatisch haben.  Ich denke, dass ist mir mit diesem Release gelungen.
Du musst nur noch im Modul den Namen der Form angeben, gleichzeitig ist es auch der Name der Rückgabefunktion für Ajax.
$opnConfig['opnajax']->add_form_ajax('search_mainsearch');
Lediglich im Formular muss man noch folgendes Hiddenfeld einfügen, damit Ajax weiß welcher Inhalt zu ersetzen ist:
$form->AddHidden ('ajaxid', 'searchresult', true);
Fertig, ist das kleine Kind. Habe da bestimmt 3 Stunden daran rumgeschraubt.
Aktualisiert in Experimental Rev. 130
Gruß
Sebastian
|
 |
Freespacer
 Registriert: 03.10.2006
Beiträge:
205
Wohnort: Essen

|
Sidebox + Ajax-Technik
Geschrieben: 14.01.2007 09:39
Hallo Heinz!
So dann auch mal meinen Senf dazu geben tun.
Wegen der Übergabe eines PHP Arrays an JS kann ich evtl. etwas weiterhelfen.
Da wir in Aurora sowas machen mittels der SAJAX Lib.
Das JS ruft per Request die PHP Funktion auf. Diese baut das PHP Array auf und macht nen return implode('|',$array);
In der JS Callbackfnktion wird ein var jsWert = retarray.split('|'); gemacht.
Und schon hat man sein PHP Array als JS Array.
Ja, so ähnlich habe ich es mir auch schon gedacht. Leider hat dein Beispiel einen Hacken. Es unterstützt kein assoziatives Array.
Dazu habe ich schon eine Lösung gefunden und werde von PHP die Funktion "Serialize()" bzw. "Unserialize()" in JS übernehmen. Dann haben nämlich PHP und JS dieselbe Arraystruktur.
Dazu gibt es auch schon Lektüren:
http://www.phpguru.org/static/PHP_Unserialize.html
http://aspn.activestate.com/ASPN/Cookbook/PHP/Recipe/414334
http://kkaefer.com/blog/category/javascript
Davon könnte man sich was abkupfern.
Oder man kann auch in JS via document.forms['FormName'].elements.length mittels einer for Schleife auf alle Formularelement zugreifen.
Tja, jetzt kann man sich darüber streiten, ob man jetzt mit assoziativen Array arbeiten möchte
... oder ...
nur mit dem Namen der Form und mittels einer Schleife alle Elemente abgrasen.
Was meint ihr, welchen Weg man einschlagen sollte?
Wie immer führen viele Wege nach Rom.
Klar. Einige Browser haben ja auch andere Ziele wie z.B. nach Redmond und nicht Rom. Dann leiste mal Überzeugungsarbeit, dass Redmond nich das Ziel ist, sondern Rom.
Gruß
Sebastian
|
 |
hombergs Registriert: 05.09.2001
Beiträge:
256
Wohnort: Frankfurt (Main)

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 18:25
So dann auch mal meinen Senf dazu geben tun.
Wegen der Übergabe eines PHP Arrays an JS kann ich evtl. etwas weiterhelfen.
Da wir in Aurora sowas machen mittels der SAJAX Lib.
Das JS ruft per Request die PHP Funktion auf. Diese baut das PHP Array auf und macht nen return implode('|',$array);
In der JS Callbackfnktion wird ein var jsWert = retarray.split('|'); gemacht.
Und schon hat man sein PHP Array als JS Array.
Oder man kann auch in JS via document.forms['FormName'].elements.length mittels einer for Schleife auf alle Formularelement zugreifen.
Wie immer führen viele Wege nach Rom. 
H.O.M.B.E.R.G.S.: Hydraulic Obedient Machine Built for Efficient Repair and Galactic Sabotage
Es gibt keine Probleme, nur Herausforderungen.
Stoppt Softwarepatente, sonst wird Softwareentwicklung in Europa für die meisten illegal!
Infos: Der Patentierte Europäische Online-Shop
Utopia 1: Die Welt wo alle Browser valides HTML und valides CSS 2 verstehen und alle es gleich anzeigen.
Utopia 2: Die Welt wo alle SQL Server den ANSI SQL Standardsyntax einwandfrei beherschen und ausführen.
|
 |
stefan Beiträge:
2435
Wohnort: Münster

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 14:19
Übrigens: Gibt es irgendeinen Grund, warum Experimental Rev. 70 + 73 nicht in den Trunk gefloßen sind? Es ging um den Bug #980.
ist ; zugegebenener massen mit einem falschen text rev. 300
Da wir a) ne neues Jahr schreiben und b) uns auf eine Release zu bewegen ist das z.Zt. recht identisch ausser ajax halt
|
 |
Freespacer
 Registriert: 03.10.2006
Beiträge:
205
Wohnort: Essen

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 13:04
ich kann mit js die elemente der seite auslesen und entsprechend eragieren.
Jepp, genau.
zum array...
du hast ne php array wie über gibts du das in js? ich meine nicht nur reines js. die output würde dir ne php array liefern
Ich dachte eher an die Formulare und deren Elemente und Name. PHP bzw. OPN bereitet eine PHP-Array der Form-Elemente in eine JS-Array auf. Und eine JS-Funktion verwendet die JS-Arrays, um entsprechende Werte in den Elementen abzurufen und baut diese dann in ein Request ein. (Soviel zur Theorie)
ja die function SetDisplayVar bezieht sich boxen weit was aber nicht schlimm wäre. du hast eine "init haut" js und jede box liefert eben das was für die box ist als sub js
Hä?  *versteh_nur_Bahnhof*
aber mach mal das wird hier viel zu theorethisch
Wat nu? Von der Wiege bis zur Barre: Formulare, Formulare
Also echt.  Werde jetzt mal ein bißle an OPN und Ajax programmieren und nochmal umbauen, um es doch noch etwas zu vereinfachen bzw. wie du es so schön nennst, dass alles automatisch funktioniert.
Übrigens: Gibt es irgendeinen Grund, warum Experimental Rev. 70 + 73 nicht in den Trunk gefloßen sind? Es ging um den Bug #980.
Gruß
Sebastian
|
 |
stefan Beiträge:
2435
Wohnort: Münster

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 11:17
ich kann mit js die elemente der seite auslesen und entsprechend eragieren.
zum array...
du hast ne php array wie über gibts du das in js? ich meine nicht nur reines js. die output würde dir ne php array liefern
ja die function SetDisplayVar bezieht sich boxen weit was aber nicht schlimm wäre. du hast eine "init haut" js und jede box liefert eben das was für die box ist als sub js
aber mach mal das wird hier viel zu theorethisch
|
 |
Freespacer
 Registriert: 03.10.2006
Beiträge:
205
Wohnort: Essen

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 09:26
jein
*guck_schief*
also das automatisch würde ich mir noch mehr automatisch wünschen. ein
$this->_forms['modul']['formname']['element']['name'] = $value;
wäre schon zu viel
Zuviel?
2 wege sind möglich
Hm...
1 weg komplett in der ajax classe eine function einbauen die alle elemente ausliest und entsprechend setzt.
würde gehen hätte vorteile weil dann nix mehr manuell gemacht werden müsste ausserdem gehts bei laufzeit aber auch nachteile relativ viel js zu nötig
Wie stellst du dir eine Funktion vor, wenn diese noch nicht mal die Elemente in einem Formular kennt?
2 weg ne billig lösung
die formular class merkt sich halt die entsprechenden daten. im array oder sonst wie. wobei auch dann das erzeugen des js umfangreich wird weil du ja das array so nicht einfach in js einfügen kannst.
öhm, eigentlich geht es mit JS sogar ganz gut.  Nur habe ich dato bis heute noch nicht umgesetzt. Obwohl mit einem Array, lässt sich eine JS-Funktion basteln, die aus dem Array die Elemente und dessen Name daraus die Werte im Formular ausliest. Und dementsprechend ein Request zusammenbaut.
Daher könnte ich mir die Lösung auch ganz gut vorstellen, da wenig JS-Code an den Browser gesendet werden.
Hier so ein kleiner Ansatz mit Array und For-in-Schleife:
http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays
http://de.selfhtml.org/javascript/sprache/schleifen.htm#for_in
>Wird eigentlich auch der Name des Modules
ja aber das nützt dir nichts
es steht zwar das aktive "haupt" modul zurverfügung das heisst aber noch lange nicht das es nicht ausnahemn gibt
beispiel
mach eine centerbox search die nur aktiv sein soll wenn forum sichtbar
dann würde trotzdem das die box sichtbar wäre natürlich als aktives modul forum gesetzt sein. somit hilft dir das nicht.
Sowas ähnliches habe ich mir auch schon gedacht, dass es so nicht einfach ist.
ob ajax geladen werden soll oder nicht würde ich bei der lösung
$opnConfig['opnOutput']->SetDisplayVar ($var, $wert);
bleiben. damit kann das modul recht flexibel daten setzen die sich auf die jeweilige box beziehen
Äh, und was nutzt mir im Endeffekt dieser Funktionsaufruf, wenn doch die Klasse class.opn_output.php auch prüfen kann, ob die Klasse $opnConfig['opnajax'] (manuell im Modul) initiert worden ist.
Sorry, ich verstehe es nicht so ganz.
Denn die Klasse $opnConfig['opnajax'] muss von der ersten Initierung bis zum Ende des Scripts (Ausgabe zum Browser) existieren. Damit die Ajax-Klasse weiß, welchen JS-Code im Header gebaut werden soll, die letztendlich von class.opn_output.php aufgerufen wird und leider muss es in einem Rutsch geschehen.
Und was mit der Funktion $opnConfig['opnOutput']->SetDisplayVar ($var, $wert); angeht:
Einmal definiert (inkl. Formularelemente), wird diese einfach vom nachfolgenden Modul überschrieben, oder sehe ich das verkehrt?
Hier ein Auschnitt aus class.opn_output.php:
function SetDisplayVar ($key, $var, $mode = false) {
global $opnConfig;
...
if ($key !== false) {
$this->_SetDisplayVar[$key] = $var;
}
...
In meinen Augen ist der Vorschlag leider nicht gerade flexibel. Stell dir mal 3 Sideboxen und 1 Centerbox vor, die zusammen Ajax verwenden. Und nun?
Gruß
Sebastian
|
 |
stefan Beiträge:
2435
Wohnort: Münster

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 07:55
jein
also das automatisch würde ich mir noch mehr automatisch wünschen. ein
$this->_forms['modul']['formname']['element']['name'] = $value;
wäre schon zu viel
2 wege sind möglich
1 weg komplett in der ajax classe eine function einbauen die alle elemente ausliest und entsprechend setzt.
würde gehen hätte vorteile weil dann nix mehr manuell gemacht werden müsste ausserdem gehts bei laufzeit aber auch nachteile relativ viel js zu nötig
2 weg ne billig lösung
die formular class merkt sich halt die entsprechenden daten. im array oder sonst wie. wobei auch dann das erzeugen des js umfangreich wird weil du ja das array so nicht einfach in js einfügen kannst.
>Wird eigentlich auch der Name des Modules
ja aber das nützt dir nichts
es steht zwar das aktive "haupt" modul zurverfügung das heisst aber noch lange nicht das es nicht ausnahemn gibt
beispiel
mach eine centerbox search die nur aktiv sein soll wenn forum sichtbar
dann würde trotzdem das die box sichtbar wäre natürlich als aktives modul forum gesetzt sein. somit hilft dir das nicht.
ob ajax geladen werden soll oder nicht würde ich bei der lösung
$opnConfig['opnOutput']->SetDisplayVar ($var, $wert);
bleiben. damit kann das modul recht flexibel daten setzen die sich auf die jeweilige box beziehen
|
 |
Freespacer
 Registriert: 03.10.2006
Beiträge:
205
Wohnort: Essen

|
Sidebox + Ajax-Technik
Geschrieben: 13.01.2007 05:57
Ich würde das nicht in der master.php inializieren
Da du mir ja die Möglichkeit OPN von der Shell zu starten gezeigt hast, so habe ich mir überlegt, ob man die Ajax-Klasse nicht manuell in jeweiligen Modulen nachladen sollte. Und die class.opn_output.php sollte eben prüfen, ob die Ajax-Klasse geladen wurde und entsprechend handeln. Bevor dann die Ajax-Klasse eingebunden wird, wird zuerst geprüft, ob in der Grundeinstellung (Schalter) Ajax eingebunden werden soll oder nicht und ob der Browser dazu in der Lage ist.
ja nur ist das nicht ganz so geschickt. weil man im code dann jeden einzeln (oder als array) über geben muss. geschickter wäre wenn er "automatisch" alle elemente holt und über gibt
ne "krücke" wäre denkbar durch die form class aber auch das wäre nur ne krücke
Automatisch holen?! Hmmm. Das bedeutet, auch die class.formular.table.php musste wegen der Integration von Ajax daran glauben und dort alle Namen wie auch Input/Textarea/Select-Elemente pro Form pro Modul sich merken. Obwohl dieses Array bereits schon in der Ajax-Klasse gebaut wird, kann man diese in das Formular auslagern, um die Übergabe der Element und deren Namen zu automatisieren. Stimmt schon, sollte man machen.
(Sehe mir gerade die Ajax-Klasse an und da fällt es mir auf, dass man das Array weiter optimieren kann, aber da es ja sowieso nach class.formular.table.php ausgelagert werden soll, werde ich die Optimierung dort vornehmen.)
Dann müsste z.B. wie folgt eingebunden werden:
$this->_forms['modul']['formname']['element']['name'] = $value;
Dann könnte die Ajax-Klasse damit auch "arbeiten", wenn man dieses Array von der Form-Klasse sich holt.
z.B.:
$form = & new opn_FormularClass ('default');
$form->Init ($opnConfig['opn_url'] . '/system/search/index.php', 'post', 'mainsearch');
...
$form->GetFormular ($boxtext);
$opnConfig['opnajax']->add_formdata_js($form->_forms);
Dann muss aber die Klasse class.formular.table.php auch wissen, ob Ajax aktiv ist, dann kann er auch gleich den JS-Aufruf der Ajax-Klasse $opnConfig['opnajax']->ajax_get_function_javascript(true) bzw. $opnConfig['opnajax']->ajax_get_function_javascript() einfügen.
Wird eigentlich auch der Name des Modules wie z.B. "search" irgendwo in $opnConfig gespeichert? Dann kann man den Namen des Modules auch automatisch an die Ajax-Klasse abtreten lassen. (z.b. function search_mainsearch oder function search_mainsearch2) für den Direkt-Aufruf per AJAX in PHP.
Gruß
Sebastian
|
 |
stefan Beiträge:
2435
Wohnort: Münster

|
Sidebox + Ajax-Technik
Geschrieben: 08.01.2007 21:21
Da müsste man noch einen Schalter einbauen, der abfragt, ob Ajax zugelassen werden soll.
Ich würde das nicht in der master.php inializieren
mit der Shell?
Du meinst die Programme links oder lynx?
Nö; linux shell - da wo man mit Buchstaben statt Maus spielt
z.b. opn-bin/errorlog.php -delete
oder über die perl schnittstelle opn_engine.pl
wie auch immer opn ist in der lage ein framework auf shell ebene abzubilden und da brauch ich kein ajax im speicher
$opnConfig['opnajax']->add_formdata_js oder so ähnlich als JS-Code zur Abfrage der Daten als Request gebaut.
ja nur ist das nicht ganz so geschickt. weil man im code dann jeden einzeln (oder als array) über geben muss. geschickter wäre wenn er "automatisch" alle elemente holt und über gibt
ne "krücke" wäre denkbar durch die form class aber auch das wäre nur ne krücke
|
 |