Autor Freespacer
Datum 08.12.2006 05:27
Beiträge: Hallo,

es geht in erster Linie, um den Feature Wunsch von Boby im BT #974, aber auch prinzipiell die AJAX-Technik.

Wir wissen ja alle, dass jedes große Content-Management-System lange Ladezeiten mit sich bringt. Ich habe vor, die Ajax-Technik in OPN zu integrieren, um die Aktualisierung der gesamten Webseite zu unterbinden und gleichzeitig die Effektivität zu erhöhen.

Die AJAX-Technik habe ich bereits fertig und das Nachladen von Daten per POST- und GET-Methode ohne Aktualisierung der gesamten Seite funktioniert in allen modernen Browsern (FF/IE/Opera) soweit.

Jetzt zu meinem Problem.

Gibt es in OPN eine Funktion, die nur den Inhalt der Sitebox/Centerbox neu baut und die geänderten Parametern an das jeweilige Modul übertragt?

Für dieses Vorhaben brauche ich für die Sitebox und Centerbox ein "Ajax"-Zugang oder soll ich sagen ein "ONLY-Content"-Zugang in OPN. Gibt es da eine Möglichkeit oder muss man sich da was zusammen basteln?

Gruß

Sebastian


Autor stefan
Datum 08.12.2006 05:57
Beiträge: nun das ist ein grösseres unterfangen. ich habe mir hier auch schon mal eine AJAX class genaut die auch entsprechend geht, allerdings bin ich dann ebenso auf einproblem gestossen das dann in die struktur einzubetten von opn

du hast da mehere probleme

sideboxen
diese kannst du per class abruf dir holen das ist unkritisch

centerbox
eingeschränkt möglich s. dazu inline box da mach ich das ja

aber was ist mit dem modul selbst also der index seite eines modules da has du ein problem

ebenso was nützt dir nur der ccontent es soll sich ja was verändern und auch nicht wieder alles übertragen werden. beispiel umschalten eines schalters da willst dan doch ned die ganze side/centerbox übertragen also brauchst dazu auch noch art interface

aber vielleicht ist deine classe ja anderes aufgebaut zeigt doch mal.


Autor Freespacer
Datum 08.12.2006 06:52
Beiträge: stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

nun das ist ein grösseres unterfangen. ich habe mir hier auch schon mal eine AJAX class genaut die auch entsprechend geht, allerdings bin ich dann ebenso auf einproblem gestossen das dann in die struktur einzubetten von opn


Na, dann bin ich ja auch nicht alleine.

stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

du hast da mehere probleme


Das habe ich mir schon fast gedacht.

stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

sideboxen
diese kannst du per class abruf dir holen das ist unkritisch


Tolle Idee, und wie mache ich das in einem Standalone-Script? Da fangen doch erst die Probleme an.

stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

centerbox
eingeschränkt möglich s. dazu inline box da mach ich das ja


Inlinebox??? Also, mir wäre ein vollständiger Neuaufbau wie auch teilweiser Aufbau der jeweiligen Centerbox lieber. Ganz ehrlich. In der Centerbox kann man noch viele andere Container einbetten und diese zum Aktualisieren zwingen, so ist das nicht.

stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

aber was ist mit dem modul selbst also der index seite eines modules da has du ein problem


Schön wäre es, wenn es kein Problem ist.

stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

ebenso was nützt dir nur der ccontent es soll sich ja was verändern und auch nicht wieder alles übertragen werden. beispiel umschalten eines schalters da willst dan doch ned die ganze side/centerbox übertragen also brauchst dazu auch noch art interface


STOP!!! Wirf bitte nicht alles durcheinander.
Ich zähle mal hier auf, wo man Ajax in OPN verwenden kann und wie OPN darauf reagieren soll.

1. Einstellungen wie Admin-Menü, Benutzer-Daten, werden per Ajax aktualisiert. Die OPN-Seite wird dabei nicht komplett geladen, sondern nur die Einstellungen werden transferiert und entsprechend wie die WAITING-BOX eine Info an den User übermittelt, dass die Einstellung gespeichert wurde.

