Typo3 Core Extension Scheduler

Der Typo3 Core Extension Scheduler ist eine Core-Extension, mit der man wiederkehrende Tasks automatisiert ausführen kann. Diese beinhaltet nützliche voreingestellte Tasks wie z.B. das Löschen des Caches oder das automatische Aktualisieren der Extension Liste.

Typo3 Core Extension Scheduler - Hier zeige ich Euch, wie man den korrekt einrichtet
Typo3 Core Extension Scheduler – Hier zeige ich Euch, wie man den korrekt einrichtet!

Typo3 Core Extension Scheduler so schauts aus:

Zunächst muss der Extensionmanager angewählt und die Scheduler Extension aktiviert werden. Ist dies geschehen, kann man noch einige Einstellungen vornehmen.

Maximum lifetime gibt an, wie lange das Script in der Ausführungsliste gehalten wird. Ist diese Zeit abgelaufen wird es von der Liste entfernt, jedoch nicht angehalten. Enable logging speichert jeden Start und jedes Ende eines Tasks. Um die bereits angesprochenen voreingestellten Tasks nutzen zu können muss der Haken bei Enable sample tasks gesetzt sein, ansonsten werden die Tasks nicht gelistet und man kann sie demnach auch nicht verwenden.

Der Scheduler wird in der Liste ADMIN TOOLS geführt. Über diesen Punkt können Tasks angelegt, verwaltet und gelöscht werden. Die aktuell eingerichteten Tasks können über das Dropdown links oben unter dem Punkt Scheduled Tasks angezeigt werden. Hier erhält man allgemeine Informationen über den Status eines Tasks etc.

Unter Setup check im Dropdown können die Einstellungen des Schedulers überprüft werden. Es werden aktuell 3 Punkte aufgeführt. Der Letzte Durchlauf, Typo3 BE User und CLI Script. Damit der Scheduler seine Arbeit verrichten kann, muss der Benutzer _cli_scheduler angelegt sein. Durch diesen werden später alle Tasks ausgeführt. Des Weiteren erhalten wir Informationen über das CLI Script, welches für die Ausführung des Scripts cli_dispatch.phpsh zuständig ist. Dieses muss vom Webserver ausführbar sein. Hier sollten die Dateirechte auf 755 eingestellt sein.

Unter dem Punkt Information (Dropdown) werden alle verfügbaren Tasks, die es in TYPO3 gibt, gelistet. Über das bekannt Icon auf der rechten Seite kann direkt ein Taks hinzugefügt werden.
Das Hinzufügen eines Tasks ist relativ intuitiv. Der Task kann über eine Checkbox deaktiviert werden, in den darunterliegenden Dropdowns kann, die Klasse, die den Task enthält, und der Typ des Tasks, einmalig oder wiederkehrend, ausgewählt werden. Das Textfeld Frequency gibt an, wie oft der Task ausgeführt werden soll. Die Häufigkeit wird in Sekunden oder mit einem Schlüsselwort z.B. @daily angegeben. Als Letztes kann angegeben werden, ob der Task mehrere Male gleichzeitig ausgeführt werden soll.

Typo3 Core Extension Scheduler – Einbau in Extensions:

Um eine Extension am Scheduler zu registrieren, muss die Datei ext_autoload.php im Root des Extensionsverzeichnisses mit folgendem Code hinzugefügt werden.

ext_autoload.php:

1
2
3
4
5
$extensionPath = t3lib_extMgm::extPath('the_user_download');
return array(
    'tx_userdownload_email' =>  $extensionPath . 'classes/class.tx_userdownload_email.php',
    'tx_userdownload_email_additionalfieldprovider' =>  $extensionPath . 'classes/class.tx_userdownload_email_additionalfieldprovider.php'
);

Zusätzlich müssen Tasks in der ext_localconf.php angegeben werden. Dies geschieht durch folgenden Code. tx_userdownload_Email bezeichnet den Task. Dieser setzt sich aus dem Extensionkey und davon mit Unterstrich getrennt dem Task zusammen. Title und description sind selbsterklärend und unter additionalFields werden zusätzliche Felder angegeben, die auf der Seite zum anlegen und editieren des Tasks zusätzlich angezeigt werden.

ext_localconf.php:

1
2
3
4
5
6
$TYPO3_CONF_VARS['SC_OPTIONS']['scheduler']['tasks']['tx_userdownload_Email'] = array(
    'extension' => $_EXTKEY,
    'title' => 'send downloaded file list',
    'description' => 'Sends an email with downloaded file information of registered users',
    'additionalFields' => 'tx_userdownload_email_additionalfieldprovider' // Zusätzliche Felder
);

Der eigentliche Task befindet sich im Ordner classes, sollte dieser nicht existieren, kann dieser einfach erstellt werden. Hier werden sowohl die Tasks, als auch die additionalfield Klassen abgelegt. Ein Task wird immer von der Klasse tx_scheduler_Task abgeleitet. Da diese Klasse eine abstrakte Methode execute beinhaltet, muss auch unsere Klasse diese erhalten. In dieser Methode befindet sich all das, was der Task ausführen soll. Sei es Emails versenden, Tabellen leeren oder sonst eine Aufgabe, sie wird hier ausgeführt. Der Rückgabewert ist im Erfolgsfall true ansonsten false. Wird in einem Task ein additionalfield angegeben, so muss dieses hier als Variable initialisiert werden.


class.tx_userdownload_email.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class tx_userdownload_Email extends tx_scheduler_Task
{
    public $email;
    /**
     * This is the main method that is called when a task is executed
     * It MUST be implemented by all classes inheriting from this one
     * Note that there is no error handling, errors and failures are expected
     * to be handled and logged by the client implementations.
     * Should return TRUE on successful execution, FALSE on error.
     *
     * @return boolean Returns TRUE on successful execution, FALSE on error
     */
    public function execute()
    {
        /* @var t3lib_DB $db */
        $db = $GLOBALS['TYPO3_DB'];
        if (!empty($this->email))
        {
            /* @var t3lib_mail_Message $mail */
            $mail =  t3lib_div::makeInstance("t3lib_mail_Message");
            $mail->setSender(
                array($this->email => "USER")
            );
            $mail->setTo(
                array($this->email => "USER")
            );
            $mail->setSubject("Wöchentlicher Downloadbericht");
            $mailBody = "";
            $mailBody .= "

„; $mailBody .= ‚ ‚; $mailBody .= „“; $mailBody .= „“; $mailBody .= “ Datei“; $mailBody .= “ Anzahl“; $mailBody .= “ zuletzt“; $mailBody .= „“; $row = $db->exec_SELECTgetRows( „`username`, `filename`, `count`, `downloaded_on`“, „`tx_userdownload_tracked_downloads`“, „DATE_SUB(CURDATE(),INTERVAL 7 DAY) <= `downloaded_on`“, „“, „username“ ); foreach($row as $field) { $downloadedOn = new DateTime($field[„downloaded_on“]); $mailBody .= “ „; $mailBody .= „“; $mailBody .= „“ . $field[„filename“] . „“; $mailBody .= „“ . $field[„count“] . „“; $mailBody .= „“ . $downloadedOn->format(„d.m.Y H:i“) . „“; $mailBody .= “ „; } $mailBody .= „

Benutzer
“ . $field[„username“] . „
1
"; $mailBody .= "
1
2
3
4
5
6
7
8
9
10
11
12
";
            $mail-&gt;setBody($mailBody);
            $mail-&gt;setContentType("text/html");
            $mail-&gt;send();
        }
        if ($mail-&gt;isSent())
        {
            return true;
        }
        return false;
    }
}

Die Klasse für ein additionalfield implementiert das Interface tx_scheduler_AdditionalFieldProvider. Daher müssen die Methoden getAdditionalFields(), validateAdditionalFields() und saveAdditionalFields() implementiert werden. Innerhalb der Methode getAdditionalFields werden die zuätzlichen Felder samt HTML erstellt. validateAdditionalFields ist, wie der Name schon vermuten lässt, zur Validierung der Felder zuständig und saveAdditionalFields um die Daten des zusätzlichen Feldes zu speichern.

