Zum Inhalt springen

Mit externem php-script auf typo3 zugreifen

Erstellt am 27. April 2007 · 22 Antworten · letzte Antwort am 11. Mai 2007 · Seite 1 von 2

Tags: Frage

mad1200 ·

Hallo,

ich möchte mit einem externen php-script auf typo3 zugreifen.
Das externe Script wir als Cronjob ausgeführt.
z.B. Prüfen, ob eine Extension geladen ist und
Values aus einem Flexfrom dieser
geladenen Extension auslesen.

Wer kann helfen?

Gruß und schönes WE
Matthias

garbast ·

Schau Dir mal das Thema Backend Programming an.

Die daraus resultierenden Dateien kannst Du auch per Cronjob aufrufen. Ein Beispiel dafür ist die Extention 'crawler' die ebenso per Cronjob funktioniert.

mad1200 ·

Habe schon div. Versuche gemacht.

Folgendes habe ich in meinem Script eingefügt, bekomme aber immer eine Fehlermeldung.

if ($_SERVER['PHP_SELF']) {
        if (!defined('PATH_thisScript')) define('PATH_thisScript',str_replace('//','/', str_replace('\\','/', $_SERVER['PHP_SELF'])));
} else {
        if (!defined('PATH_thisScript')) define('PATH_thisScript',str_replace('//','/', str_replace('\\','/', $_ENV['_'])));
}
if (!defined('PATH_site')) define('PATH_site', dirname(dirname(dirname(dirname(dirname(PATH_thisScript))))).'/');
if (!defined('PATH_t3lib')) if (!defined('PATH_t3lib')) define('PATH_t3lib', PATH_site.'t3lib/');
define('PATH_typo3conf', PATH_site.'typo3conf/');

define('TYPO3_mainDir', 'typo3/');
if (!defined('PATH_typo3')) define('PATH_typo3', PATH_site.TYPO3_mainDir);
if (!defined('PATH_tslib')) {
        if (@is_dir(PATH_site.'typo3/sysext/cms/tslib/')) {
                define('PATH_tslib', PATH_site.'typo3/sysext/cms/tslib/');
        } elseif (@is_dir(PATH_site.'tslib/')) {
                define('PATH_tslib', PATH_site.'tslib/');
        }
}


define('TYPO3_OS', stristr(PHP_OS,'win')&&!stristr(PHP_OS,'darwin')?'WIN':'');
define('TYPO3_MODE', 'BE');

//die folgende Zeile wird angemeckert,kommentiere ich sie aus, wird die nächste Zeile angemeckert usw.

require_once(PATH_t3lib.'class.t3lib_div.php');
require_once(PATH_t3lib.'class.t3lib_extmgm.php');
require_once(PATH_t3lib.'config_default.php');
require_once(PATH_typo3conf.'localconf.php');

if (!defined ('TYPO3_db'))  die ('The configuration file was not included.');
if (isset($_POST['GLOBALS']) || isset($_GET['GLOBALS']))      die('You cannot set the GLOBALS-array from outside this script.');
garbast ·

Ich kann Dir nichts anderes sagen, als schau Dir 'crawler' an. Es funktioniert für Kasper also sollte es auch bei Dir funktionieren.

Bisher habe ich so eine Extention noch nie benutzt da ich keinen Crownjob zur Verfügung habe. Kann also nur darauf verweisen.

mad1200 ·

Danke trotzdem.
Spielt aber keine Rolle ob Cronjob oder nicht, das Script kann ja auch manuell gestartet werden.

Ich such dann mal weiter.

mad1200 ·

Hallo nochmal,

ich bekomme das einfach nicht gebacken. #angry#

Wer hat noch einen Vorschlag??

Gruß

Matthias

mad1200 ·

Habe ich auch schon versucht.
Genau so eingebaut wie hier beschrieben:
http://www.typo3-tutorials.org/tutorials/entwicklung/cli-shell-scripte.html

Rufe ich dann das Script auf, erscheint.
Warning: Cannot modify header information ....
in /var/lib/typo3/typo3_src-4.1/t3lib/class.t3lib_userauth.php on line 279
Warning: Cannot modify header information ....
in /var/lib/typo3/typo3_src-4.1/t3lib/class.t3lib_userauth.php on line 312
Warning: Cannot modify header information ....
in /var/lib/typo3/typo3_src-4.1/t3lib/class.t3lib_userauth.php on line 313
Warning: Cannot modify header information ....
in /var/lib/typo3/typo3_src-4.1/t3lib/class.t3lib_userauth.php on line 314
Warning: Cannot modify header information ....
in /var/lib/typo3/typo3_src-4.1/t3lib/class.t3lib_userauth.php on line 315

Ich habe noch nichts weiter hinzugefügt.
Warum kommen diese Fehlermedlungen?

webzigartig ·

Ich weiß nicht, ob das weiterhilft, aber ich habe mich gestern und heute auch mit dem Problem beschäftigt, ein Skript per Cronjob auszuführen, welches in das Typo3-Framework eingebettet ist. Das in diesem Thread genannte Tutorial bezieht sich m.W. auf T3-Versionen < 4.1. Mein Lösung für Typo3 4.1 bislang:

1.) Ich habe das Skript, welches per Cronjob ausgeführt werden soll, in den Ordner einer (beliebigen) bestehenden Extension kopiert.
2.) In der Datei ext_localconf.php dieser Extension habe ich folgende Zeile hinzugefügt:

$TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys']['test'] = array('EXT:extentionname/pi1/test.php','_CLI_lowlevel');

Die Zeile sorgt dafür, dass ein sog. CLI-Key angelegt wird - zusammen mit dem Pfad, unter dem das auszuführende PHP-Skript zu finden ist.
Danach ggf. den T3-Cache leeren.
3.) In die Crontab des Servers muß man nun folgendes eintragen (ich mache das über Plesk):
/srv/www/vhosts/domain.de/httpdocs/typo3/cli_dispatch.phpsh test
Man ruft damit also nicht das Skript direkt auf, sondern eine Typo3-Datei namens "cli_dispatch.phpsh". Dieser übergibt man den zuvor angelegten CLI-Key. Über den Key weiß Typo3, welche Datei der Cronjob eigentlich wirklich ausführen möchte.
4.) Damit das Ganze funktioniert, muss man noch einen Backend-User namens "_cli_lowlevel" im Typo3-Backend anlegen.

Was mir noch unklar ist, ist die genaue Funktionsweise des Skriptes "cli_dispathc.phpsh" und die Bedeutung von _CLI_lowlevel beim Setzen des CLI-Keys.

mad1200 ·

OK, das funtioniert soweit.
Das Script läßt sich aufrufen.
Jetzt möchte ich in diesem Script aber Werte aus dem Flexform
benutzen.
Wie z.B. storagepid, dbName,dbPasswort usw.

Das muß dann doch irgendwie so gehen, wie in der Klasse der Extension.

Das habe ich jetzt eingebaut in dem aufzurufenden Sciipt.
require_once(t3lib_extMgm::extPath('extName').'pi1/class.tx_extname_pi1.php');
$this->flexValues= t3lib_div::makeInstance('tx_extename_pi1');
´
$pid=$this->flexValues->pi_getFFvalue($this->tslib_cObj->data['pi_flexform'], 'storagepid', 'sDEF');

Wie geht'n das?

webzigartig ·

Hm, da muss ich passen. Mit Flexforms habe ich mich noch nie beschäftigt. Ich könnte Dir höchstens sagen, wie Du auf im TS-Setup definierte Variablen (bzw. Constants) in Deinem "externen" Skript zugreifen kannst - denn die Variable $conf steht hier ja leider nicht zur Verfügung...

webzigartig ·

Das ginge dann so:

1.) Im Ordner der Extension die Datei "ext_typoscript_constants.txt" anlegen.
2.) In der Datei die nötigen Konstanten nach folgendem Muster definieren:

#cat=meinekategorie;type=;label=meinekonstante:meinerklärungstext plugin.user_meineextension_pi1.meinekonstante = meinwert

3.) Die Konstante müßte jetzt im Constant-Editor im T3-Backend zu sehen und editierbar sein (evtl. Cache leeren vorher)
4.) Im Ordner der Extension die Datei "ext_typoscript_setup.txt" anlegen.
5.) In der Datei die nötigen Variablen nach folgendem Muster definieren:

plugin.user_meineextension_pi1 {
      meinekonstante = {$plugin.user_meineextension_pi1.meinekonstante}
}

6.) Im externen PHP-Skript kann man auf die Variable nun wie folgt zugreifen:

$conf=$GLOBALS["TSFE"]->tmpl->setup["plugin."]["user_meineextension_pi1"."."];
echo $conf["meinekonstante"];
steffenk ·

das dürfte schwierig werden - Du müsstest ja die richtige Seite mit dem Plugin aufrufen.

Ich nutze eine andere Möglichkeit. Als Grundlage dient das php cronscript aus direct_mail - das lädt das komplette T3-Framework. Jetzt braucht man nur die ID des CEs, um die Flexform auszulesen:

$res=$GLOBALS['TYPO3_DB']->exec_SELECTquery('*','tt_content','uid='.$cid);
$row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); 
$flex=t3lib_div::xml2array($row['pi_flexform']);

Jetzt hat man die Flexform im Array und kann sie auswerten - die manuelle Methode.

mad1200 ·

Hallo Babyschlumpf,

constants- und setup.txt sind schon vorhanden.
Wenn ich jetzt irgendeine Konstante auslesen will, passiert nichts.

Im BE constant-editor steht was drin.

Hallo steffenk

habe ich auch versucht.
Wo kommt "$cid" her?

$res=$GLOBALS['TYPO3_DB']->exec_SELECTquery('*','tt_content','uid='.$cid);

mad1200 ·

Hardcoded alles schön und gut

$res=$GLOBALS['TYPO3_DB']->exec_SELECTquery('*','tt_content','uid='.$cid);

aber welche ziffer von 1 bis ? trage ich da ein?
Wo kommt diese her? Wie kann man die evtl auslesen?