2. Centerbox/Sidebox: Manchmal muss der komplette Content der Centerbox/Sidebox aktualisiert werden (Siehe Kalender). Man kann auch für alle anderen Centerbox/Sidebox einzelne Container aktualisieren bzw. nachladen.

Betrifft Content: OPN muss die Daten und den Content aufbereiten, dass kann man mit JavaScript alleine nicht machen, da jeder Browser auf JavaScript anders reagiert. Bei den Eingabefeldern, etc. sieht es anders aus. Der Aufbau eines kompletten Contents will ich nicht alleine auf JavaScript stützen, dann lieber der Tranfer von XHTML+Daten per PHP bzw. OPN. Dieser macht nur zu einem kleinen Teil aus.

stefan schrieb am 08.12.2006 um 05:57:55 Uhr folgendes:

aber vielleicht ist deine classe ja anderes aufgebaut zeigt doch mal.


PHP-Klasse ist gut, ich bin noch im Anfangsstadium. Ich konnte höchsten mit einem kleinem JavaScript, in OPN eingebunden, einen Teil des Contents nachladen oder auch entsprechend ersetzen. Dieses JavaScript wird später noch sehr stark erweitert. Dafür habe ich den SPAN-Tag mit einer ID genommen (unsichtbarer Container) und innerhalb der Sidebox/Centerbox gelegt und innerhalb des SPAN-Tags habe ich den eigentlichen Inhalt vom Modul geladen. Nur beim Nachladen des Content mit dem Aufbau des OPN-Moduls bin ich auf ein Hinternis gestoßen.

Aber so wie ich die Sache jetzt sehe, müssen noch einige Funktionen in OPN integriert werden, damit dieser den Content (ob alles oder auch nur ein kleiner Teil) mit Parameterübergabe des jeweiligen Moduls ein neuen Content baut.

Jetzt bin ich am Überlegen, wie man das am Besten ohne größeren Aufwand hinbekommt.

Gruß

Sebastian


Autor stefan
Datum 08.12.2006 07:35
Beiträge: ok ich bin ein etwas anderen weg gegangen. die class dient mir dazu das ich php funktionen per ajax aufrufe. somit kann ich den 2ten teil (das verändern von daten) einfach realisieren nur ist da die struktur in opn noch nicht für ausgelegt.


Autor Freespacer
Datum 08.12.2006 08:32
Beiträge: stefan schrieb am 08.12.2006 um 07:35:18 Uhr folgendes:

ok ich bin ein etwas anderen weg gegangen. die class dient mir dazu das ich php funktionen per ajax aufrufe. somit kann ich den 2ten teil (das verändern von daten) einfach realisieren nur ist da die struktur in opn noch nicht für ausgelegt.


Äh, kannst du mir die Klasse mal zeigen, irgendwie werde ich aus deiner Antwort nicht wirklich schlau.

Hier ist zur Zeit mein kleines Ajax-Script:

function ajax_init() {
     var xmlHttp = false;
     var msxmlhttp = new Array(
               'Msxml2.XMLHTTP',
               'Msxml2.XMLHTTP.3.0',
               'Msxml2.XMLHTTP.4.0',
               'Msxml2.XMLHTTP.5.0');
     for (var i = 0; i < msxmlhttp.length; i++) {
          try {
               xmlHttp = new ActiveXObject(msxmlhttp<em>);
          } catch (e) {
               xmlHttp = null;
          }
     }
     if(!xmlHttp && typeof XMLHttpRequest != 'undefined') {
      xmlHttp = new XMLHttpRequest();
     }
     if(!xmlHttp) { alert('XMLHttpRequest not supported!'); }
     return xmlHttp;
}     

function ajax_content_change(moduleid,xmldata) {
     document.getElementById(moduleid).innerHTML = xmldata;
}

