typo3: scheduler task mit zusätzlichen Felder (additionalFields)

Wie ein Scheduler Task mit extbase geht, weiß ich inzwischen, aber ich habe die letzten Stunden damit zugebracht, wie man bei so einem extbase CommandController dann zusätzliche Felder hinzufügen kann. Ob es geht? Ich weiß es nicht. Gefunden habe ich jedenfalls nichts. Aber es geht anders, indem man nämlich keinen Extbase CommandController macht (kann aber nach wie vor so benannt werden und Teil der Extbase Struktur sein). Das meiste habe ich mir von dieser guten Anleitung zusammengereimt.

Ich hatte bereits einen CommandController (extensionname/Classes/Command/SomethingCommandController.php), dieser muss nur ein wenig umgeschrieben werden:

  • die auszuführende Funktion muss nun execute() heißen und nicht irgendwasCommand()
  • ich hatte eine __construct Funktion, was anscheinend problematisch ist. google rät, parent::__construct() dort aufzurufen, aber das hat bei mir auch nicht geholfen. Ich habe die __construct einfach komplett gestrichen und den Code von dort in execute() reinkopiert

Aber beginnen wir von vorne, zunächst wird der Controller in der ext_localconf.php gesetzt, und zwar etwas anders als bei den sonstigen Extbase Tasks. Nehmen wir mal an mein Package heißt ophi und meine Extension ophi_something

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks']['Ophi\OphiSomething\Command\SomethingCommandController'] = array(
	'extension' => $_EXTKEY,
	'title' => 'Something Task',
	'description' => 'Do something really important with additional fields',
	'additionalFields' => 'Ophi\OphiSomething\Command\SomethingCommandControllerAdditionalFieldProvider'
);

Hier sieht man dann auch schon, wie auf die AdditionalFields verwiesen wird: es gibt hierfür eine eigene Klasse, die die zusätzlichen Felder definiert, validiert und speichert. Das alles passiert in der SomethingCommandControllerAdditionalFieldProvider Klasse. Ob die wirklich gleich wie der CommandController heißen muss weiß ich nicht, aber ich wollt’s nicht riskieren. Die Klasse sieht jedenfalls so aus:

namespace Ophi\OphiSomething\Command;

class SomethingCommandControllerAdditionalFieldProvider implements \TYPO3\CMS\Scheduler\AdditionalFieldProviderInterface {

    protected $important_something_var;

    public function getAdditionalFields(array &$taskInfo, $task, \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject) {
        // Initialize selected fields
        if (!isset($taskInfo['important_something_var'])) {
            $taskInfo['important_something_var'] = 'default value';
            if ($parentObject->CMD === 'edit') {
                $taskInfo['important_something_var'] = $task->important_something_var;
            }
        }
        $fieldName = 'tx_scheduler[important_something_var]';
        $fieldId = 'important_something_var';
        $fieldValue = $taskInfo['important_something_var'];
        $fieldHtml = '<input id="' . $fieldId . '" name="' . $fieldName . '" type="text" value="' . htmlspecialchars($fieldValue) . '" />';
        $additionalFields[$fieldId] = array(
            'code' =&gt; $fieldHtml,
            'label' =&gt; 'A very important value',
            'cshKey' =&gt; '_MOD_tools_txschedulerM1',
            'cshLabel' =&gt; $fieldId
        );
        return $additionalFields;
    }

    public function validateAdditionalFields(array &amp;$submittedData, \TYPO3\CMS\Scheduler\Controller\SchedulerModuleController $parentObject) {
        $string = $submittedData['important_something_var'];
		if(trim($string) == ''){
			$parentObject-&gt;addMessage($GLOBALS['LANG']-&gt;sL('Value must not be empty'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR);
			return FALSE;		
		}
        return true;
    }

    public function saveAdditionalFields(array $submittedData, \TYPO3\CMS\Scheduler\Task\AbstractTask $task) {
        $task-&gt;important_something_var = $submittedData['important_something_var'];
    }
}

In validateAdditionalFields kann man beliebige Validierungen einfügen, in meinem Fall darf der Wert einfach nicht leer sein. Was cshKey ist, weiß ich nach wie vor nicht, ich habe keine Ahnung, ob das so heißen muss oder nicht. Last but not least dann noch der SomethingCommandController:

namespace Ophi\OphiSomething\Command;

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

    public function execute(){
	//the additional field value
	$theImportantValue = $this->important_something_var; 
		
	//... 
		
        return true;
    }
}

Und das wars. Wichtig: beim erstellen des neuen Tasks nicht mehr einen ExtbaseController auswählen, sondern das, was man in der ext_localconf als title angegeben hat wird irgendwo in der Liste separat auftauchen!

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.