Hi!
Baue gerade an einer Ajax Extension und das Problem dabei ist das zugreifen auf die flexform felder ...
Die Extension befindet sich ganz normal auf einer Seite. Diese hat flexforms, auf die ich auch ganz normal zugreifen kann. Baue ich jetzt aber eine Ajax Antwort für den Client: (auf der gleichen Seite)
responseToBrowser = PAGE
responseToBrowser{
typeNum = 1
config {
disableAllHeaderCode = 1
additionalHeaders = Content-type:text/xml
no_cache = 1
xhtml_cleaning = 0
}
10 < plugin.tx_pmtree_pi1
10.userFunc = tx_pmtree_pi1->ajaxResponse
}
ist das Array nicht mehr erreichbar. Wird somit das Inhaltselement nicht verfügbar gemacht? Muss man hierbei die Daten per Hand auslesen? Gibt es da sonst noch einen trick?
das liegt dann an der Ajax-Methode. Da Du dafür einen eigenen PAGE-Typ definierst, werden die xml-Daten als Inhalt angesehen und nicht mehr als Konfiguration.
Es gibt passendere Ajaxmethoden - entweder die eID-Technik oder xAjax.
Ein lauffähiges Beispiel mit xAjax habe ich in meiner Ext FLV-Player verwendet
(siehe http://www.sk-typo3.de/FLV-Player-mit-xAjax.185.0.html)
hmmm, das verstehe ich aber trotzdem nicht ganz...
Ich möchte ja nur auf die FlexForms der eingefügten Extension zugreifen. Das geht natürlich direkt mit dem sql select ... das möchte ich ja vermeiden...
und mit der Userfunc möchte ich eigentlich nur die Extension aufrufen die eigentlich schon eingefügt wurde (auf der gleichen Seite), nur mit einer anderen Methode.
ist das der falsche ansatz?
ich gucke mir auch eben die anderen extension an ...
p.s.: was ist eigentlich die eID Technik?
naja, bei Content-type:text/xml kannst Du die xml ja nicht mehr einfach auslesen.
Ich versteh noch nicht was Du mit der Flexform überhaupt willst ?
Oder ist das eine TV-spezifische Angelegenheit ? Dann muss ich eh passen ...
eID ist die eingebaute Ajaxmethode - in einem Podcast erklärt Kasper die Wirkungsweise, ich meine das ist der Podcast mit der Whiteboard-Extension.
Ne, es geht nicht um TV.
Die Extension soll einen Baum aus einer anderen DB darstellen, als AJAX variante, da sehr viele Einträge ...
Dabei habe ich einfach flexforms für die Konfiguration der Extension gewählt, also Datenbank, tabelle etc. ... diese sind dann einfach nicht verfügbar wenn ich die Extension über userfunc aufrufe ... ist auch klar, weil damit die extension quasi noch einmal eingefügt wurde.
Die Frage ist jetzt ob ich die eingefügte Extension aufrufen kann? Vielleicht über CONTENT? Das weiss ich halt nicht ...
Oder sollte ich einfach die flexforms über ein SQL select auslesen?
und danke schon mal für die schnellen Antworten ;D
P.S. was ist denn die eID - Technik?
Ah, jetzt versteh ich was Du meinst 🙂
Die Konfiguration geht doch nicht verloren, da das Plugin als Klasse instanziert ist.
Sorge einfach dafür, das die über Flexform übergebenen Parameter in der Klasse global zur Verfügung stehen (z.B. $this->conf[]). Dann kannst Du über Ajax eine Funktion in der Klasse aufrufen und hast alles für die Abfrage.
eID ist eine getvariable, die dafür sorgt, das die Auswertung über Ajax gemacht wird. In Typo3 4.0 hat diese Methode die alte thumb.php-Methode abgelöst. Am besten Du schaustDir den entsprechenen Podcast mal an (typo3.org)
steffenk schrieb
Die Konfiguration geht doch nicht verloren, da das Plugin als Klasse instanziert ist.
Sorge einfach dafür, das die über Flexform übergebenen Parameter in der Klasse global zur Verfügung stehen (z.B. $this->conf[]). Dann kannst Du über Ajax eine Funktion in der Klasse aufrufen und hast alles für die Abfrage.
Hmm wie mache ich das denn ? ;D
Das hier ist meine Initialisation:
In $this->flexConf werden die flexforms gespeichert...
/**
* initializes the flexform and all config options ;-)
*/
function init($conf){
$this->conf=$conf;
$this->pi_loadLL(); // Loading language-labels
$this->pi_setPiVarDefaults(); // Set default piVars from TS
$this->pi_initPIflexForm(); // Init FlexForm configuration for plugin
$this->pi_USER_INT_obj=1; // Configuring so caching is not expected. This value means that no cHash params are ever set. We do this, because it's a USER_INT object!
$this->flexConf = array(); // Setup our storage array...
// Assign the flexform data to a local variable for easier access
$piFlexForm = $this->cObj->data['pi_flexform'];
// Traverse the entire array based on the language...
// and assign each configuration option to $this->lConf array...
foreach ( $piFlexForm['data'] as $sheet => $data )
foreach ( $data as $lang => $value )
foreach ( $value as $key => $val )
$this->flexConf[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
}
ist völlig korrekt. Wahrscheinlich liegts dann an Deinem Ajax-Aufruf, so das nicht auf die Klasse zugegriffen wird.
In meinem FLV-Player mache ich das ja auch - ich konfigurier die Ext über Flexform. In der Ext binde ich xajax ein und in den Funktionen, die über xajax aufgerufen werden, wird der komplette Inhalt der Ext neu generiert, natürlich unter Berücksichtigung der Flexform-Konfiguration.
Schau mal rein: http://typo3.org/extensions/repository/view/sk_simpleflvplayer/0.0.2/info/pi1%252Fclass.tx_sksimpleflvplayer_pi1.php/
Habe bei dir keine großen unterschiede bezüglich flexforms finden können.. ?
steffenk schrieb
ist völlig korrekt. Wahrscheinlich liegts dann an Deinem Ajax-Aufruf, so das nicht auf die Klasse zugegriffen wird.
Ja, also die Klasse wird natürlich aufgerufen nur die Settings sind nicht verfügbar. Habe noch festgestellt das das conf Array dann nur mit den Page Infos gefüttert ist. Somit ist natürlich das flexform nicht erreichbar.
Wenn ich allerdings die Extension so aufrufe:
responseToBrowser = PAGE
responseToBrowser{
typeNum = 1
config {
disableAllHeaderCode = 1
additionalHeaders = Content-type:text/xml
no_cache = 1
xhtml_cleaning = 0
}
10 = CONTENT
10 {
table = tt_content
select {
pidInList = this
}
}
}
}
Sind die Einstellungen verfügbar .... es ist genau das was ich eigentlich brauche, jetzt müsste ich halt nur noch als userFunc nicht die main aufrufen. Kann ich das bei einem CONTENT element noch ändern?
Du kannst doch auch über TS die userfunc definieren
plugin.tx_ext_pi1.userfunc = tx_ext_pi1->secondFunction
Hi Steffenk!
Als erstes danke für deinen Rat.
Habe jetzt aber eine Lösung gefunden die mich auf jedenfall zufriedenstellt:
Auf der gleichen Seite, wo sich die Extension befindet, habe ich wie erwähnt ein +ext Template erstellt und folgenden Code drin:
responseToBrowser = PAGE
responseToBrowser{
typeNum = 1
config {
disableAllHeaderCode = 1
#additionalHeaders = Content-type:text/xml
no_cache = 1
xhtml_cleaning = 0
}
10 = CONTENT
10 {
table = tt_content
select {
pidInList = this
}
renderObj = COA
renderObj {
10 < plugin.tx_pmtree_pi1
10.userFunc = tx_pmtree_pi1->ajaxResponse
}
}
}
Damit wird quasi meine eingefügte Erweiterung aufgerufen und zusätzlich ändere ich die userFunc auf ajaxResponse. Erst mit diesem Aufruf kann ich auf die flexforms zugreifen! Vielleicht finde ich mal die Lösung die flexforms global zur verfügung zu stellen? ...mal sehen...
additionalHeaders nutze ich nicht mehr weil ich einen JSON HEADER response generiere.
anj schrieb
Vielleicht finde ich mal die Lösung die flexforms global zur verfügung zu stellen? ...mal sehen...
Hast du dazu was gefunden?
Danke
habe nicht direkt die Lösung gefunden, aber du solltest dir überlegen die eID von Kasper anzuschauen, damit kannst du den Overload besser kontrollieren. Die obige Lösung ist leider nicht die performanteste, da das komplette FE bei jeder Anfrage initialisiert wird, obwohl man es vielleicht gar nicht benötigt. Ich habe im Moment eine workaround Lösung gefunden um Einstellungen, die vom Benutzer eingegeben wurden, in meiner Ajaxanfrage zu verwenden:
Dazu speichere ich mir die Settings pro Benutzer in den Settings und greife somit bei einer AJAX-Anfrage darauf zu.
Vielleicht hilft dir das ?
Grüße!