function ajax_get_data(moduleid,requestpath,methode,getpostdata) {
     var xmlHttp = new ajax_init();
     var xmldata;
     if (xmlHttp) {
          if(methode == 'GET') { requestpath = requestpath + "?" + getpostdata; }
          xmlHttp.open(methode, requestpath, true);
          xmlHttp.onreadystatechange = function () {
               switch (xmlHttp.readyState) {
                    case 0 : // UNINITIALIZED
                    case 1 : // LOADING
                    case 2 : // LOADED
                    case 3 : // INTERACTIVE
                         break;
                    case 4 : // COMPLETED
                         xmldata = xmlHttp.responseText;
                         ajax_content_change(moduleid,xmldata);
                         break;
                    default : ; // ERROR STATUS
               }
          };
          if(methode == 'POST') {
               xmlHttp.setRequestHeader(
                    "Content-Type",
                    "application/x-www-form-urlencoded");
               xmlHttp.send(getpostdata);
          } else if(methode == 'GET') {
               xmlHttp.send(null);
          }               
     }
}


Dieses Script ist zwar klein und wird vom Browser in der Regel nur 1x geladen. Ein PHP-Script ohne Ajax müsste für jede Änderung komplett angestossen werden.

Das o.g. Script ist nur die Struktur, laßt sich aber noch viel weiter ausbauen und verfeinern. Mit diesem Script kannst du kleine wie auch große Sachen verändern. Da brauchst du für das Aktualisieren und/oder das Austauschen des Contents/Settings auch keine großartige PHP-Klasse. Gesendet wird ja grundsätzlich mit POST. Das o.g. Script läßt auch GET-Methode zu.

Im Modul brauchst du nur folgenden Code einfügen:

<a href="#" onclick="ajax_get_data('calendar','".$opnConfig['opn_url']."/modules/calendar/plugin/sidebox/calendar/main.php."','POST','date=2007-01-01&time=12:00:00')>Gehe zu Januar 2007</a>


Beim Draufklicken wird das Request an OPN abgesetzt. Leider ist OPN noch nicht in der Lage die Daten zu verarbeiten und ein neues Content zurück zu schicken, um das vorhandene Content zu ersetzen bzw. zu aktualisieren.

Hört sich eigentlich sehr simple an.

Was schlägst du für die Änderungen an OPN vor?

Gruß

Sebastian


Autor stefan
Datum 09.12.2006 11:37
Beiträge: wo man das an setzt ist eine gute frage da ja wenn du z.b. sideboxen senden wilst diese mit einer id versehen werden müssen damit du mit

document.getElementById("sideboxid1").innerHTML = val;

entsprechedn die die daten auch setzen kannst also den inhalt, im theme das einzubauen wäre da dann recht einfach, da das aber aus opn kommen soll ist das im theme nicht zu machen.

bliebe nur ein div um jede box mit der id der box zu setzen. dann ändert sich aber die verschachtelungs tiefe auch nicht wirklich schön, nur wenn das sein soll das sehe ich da nicht wirklich einen anderen weg



Autor stefan
Datum 09.12.2006 17:14
Beiträge: if(methode == 'GET') { requestpath = requestpath + "?" + getpostdata; }

was machst du bei codierten urls ?


Autor Freespacer
Datum 09.12.2006 18:33
Beiträge: stefan schrieb am 09.12.2006 um 11:37:23 Uhr folgendes:

wo man das an setzt ist eine gute frage da ja wenn du z.b. sideboxen senden wilst diese mit einer id versehen werden müssen damit du mit

document.getElementById("sideboxid1").innerHTML = val;

entsprechedn die die daten auch setzen kannst also den inhalt, im theme das einzubauen wäre da dann recht einfach, da das aber aus opn kommen soll ist das im theme nicht zu machen.

bliebe nur ein div um jede box mit der id der box zu setzen. dann ändert sich aber die verschachtelungs tiefe auch nicht wirklich schön, nur wenn das sein soll das sehe ich da nicht wirklich einen anderen weg


Die Sidebox selbst, will ich keine ID legen. Denn es kann ja auch sein, dass in der Sidebox nur ein bestimmter Inhalt ausgetauscht werden sollte und nicht gleich alles. Das heißt, diese SPAN-Tag (es können auch mehrere sein) kann beliebig in der Sidebox festgelegt werden.

