Typolink + realurl in Scheduler-Tasks
Anforderung war, dass aus einem Scheduler-Task heraus korrekte sprechende URLs erzeugt werden. Der einfachste Weg hierfür ist eine der typolink-Methode des cObjects. Leider steht ein solches aber in Tasks von Haus aus nicht zur Verfügung. Anleitung, wie man sich ein solches erzeugen kann, finden sich im Internet viele – leider aber auch zahlreiche, die nicht (mehr) funktionieren oder riesen woodoo treiben. Nach einigen Recherchen und Tests kann ich nun einen Weg zur Problemlösung festhalten.
Zunächst wird das TSFE benötigt, auf dem dann später das cObject aufbauen kann.
function initTSFE($id = 1, $typeNum = 0) {
if (!is_object($GLOBALS['TT'])) {
$GLOBALS['TT'] = new t3lib_timeTrack;
$GLOBALS['TT']->start();
}
$GLOBALS['TSFE'] = t3lib_div::makeInstance('tslib_fe', $GLOBALS['TYPO3_CONF_VARS'], $id, $typeNum);
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->determineId();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->getConfigArray();
}
Im Task kann nun schon ein cObject und ein typolink erzeugt werden:
$this->initTSFE($pageUid);
/** @var tslib_cObj $cObj */
$cObj = t3lib_div::makeInstance('tslib_cObj');
$cObj->typolink_URL(array('parameter' => $linkPid));
Beim Testen fällt allerdings auf, dass die Links nicht mit realurl „geschönt“ sind. Hierfür braucht es noch eine kleine Erweiterung der initTSFE()-Methode:
function initTSFE($id = 1, $typeNum = 0) {
if (!is_object($GLOBALS['TT'])) {
$GLOBALS['TT'] = new t3lib_timeTrack;
$GLOBALS['TT']->start();
}
$GLOBALS['TSFE'] = t3lib_div::makeInstance('tslib_fe', $GLOBALS['TYPO3_CONF_VARS'], $id, $typeNum);
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->determineId();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->getConfigArray();
if (t3lib_extMgm::isLoaded('realurl')) {
$rootline = t3lib_BEfunc::BEgetRootLine($id);
$host = t3lib_BEfunc::firstDomainRecord($rootline);
$_SERVER['HTTP_HOST'] = $host;
}
}
Getestete Umgebung:
- TYPO3 4.5.x
- realurl 1.12.x
Update 2014-11-10
TYPO3 CMS 6.2 / Namespaces-Variante
Durch eine Frage im Forum auf typo3.net wurde ich nochmals auf diesen Beitrag aufmerksam gemacht. In der heute aktuellen Version 6.2 schien es nicht mehr so ganz mit dem Schnipsel klappen zu wollen (Mit 6.0 begann die Namespace-Einführung und Reorganisation des Cores).
Nach Anpassung an Namespaces funktioniert der Schnipsel aber immernoch:
function initTSFE($id = 1, $typeNum = 0) {
\TYPO3\CMS\Frontend\Utility\EidUtility::initTCA();
if (!is_object($GLOBALS['TT'])) {
$GLOBALS['TT'] = new \TYPO3\CMS\Core\TimeTracker\NullTimeTracker;
$GLOBALS['TT']->start();
}
$GLOBALS['TSFE'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Controller\\TypoScriptFrontendController', $GLOBALS['TYPO3_CONF_VARS'], $id, $typeNum);
$GLOBALS['TSFE']->connectToDB();
$GLOBALS['TSFE']->initFEuser();
$GLOBALS['TSFE']->determineId();
$GLOBALS['TSFE']->initTemplate();
$GLOBALS['TSFE']->getConfigArray();
if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('realurl')) {
$rootline = \TYPO3\CMS\Backend\Utility\BackendUtility::BEgetRootLine($id);
$host = \TYPO3\CMS\Backend\Utility\BackendUtility::firstDomainRecord($rootline);
$_SERVER['HTTP_HOST'] = $host;
}
}
Und der Aufruf ansich:
$this->initTSFE($pageUid);
/** @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $cObj */
$cObj = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer');
$cObj->typolink_URL(array('parameter' => $linkPid));
Getestete Umgebung:
- TYPO3 6.2.6
- realurl 1.12.8
Will man $this->cObj->fileResource() verwenden, schlägt das immer noch fehl, außer man macht den Aufruf von der Kommandozeile aus und steht im richtigen Verzeichnis.
Letzteres ist beim Scheduler aber nicht der Fall!
Lösung:
Am besten gleich als erste Zeile folgendes ergänzen
chdir(PATH_site);
Viele Grüße
Harald
Vielen Dank,
nach 2 Tagen des Scheiterns endlich ein Hoffnungsschimmer 🙂
Vielen herzlichen Dank! Diese Information hat mir sehr weitergeholfen.
Hallo,
so wie es aussieht gab es in einer der 2.x Versionen von realurl eine Abfrage die den TYPO3_MODE überprüft und wenn dieser „BE“ ist wird die URL nicht umgeschrieben. In der neusten Version (2.0.14) ist diese Abfrage wieder raus.
Hier die passende Issue: https://github.com/dmitryd/typo3-realurl/issues/90
Viele Grüße
Vielen Dank für die Info.
Hi,
ich habe gerade versucht die Namespaces-Variantein TYPO3 7.6.x einzusetzen … hat leider nicht geklappt. Ich bekomme keine realurl Pfade zurück …
Gibt es vielleicht ein Update?
vg
Hab gerade kein Test-Szenario mit 7.x zu Hand…
Hast Du in Deiner Extension eine Abhängigkeit bzw. Empfehlung für EXT:realurl angegeben? Könnte evtl. sein, dass die Ladereihenfolge sonst nicht stimmt.
Hey Julian,
vielen Dank, das hat uns gerade sehr geholfen!
Grüße aus Karlsruhe,
Mimi
Klasse! Danke dir!
Klasse!
„`config.absRefPrefix = /„` in der Typoscript-Konfiguration der Seite hat das Problem gelöst!
Hi,
vielen Dank, das klappt schonmal ganz gut. Ich habe nur ein kleines Problem noch entdeckt. Bei mir werden die URL’s in etwa so erstellt:
http://www.example.com/var/www/news/mein-artikel
richtig wäre natürlich:
http://www.example.com/news/mein-artikel
Weißt Du vieleicht ne Lösung?
Hm, vielleicht ein
config.absRefPrefix=/
setzen? Ansonsten fällt mir keine Ursache ein.Hast Du den absoluten Pfad sonst irgendwo gesetzt/verbaut?