classes/class.tx_userdownload_email_additionalfieldprovider.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class tx_userdownload_Email_AdditionalFieldProvider implements tx_scheduler_AdditionalFieldProvider
{
    /**
     * Gets additional fields to render in the form to add/edit a task
     *
     * @param array $taskInfo Values of the fields from the add/edit task form
     * @param tx_scheduler_Task $task The task object being eddited. Null when adding a task!
     * @param tx_scheduler_Module $schedulerModule Reference to the scheduler backend module
     * @return array A two dimensional array, array('Identifier' =&gt; array('fieldId' =&gt; array('code' =&gt; '', 'label' =&gt; '', 'cshKey' =&gt; '', 'cshLabel' =&gt; ''))
     */
    public function getAdditionalFields(array &amp;$taskInfo, $task, tx_scheduler_Module $schedulerModule)
    {
        if (empty($taskInfo["email"]))
        {
            // If action is "add" task set email address to BE email address
            if ($schedulerModule-&gt;CMD == "add")
            {
                $taskInfo["email"] = $GLOBALS["BE_USER"]-&gt;user["email"];
            }
            // If action is "edit" task give it the given value
            elseif ($schedulerModule-&gt;CMD == "edit")
            {
                $taskInfo["email"] = $task-&gt;email;
            }
            // Otherwise give it an empty value
            else
            {
                $taskInfo['email'] = "";
            }
        }
        $fieldName = "task_email";
        $fieldHTML = '<input id="' . $fieldName . '" name="tx_scheduler[userdownload_email]" type="text" value="' . htmlspecialchars($taskInfo[" />';
        $additionalFields = array();
        $additionalFields[$fieldName] = array(
            "code"      =&gt; $fieldHTML,
            "label"     =&gt; "Email",
            "cshKey"    =&gt; '_MOD_tools_txschedulerM1',
            "cshLabel"  =&gt; $fieldName
        );
        return $additionalFields;
    }
    /**
     * Validates the additional fields' values
     *
     * @param array $submittedData An array containing the data submitted by the add/edit task form
     * @param tx_scheduler_Module $schedulerModule Reference to the scheduler backend module
     * @return boolean TRUE if validation was ok (or selected class is not relevant), FALSE otherwise
     */
    public function validateAdditionalFields(array &amp;$submittedData, tx_scheduler_Module $schedulerModule)
    {
        $email = trim($submittedData["userdownload_email"]);
        if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL))
        {
            $schedulerModule-&gt;addMessage("Bitte geben Sie eine gültige Emailadresse an.",t3lib_FlashMessage::ERROR);
            return false;
        }
        return true;
    }
    /**
     * Takes care of saving the additional fields' values in the task's object
     *
     * @param array $submittedData An array containing the data submitted by the add/edit task form
     * @param tx_scheduler_Task $task Reference to the scheduler backend module
     * @return void
     */
    public function saveAdditionalFields(array $submittedData, tx_scheduler_Task $task)
    {
        $task-&gt;email = $submittedData["userdownload_email"];
    }
}

Als letzten Schritt um den Typo3 Core Extension Scheduler zum laufen zu bringen, muss nun nur noch ein cronjob angelegt werden:

1
*/1 * * * * /usr/local/bin/php /Users/USERNAME/Webserver/currentProjects/PROJECT/typo3/cli_dispatch.phpsh scheduler

/usr/local/bin/php gibt den Pfad zum PHP-Interpreter und /Users/USERNAME/Webserver/currentProjects/PROJECT/typo3/cli_dispatch.phpsh die auszuführende Datei. Mit diesen Konfigurationen sollte der PHP Typo3 Core Extension Scheduler automatisch jede Minute prüfen, ob ein Task im BE ausgeführt werden muss.

Um den Typo3 Core Extension Scheduler einfacher zu verstehen gibt es auf
Beachte wichtigen Link >> Amazon günstig ein Typo3-Profihandbuch für Entwickler und Administratoren.


Vince

Autor: Vince

Technik begeisterter Fachinformatik- und IT-Nerd, der sich nicht vor technischen Herausforderungen versteckt. Vince hat 2002 seine Fachinformatikerausbildung mit Binnendifferenzierung Systemintegration erfolgreich abgeschlossen und im Anschluss den IHK-Ausbilderschein nach AEVO per Fernstudium absolviert. Er arbeitet mittlerweile als IT-Systemberater in einem weltweit operierenden Technologiekonzern.

Schreibe einen Kommentar

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