DIV-Tags würde ich hier nicht verwenden, diese Container werden auch noch als Platzhalter verwendet, das heißt CSS-mäßig müsste man auch noch formatieren. Bei den SPAN-Tags sind es eben unsichtbare Container bzw. Container die auf die Formatierung der Webseite nicht auswirkt.

Probiere mal folgendes ohne CSS aus:

<div>Inhalt 1</div><div>Inhalt 2</div><div>Inhalt 3</div>
<br />
<span>Inhalt 1</span><span>Inhalt 2</span><span>Inhalt 3</span>


Du siehst, dass bei DIV-Container ohne CSS umgebrochen wird. Daher bevorzuge ich lieber SPAN-Container und läßt sich auch innerhalb eines Textes einbetten ohne die Struktur des Textes zu zerstören.

Auszug aus de.selfhtml.org im Bezug auf DIV-Tags:

Dieses allgemeine Element bewirkt nichts weiter als dass es in einer neuen Zeile des Fließtextes beginnt. Ansonsten hat es keine Eigenschaften.


Auszug aus de.selfhtml.org im Bezug auf SPAN-Tags:

Analog zum div-Element, das andere Block-Elemente enthalten kann, gibt es ein Element, das Text und andere Inline-Elemente enthalten kann, selbst aber keinerlei Eigenschaften hat und nichts bewirkt.


Mein Kopf raucht schon und sucht fieberhaft nach einer Lösung für unser Problem. Aber ich habe bereits an einer Lösung für Centerbox/Sidebox gedacht:
- das Ajax-Script greift auf das Hauptscript INDEX.PHP zu. Dort wird per POST neben den anderen Variablen noch die Variable ajax=true und z.B. module=/modules/calendar übertragen. Somit weiß OPN eigentlich schon, was gefordert wird. Denn Rest muss eine Ajax-Funktion in den Modulen den gewünschten Inhalt zurück geben. Somit wird nur der teilweise oder auch komplette Inhalt zurückgegeben.

Einen anderen Weg kenne ich noch nicht. Aber wenigstens ist es ein Ansatz und wir müssen OPN nicht komplett umbauen, sondern nur ergänzen.

stefan schrieb am 09.12.2006 um 17:14:20 Uhr folgendes:

if(methode == 'GET') { requestpath = requestpath + "?" + getpostdata; }

was machst du bei codierten urls ?


Die Inhalte der Variabeln werden vorher von PHP urlencode() geparst und entsprechend in den HTML-Code eingebaut.

Bei Formularen wird eben JavaScript mit diesem Befehl encodeURL() helfen müssen.

Ich habe schon bereits weitere Funktionen in die Ajax.js eingebaut. Er kann jetzt auch mit HTTP-Codes umgehen. Das Ansprechen einer Statusbox wie "Daten werden geladen" bzw. "Daten nicht gefunden!" oder auch "Fehler in der Übertragung" wird angezeigt. Ähnlich wie jetzt die Wartebox, jedoch wird diese Box in Zukunft auch umgebaut.

Gruß

Sebastian


Autor stefan
Datum 09.12.2006 19:04
Beiträge: du ich hab da auch schon was, ich habe entsprechende routien hinzugefügt bis auf die url codierung würde das gehen

und mit codierten urls rede ich nicht von HTML von der von durch opn codierten


Autor stefan
Datum 09.12.2006 19:10
Beiträge: unter develop-demos hab ich mal ne demo dazu gebaut


Autor stefan
Datum 10.12.2006 09:55
Beiträge: ich denke das beste wäre jetzt das mal praktisch in ein modul einzubauen allerdings stellt sich da auch die frage in welches also bei welcher function so wie was ist wenn man kein js an hat? das sollte man berücksichtigen. sinvoll wäre sowas ja z.b. in den admin einstellungen wie sidebox


Autor bdragon
Datum 10.12.2006 14:48
Beiträge: Wie wäre es mit der Suche?



Autor bdragon
Datum 13.12.2006 15:07
Beiträge: Zu dem Thema auch ganz aktuell:

Google Web Toolkit

http://code.google.com/webtoolkit/

gruß


B.D.R.A.G.O.N.: Biomechanical Digital Replicant Assembled for Galactic Observation and Nullification Offiziell infiziert! OPN Infiziert


Autor Freespacer
Datum 31.12.2006 00:30
Beiträge: Hallo!

Wollte mich nochmal wegen Ajax melden.

@Stefan:
Das Ajax-Construct-Driver, dass von dir geschrieben wurde, lässt sich das nicht als eigenständige Klasse "class.ajax.php" z.B. in $opnConfig['Ajax'] implementieren?

Und dann jeweils in den Modulen wie folgt:
$opnConfig['Ajax']->Enable_Ajax = true;
// URI zur Ajax-Klasse hinzufügen...
$opnConfig['Ajax']->add_URI = array('content1' => '/module/search/index.php');
// Request zur Ajax-Klasse hinzufügen...
$opnConfig['Ajax']->add_request = array('content1' => 'year=2007');
// Wenn der Request von einem Ajax-Script kommt, dann nachfolgend ausführen...
if($opnConfig['Ajax']->is_Ajax) {
// Inhalt vom Modul zurückgeben.
}


und in der Klasse class.opn_output.php würde ich folgenden Schalter einfügen, was eigentlich auch schon geschehen ist:
if($opnConfig['Ajax']->is_Enabled) {
echo $opnConfig['Ajax']->get_JS();
}


Eine nachträgliche Anpassung des driver_construct_ajax.php, um verschiedene URI der Klasse zu übergeben scheitert leider, weil die Werte nicht öffentlich (z.B. in $opnConfig) zugänglich ist. Daher wäre es mir lieb, wenn die Klasse in $opnConfig geladen wird. Nur weiß ich die Script-Reihenfolge in OPN nicht genau, was zu erst geladen wird und welches zum Schluß.

Und nicht über Umwege wie z.B. im Search-Modul:

$opnConfig['opnOutput']->SetDisplayVar ('function_ajax', array ('get_ajax') );


Gruß

Sebastian


Autor Freespacer
Datum 05.01.2007 22:25
Beiträge: So, habe den Ajax-Construct-Driver komplett herausgerissen und eine neue Klasse darauf aufgebaut. In der master.php wurde diese Klasse öffentlich in $opnConfig zugänglich gemacht. Die class.opn_output.php wurde diesbezüglich auch umgebaut.

Werde es aber erst nächste Woche im SVN veröffentlichen. Da muss ich noch eine Menge herumfeilen.

Was zum Beispiel funktioniert ist:
- Unter $opnConfig['opnajax'] wurde eine neue Klasse eingefügt class.ajax.php
- Es wird von der Klasse auf Ajax-Elemente zugegriffen.
- Verschiedene Module können auf die Ajax-Elemente zugreifen, ohne das sich die URIs überschneiden.

Noch geplant:
- Das "Search"-Modul wird komplett mit der AJAX-Klasse zusammen funktionieren.
- Die Klasse, die für das Formular zuständig ist, wird für AJAX vorbereitet.
- Fallback-Lösung, falls Ajax bzw. Javascript nicht aktiv ist.

Das driver_construct_ajax.php wird nicht mehr benötigt.

Man kann also gespannt sein.

Gruß

Sebastian


Autor Freespacer
Datum 07.01.2007 21:09
Beiträge: Mit Experimental Rev. 111 wurde die Ajax-Technik besser ausgefeilt.

Die Klasse class.ajax.php wurde in $opnConfig['opnajax'] integriert, um die Unterstützung von Ajax im ganzen OPN-System zu gewährleisten.

Das Modul "Search" bzw. "Suchen" unterstützt nun auch Ajax.

Was noch fehlt ist eine Überprüfung, ob der Browser Ajax unterstützt. Idee ist, das OPN einmalig einen Ajax-Test-JavaScript lädt und einen Cookie im Browser ablegt, ob JS und Ajax funktionieren. Eine Abfrage, ob Ajax aktiviert ist, wurde bereits im "Search"-Modul integriert. Zum Deaktivieren von Ajax einfach in der Datei index.php folgendes am Anfang einfügen: $opnConfig['opnajax']->DisableAjax(); . Schon läuft es auf dem gewohntem Wege.

