Dieser Artikel beschreibt, wie man den in TYPO3 CMS vorinstallierten Scheduler (“Planer”) dazu nutzen kann, eine Aufgabe innerhalb der eigenen Extension regelmäßig ausführen zu lassen. Der zweite Teil des Artikels beschäftigt sich dann damit, wie man innerhalb seiner “Task” Klasse eine Fluid View rendern lassen kann, um dies beispielsweise via E-Mail zu versenden.

Der Scheduler

Um seine eigene Extbase (Version 6.2) Extension bzw. seinen Task in den Scheduler zu bekommen, wird folgender Codeschnipsel in der ext_localconf.php Datei benötigt.

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks']['Vendor\\ExtensionKey\\Task\\EmailReminderTask'] = array(
    'extension'        => $_EXTKEY,
    'title'            => 'Mein E-Mail Reminder',
    'description'      => 'Lorem Ipsum...',
);

Nun erstellen wir eine Datei names EmailReminderTask im Verzeichnis Classes\Task\(EmailReminderTask.php).

namespace Vendor\ExtensionKey\Task;

class EmailReminderTask extends \TYPO3\CMS\Scheduler\Task\AbstractTask {

    /**
     * Executed by the TYPO3 Scheduler
     *
     * @return bool
     */
    public function execute() {
        // This will be executed by the TYPO3 Scheduler!
        // Do something awesome...!
    }
}

Das war schon alles, um sich beim Scheduler zu registrieren und die execute Methode der Task Klasse ausführen zu lassen.

Task & Repository/View/etc

Man wird nun relativ schnell feststellen, dass einem die execute Methode der Task Klasse nicht besonders weit bringt – zumindest nicht ohne ein Repository, einem Service oder gar einem gerenderten Fluid View.

Der erste Gedanke, sich diese benötigten Dependencies per Annotation oder via Setter-Injection injizieren zu lassen, ist gut wird sich aber als nicht funktionierend herausstellen.

Was aber sehr wohl funktioniert, ist sich den ObjectManager von Extbase erstellen zu lassen und die benötigten Dependencies anschließend selbst aufzulösen.
Dazu erweitern wir unsere execute Methode der Task Klasse:

// ....
public function execute() {
   $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\TYPO3\CMS\Extbase\Object\ObjectManager');
   
   // Mit dem ObjectManager lässt sich nun zum Beispiel eine Repository Instanz 
   $fooRepository = $this->objectManager->get('\Vendor\ExtensionKey\Domain\Repository\FooRepository');
}

Fluid View rendern

Schön und gut. Mit Hilfe des ObjectManagers lassen sich zwar jetzt sämtliche Dependencies auflösen, um aber zum Beispiel per Scheduler gesteuerte E-Mail Reminder zu versenden fehlen noch ein paar Funktionalitäten (vorausgesetzt man möchte den E-Mail Content aus einem Fluid View rendern lassen).

Um also an eine mit Daten substituierte View (bzw. dessen HTML) zu kommen, bedienen wir uns dem StandaloneView von Fluid:
Hinweis: ExtensionKey muss von euch natürlich mit eurem Extensionnamen angepasst werden…

public function getRenderedEmailTemplate(Model $model) {
   // Generate and set the basic Fluid View File and Pathes
   $templateRootPath = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName('EXT:ExtensionKey/Resources/Private/Templates/');
   $tenplateLayoutRootPath = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName('EXT:ExtensionKey/Resources/Private/Layouts/');
   $templatePathAndFilename = $templateRootPath . 'ModelName/TemplateName.html';

   // Create an Instance of a Fluid StandaloneView Object
   $view = $this->objectManager->get('\TYPO3\CMS\Fluid\View\StandaloneView');
   /** @var StandaloneView $view */

   $view->setLayoutRootPath($tenplateLayoutRootPath);
   $view->setTemplatePathAndFilename($templatePathAndFilename);

   // Substitute the Fluid View with Data and render the E-Mail Content
   $emailSubject = "Lorem Ipsum";
   $view->assign('modelObj', $model);
   $view->assign("subject", $emailSubject);
   $emailTemplate = $view->render();

   return $emailTemplate;
}
Categories: TYPO3 Extbase/Fluid