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