Es können x-beliebige Funktionen für verschiedene Formulare und Module eingefügt werden. Die kommen sich nicht in die Quere.

Jetzt muss noch die Klasse class.opn_pagebar.php auch mit Ajax funktionieren, da muss das Zusammenspiel noch funktionieren. Eine Idee habe ich dazu auch schon.

Gruß

Sebastian


Autor stefan
Datum 08.01.2007 14:48
Beiträge: Mal 2 Anmerkungen

1) Stand Rev. 111 hast du die classe in der master.php geholt.

Das ist nicht ganz so gut. Wenn jemand kein ajax hat / nutz wird dieses trotzdem geladen und braucht Speicher usw...

Du Weisst das OPN auch von der shell z.b. geht und da brauch ich kein ajax

2) Wie ist das mit den Form Daten wie willst du die über geben?

Also ich habe ein Formular mit jedemenge vari. diese müsten automatisch mit ajax auch zurückgegeben werden. Da fehlt ne Routine die die daten holt und mit ins senden setzt.


Erst nachlesen, dann nachdenken, dann nachfragen... http://www.catb.org/~esr/faqs/smart-questions.html openPHPnuke Developer


Autor Freespacer
Datum 08.01.2007 20:34
Beiträge: stefan schrieb am 08.01.2007 um 14:48:27 Uhr folgendes:

Mal 2 Anmerkungen


Nur her mit den Anmerkungen

stefan schrieb am 08.01.2007 um 14:48:27 Uhr folgendes:

1) Stand Rev. 111 hast du die classe in der master.php geholt.

Das ist nicht ganz so gut. Wenn jemand kein ajax hat / nutz wird dieses trotzdem geladen und braucht Speicher usw...


Da müsste man noch einen Schalter einbauen, der abfragt, ob Ajax zugelassen werden soll. (Fallback-Lösung ist schon integriert -> Siehe api/main.php in Search).

Habe ich aus Zeitgründen noch nicht implementiert.

stefan schrieb am 08.01.2007 um 14:48:27 Uhr folgendes:

Du Weisst das OPN auch von der shell z.b. geht und da brauch ich kein ajax


mit der Shell?
Du meinst die Programme links oder lynx?

stefan schrieb am 08.01.2007 um 14:48:27 Uhr folgendes:

2) Wie ist das mit den Form Daten wie willst du die über geben?

Also ich habe ein Formular mit jedemenge vari. diese müsten automatisch mit ajax auch zurückgegeben werden. Da fehlt ne Routine die die daten holt und mit ins senden setzt.


Das funktioniert hier mit JS. Da AJAX ja auch auf JS aufbaut.

Alle verfügbaren Daten im Formular werden in $opnConfig['opnajax']->add_formdata_js oder so ähnlich als JS-Code zur Abfrage der Daten als Request gebaut.

Gruß

Sebastian


Autor stefan
Datum 08.01.2007 21:21
Beiträge: 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


Autor Freespacer
Datum 13.01.2007 05:57
Beiträge: 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


Autor stefan
Datum 13.01.2007 07:55
Beiträge: 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


Autor Freespacer
Datum 13.01.2007 09:26
Beiträge: 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


Autor stefan
Datum 13.01.2007 11:17
Beiträge: 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



Autor Freespacer
Datum 13.01.2007 13:04
Beiträge: 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


Autor stefan
Datum 13.01.2007 14:19
Beiträge: 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


Autor hombergs
Datum 13.01.2007 18:25
Beiträge: 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.


Autor Freespacer
Datum 14.01.2007 09:39
Beiträge: 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


Autor Freespacer
Datum 14.01.2007 18:37
Beiträge: 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




Diese Seite drucken
Diese Seite schließen

Dieser Artikel kommt von: OpenPHPNuke - das Open Source CMS

http://www.openphpnuke.info/