Ich versuche im Rahmen einer Ajax-Umsetzung (absichtlich nicht mit XAJAX) ein externes Skript aufzurufen.
Das Skript liegt z.B. in typo3conf/ext/tx_merkliste/pi/ajaxScript.php. Aufgerufen wird es dann über Prototype welches über die typo3-Extension eingebunden wird. Der Aufruf des PHP-Skripts und die Ausgabe funktionieren problemlos... Auf DHTML-Ebene ist also alles ok...
Mein Problem:
Das Skript, welches ja praktisch "nackt" durch den Ajax Request aufgerufen wird, braucht nun einiges an Typo3-Framework-Elementen:
DB-Layer,
das FE-User-Objekt, nicht das BE-User-Objekt
Wrapper für ImageMagick,
HTMLMailer...
Ich habe nun über die Struktur, wie sie für CLI-Skripte verwendet wird ( einbinden der conf.php, aufrufen typo3/init.php, usw.) zumindest die $GLOBALS, um z.B. auf die DB zugreifen zu können.
Was mir fehlt ist nun aber natürlich das TSFE, von dem ich unbedingt das feUser Objekt brauche, um in dessen Session zu schreiben...
Wie ist der Rahmen für ein "eigenständiges" Skript zu gestalten, welches auf Typo3 Klassen und das FE-User-Objekt zugreifen kann?
Wie kann performant ein Minimum an Typo3 Framework instanziiert werden, ohne z.B. eine eigene page. zu erzeugen und mit Extensions zu arbeiten??
Danke für die Hilfe!!
Gegenfrage: was spricht gegen eine kleine Extension ?
Die ist mit dem Kickstarter in zwei Minuten zusammengeklickt.
Dann nimmst du dein Script und kopierst es in die Main-Funktion deiner neuen Extension, ein paar eventuelle Anpassungen, fertig ist die Laube.
Da siehst du dann auch, wann, wie, welche Klassen eingebunden werden.
Beim nächsten Mal kannst du dann gerne deine Zeit darauf verschwenden, das alles von Hand zu schreiben.
Wer´s braucht 😉
Vielen Dank zunächst für die Antwort!
Gegen eine Extension spricht leider, dass der Live-Server nur durchschnittlich performant ist. Zusätzlich ist der "Rest" der Seite schon recht umfangreich . Ein Seitenaufruf dauert ca. 1 Sekunde - für eine seriöse Ajax-Anwenung ist das viel zu langsam - deswegen versuche ich auf möglichst viel "Ballast" zu verzichten. Die xajax-Extension liefert leider kaum reproduzierbar Fehlermeldungen - zudem scheint die Weiterentwicklung dort eher eingeschlafen zu sein...
Wahrscheinlich habe ich mich was meine Zielsetzung betrifft zu undeutlich ausgedrückt: Für die Einbindung von Protoype und das HTML-Ziel-Element (das div "wlCount") benutze ich bereits eine Extension:
require_once(PATH_tslib.'class.tslib_pibase.php');
require_once(t3lib_extMgm::extPath("scriptaculous")."class.tx_scriptaculous.php");
class tx_txwatchlist2_pi1 extends tslib_pibase {
var $prefixId = 'tx_txwatchlistpi1';
var $scriptRelPath = 'pi1/class.tx_txwatchlist_pi1.php';
var $extKey = 'tx_watchlist';
function main($content,$conf) {
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
$this->pi_USER_INT_obj=1;
tx_scriptaculous::includeLib();
$JS .= " function addItem( itemId ){
var url = '/typo3conf/ext/tx_watchlist/pi1/ajaxTest.php';
var pars = 'ajaxWLAction=addItem&itemId='+itemId;
var target = "wlCount";
var myAjax = new Ajax.Updater(target, url, {method: 'get', parameters: pars});}";
$content='Artikel <div id="wlCount"></div><br><br>
<a href="#" onclick="addItem( '0815' );">Hinzufügen</a>';
$GLOBALS['TSFE']->setJS($this->extKey,$JS);
return $this->pi_wrapInBaseClass($content);
}
...
Der Ajax-Updater-Call ruft nun die ajaxTest.php auf. Diese soll dann als String nur z.B. "
Anzahl: 2 <br />; Artikel:<br /> 0815<br />, 2016
" an das JavaScript-Objekt zurückgeben, welches den String ohne Reload der Seite in das div einträgt.
Angenommen ich würde den Weg mit einer weiteren Extension gehen - wie sieht dann der Aufruf in der JS-Funktion aus? Wäre es dann der "komplette" Pfad auf eine Typo Seite: "http://www.seite.de/index.php?id=34" ??
Auf der Seite 34 dürfte dann nichts ausgegeben werden ausser eben der String. Muss ich dafür dann ein komplett neues Page-Objekt dafür anlegen, welches z.B. nur einen Marker hat, der z.B. durch meine neue Extension/userFunc befüllt werden würde?
Hat noch nie jemand eine "native" Prototype-Ajax Einbindung gemacht?
Hallo
ich stehe vor einer ähnlichen Problematik. Ich möchte auch ein Skript aufrufen welches eine XML Datei erzeugt das dann via XML HTTP Request ausgelesen wird.
Bist du denn mit deiner Extension schon weiter gekommen?
Hi,
Kaspar hat dazu mal eine Podcast veröffentlicht. Ging extra um den "leichtgewichtigen" Aufruf... vielleicht hilft euch das weiter:
http://castor.t3o.punkt.de/files/podkast12_v4_techinsight_ajax.m4v
ciao
Andreas
Vielen Dank für den Tipp!!
Das scheint exakt das zu sein, wonach ich gesucht habe:
Die Extension "whiteboard" zeigt exemplarisch, wie mit den ab Typo3 4.0 verfügbaren tslib_eidtools gearbeitet werden kann. In der Extenion wird per JS/Ajax ein Skript aufgerufen:
xhr.open("GET", "index.php?eID=tx_whiteboard_pi1&tt_content_uid='.$tt_content_record_to_edit.'&cmd=get&post="+switchToPost, true);
welches nun zum Aufruf des in der ext_localconf.php angegebenen Skripts führt:
$TYPO3_CONF_VARS['FE']['eID_include']['tx_whiteboard_pi1'] = 'EXT:whiteboard/pi1/fe_index.php';
Die fe_index.php wird dann ohne das gesamte Typo-Framework und ohne FE-Rendering ausgeführt. In dem Skript kann man sich dann über die eidtools beliebige Typo-Objekte holen:
$feUserObj = tslib_eidtools::initFeUser();
// Connect to database:
tslib_eidtools::connectDB();
$TYPO3_DB->exec_SELECTgetRows('bodytext','tt_content','uid='.intval(t3lib_div::_GET('tt_content_uid')));