Saturday, June 2, 2012

TYPO3 Scheduler Task mit ExtBase 4.7

Seit Extbase 4.7 kann man TYPO3 Scheduler Tasks direkt als Command Controller registrieren. Anbei eine kurze Step-By-Step Anleitung, wie das funktioniert.

Als erstes muss man einen CommandController erstellen.

Classes/Command/HelloWorldCommandController.php
/**
 * Description of HelloWorldCommandController
 */
class Tx_HelloWorld_Command_HelloWorldCommandController extends Tx_Extbase_MVC_Controller_CommandController {
    
    /**
     * Simple Hello World Command
     * 
     * @param string $name 
     * @return void
     */
    public function HelloWorldCommand($name) {
        echo 'Hello ' . $name;
    }
}

Danach wird der CommandController registriert.

ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = 'Tx_HelloWorld_Command_HelloWorldCommandController';

Als nächstes erstellt man über den TYPO3 Scheduler einen neuen Task und wählt als Klasse den "Extbase CommandController Task (extbase)"

Beim CommandController wählt man den HelloWorld CommandController aus und speichert den Task ab. Um die Optionen für den Task einzustellen, muss man den Task wieder öffnen und dann die entsprechenden Optionen ausfüllen.

Update - 02.06.2012 19:24
Leider gibt es noch einen Bug für denn Fall dass man einen Task ohne Parameter anlegt:
http://forge.typo3.org/issues/37563

Ein Workaround steht im Issue beschrieben.

3 comments:

  1. Hallo,
    Danke für die super kurze Übersicht.
    Eine Frage habe ich noch. Wie kann ich nun, z.B. auf einen ActionController zugreifen oder hier das Repository meiner Extension verfügbar machen?
    Der Standard - inject Weg funktioniert leider nicht, oder ich mache etwas falsch...
    Danke für deine Hilfe!

    ReplyDelete
  2. Ok, ich habe es heraus gefunden.
    Ich habe wie auch mit "Task" folgendes in meine Command Function geschrieben um auf die Action zuzugreifen. Sollte es einen einfacheren/besseren Weg geben, freue ich mich über eine Nachricht! :

    public function CommandnameCommand(){
    // Konfiguration
    $configuration = array(
    'extensionName' => 'yourExtName',
    'pluginName' => 'YourPluginName',
    'controller' => 'YourController',
    'action' => 'yourAction', //e.g. "list"
    'switchableControllerActions' => array(
    'YourController' => array(
    '1' => 'yourAction',
    ),
    ),
    'settings' => ' =< plugin.tx_yourextension.settings',
    'persistence' => ' =< plugin.tx_yourextension.persistence'
    );

    // Notwendig, da der Controller sonst nicht korrekt zugewiesen wird
    $_SERVER['REQUEST_METHOD'] = 'GET';
    $_GET['tx_clientmanager_cli']['controller'] = 'YourController';
    $_GET['tx_clientmanager_cli']['action'] = 'YourAction'; // e.g. "list" ohne "Action" am Schluss
    $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions']['extkey']['modules']['YourPluginname']['controllers'] = array(
    'YourController' => array(
    'actions' => array(
    'yourAction'
    )
    )
    );

    // Extbase Bootstrap instanziieren
    $bootstrap = t3lib_div::makeInstance('Tx_Extbase_Core_Bootstrap');
    // Plugin mit der oben definierten Konfiguration ausführen
    $output = $bootstrap->run('', $configuration);

    return true;
    }

    ReplyDelete
  3. @Alexander

    DI sollte eigentlich ohne Probleme funktionieren. In einem Projekt habe ich sowohl DI für ein Repository als auch für eine externe Klasse nutzen können.

    ReplyDelete