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

9 Antworten to “Typolink + realurl in Scheduler-Tasks”

  1. avatar

    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?

  2. avatar

    Hm, vielleicht ein config.absRefPrefix=/ setzen? Ansonsten fällt mir keine Ursache ein.
    Hast Du den absoluten Pfad sonst irgendwo gesetzt/verbaut?

  3. avatar

    Klasse!

    „`config.absRefPrefix = /„` in der Typoscript-Konfiguration der Seite hat das Problem gelöst!

  4. avatar

    Klasse! Danke dir!

  5. avatar

    Hey Julian,

    vielen Dank, das hat uns gerade sehr geholfen!

    Grüße aus Karlsruhe,

    Mimi

  6. avatar

    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

  7. avatar

    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.

  8. avatar

    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

  9. avatar

    Vielen Dank für die Info.

Schreibe einen Kommentar