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

Das könnte dich auch interessieren …

12 Antworten

  1. Harald sagt:

    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

  2. Konstantin sagt:

    Vielen Dank,
    nach 2 Tagen des Scheiterns endlich ein Hoffnungsschimmer 🙂

  3. Steffen sagt:

    Vielen herzlichen Dank! Diese Information hat mir sehr weitergeholfen.

  4. TheMassassian sagt:

    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

  5. Michael sagt:

    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

    • Julian sagt:

      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.

  6. Mimi sagt:

    Hey Julian,

    vielen Dank, das hat uns gerade sehr geholfen!

    Grüße aus Karlsruhe,

    Mimi

  7. Philipp sagt:

    Klasse! Danke dir!

  8. Markus sagt:

    Klasse!

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

  9. Markus sagt:

    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?

    • Julian sagt:

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert