Forum

Moderiert von:
Forum: Entwicklungs Support
Sie schreiben eine Antwort zum Thema: Sidebox + Ajax-Technik
Gehe zu: OpenPHPNuke - das Open Source CMS Forum Index


Benutzername:
 
Sicherheits-Code
Sicherheits-Code
Neu laden

Thema im Überblick

Autor
Freespacer

Registriert: 03.10.2006
Beiträge: 205
Wohnort: Essen


Sende eine Private Nachricht an Freespacer
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


Zitieren Druckerfreundliche Darstellung nach oben
Freespacer

Registriert: 03.10.2006
Beiträge: 205
Wohnort: Essen


Sende eine Private Nachricht an Freespacer
Sidebox + Ajax-Technik

Geschrieben: 14.01.2007 09:39

Hallo Heinz!

hombergs schrieb am 13.01.2007 um 18:25:33 Uhr folgendes:

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.

hombergs schrieb am 13.01.2007 um 18:25:33 Uhr folgendes:

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?

hombergs schrieb am 13.01.2007 um 18:25:33 Uhr folgendes:

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


Zitieren Druckerfreundliche Darstellung nach oben
hombergs
Registriert: 05.09.2001
Beiträge: 256
Wohnort: Frankfurt (Main)


Sende eine Private Nachricht an hombergs Besuche die Homepage von hombergs
ICQ AIM YIM MSNM
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.

Zitieren Druckerfreundliche Darstellung nach oben
stefan
Beiträge: 2435
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
Sidebox + Ajax-Technik

Geschrieben: 13.01.2007 14:19

Freespacer schrieb am 13.01.2007 um 13:04:33 Uhr folgendes:


Ü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


Zitieren Druckerfreundliche Darstellung nach oben
Freespacer

Registriert: 03.10.2006
Beiträge: 205
Wohnort: Essen


Sende eine Private Nachricht an Freespacer
Sidebox + Ajax-Technik

Geschrieben: 13.01.2007 13:04

stefan schrieb am 13.01.2007 um 11:17:43 Uhr folgendes:

ich kann mit js die elemente der seite auslesen und entsprechend eragieren.


Jepp, genau.

stefan schrieb am 13.01.2007 um 11:17:43 Uhr folgendes:

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)

stefan schrieb am 13.01.2007 um 11:17:43 Uhr folgendes:

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*

stefan schrieb am 13.01.2007 um 11:17:43 Uhr folgendes:

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


Zitieren Druckerfreundliche Darstellung nach oben
stefan
Beiträge: 2435
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
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



Zitieren Druckerfreundliche Darstellung nach oben
Freespacer

Registriert: 03.10.2006
Beiträge: 205
Wohnort: Essen


Sende eine Private Nachricht an Freespacer
Sidebox + Ajax-Technik

Geschrieben: 13.01.2007 09:26

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

jein


*guck_schief*

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

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?

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

2 wege sind möglich


Hm...

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

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?

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

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

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

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

stefan schrieb am 13.01.2007 um 07:55:19 Uhr folgendes:

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


Zitieren Druckerfreundliche Darstellung nach oben
stefan
Beiträge: 2435
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
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


Zitieren Druckerfreundliche Darstellung nach oben
Freespacer

Registriert: 03.10.2006
Beiträge: 205
Wohnort: Essen


Sende eine Private Nachricht an Freespacer
Sidebox + Ajax-Technik

Geschrieben: 13.01.2007 05:57

stefan schrieb am 08.01.2007 um 21:21:56 Uhr folgendes:

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.

stefan schrieb am 08.01.2007 um 21:21:56 Uhr folgendes:

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


Zitieren Druckerfreundliche Darstellung nach oben
stefan
Beiträge: 2435
Wohnort: Münster


Sende eine Private Nachricht an stefan
ICQ
Sidebox + Ajax-Technik

Geschrieben: 08.01.2007 21:21

Freespacer schrieb am 08.01.2007 um 20:34:10 Uhr folgendes:


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

Freespacer schrieb am 08.01.2007 um 20:34:10 Uhr folgendes:


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

Freespacer schrieb am 08.01.2007 um 20:34:10 Uhr folgendes:


$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


Zitieren Druckerfreundliche Darstellung nach oben
3 Seiten ( 1 - 2 - 3 )