diff --git a/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php b/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php index 459820b9f9612e2059074a29c0fcdcf75d82f928..b225277a9d00358cc119d33c635e8749a179497c 100644 --- a/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php +++ b/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php @@ -573,6 +573,11 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas { $task = $this->scheduler->fetchTask($this->submittedData['uid']); $task->setDisabled(!$task->isDisabled()); + // If a disabled single task is enabled again, we register it for a + // single execution at next scheduler run. + if ($task->getType() === AbstractTask::TYPE_SINGLE) { + $task->registerSingleExecution(time()); + } $task->save(); } @@ -624,13 +629,12 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas if (!empty($taskInfo['interval']) || !empty($taskInfo['croncmd'])) { // Guess task type from the existing information // If an interval or a cron command is defined, it's a recurring task - // @todo remove magic numbers for the type, use class constants instead - $taskInfo['type'] = 2; + $taskInfo['type'] = AbstractTask::TYPE_RECURRING; $taskInfo['frequency'] = $taskInfo['interval'] ?: $taskInfo['croncmd']; } else { // It's not a recurring task // Make sure interval and cron command are both empty - $taskInfo['type'] = 1; + $taskInfo['type'] = AbstractTask::TYPE_SINGLE; $taskInfo['frequency'] = ''; $taskInfo['end'] = 0; } @@ -643,7 +647,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas $taskInfo['end'] = 0; $taskInfo['frequency'] = ''; $taskInfo['multiple'] = false; - $taskInfo['type'] = 1; + $taskInfo['type'] = AbstractTask::TYPE_SINGLE; } } catch (\OutOfBoundsException $e) { // Add a message and continue throwing the exception @@ -653,7 +657,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas } else { // If adding a new object, set some default values $taskInfo['class'] = key($registeredClasses); - $taskInfo['type'] = 2; + $taskInfo['type'] = AbstractTask::TYPE_RECURRING; $taskInfo['start'] = $GLOBALS['EXEC_TIME']; $taskInfo['end'] = ''; $taskInfo['frequency'] = ''; @@ -752,8 +756,8 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas . BackendUtility::wrapInHelp($this->cshKey, 'task_type', $label) . '<div class="form-control-wrap">' . '<select name="tx_scheduler[type]" id="task_type" class="form-control">' - . '<option value="1" ' . ((int)$taskInfo['type'] === 1 ? ' selected="selected"' : '') . '>' . $this->getLanguageService()->getLL('label.type.single') . '</option>' - . '<option value="2" ' . ((int)$taskInfo['type'] === 2 ? ' selected="selected"' : '') . '>' . $this->getLanguageService()->getLL('label.type.recurring') . '</option>' + . '<option value="1" ' . ((int)$taskInfo['type'] === AbstractTask::TYPE_SINGLE ? ' selected="selected"' : '') . '>' . $this->getLanguageService()->getLL('label.type.single') . '</option>' + . '<option value="2" ' . ((int)$taskInfo['type'] === AbstractTask::TYPE_RECURRING ? ' selected="selected"' : '') . '>' . $this->getLanguageService()->getLL('label.type.recurring') . '</option>' . '</select>' . '</div>' . '</div></div>'; @@ -1100,7 +1104,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas } } // Get execution type - if ($task->getExecution()->getInterval() == 0 && $task->getExecution()->getCronCmd() == '') { + if ($task->getType() === AbstractTask::TYPE_SINGLE) { $execType = $this->getLanguageService()->getLL('label.type.single'); $frequency = '-'; } else { @@ -1251,7 +1255,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas return; } // Register single execution - if ((int)$this->submittedData['type'] === 1) { + if ((int)$this->submittedData['type'] === AbstractTask::TYPE_SINGLE) { $task->registerSingleExecution($this->submittedData['start']); } else { if (!empty($this->submittedData['croncmd'])) { @@ -1293,7 +1297,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas // Create an instance of chosen class /** @var $task AbstractTask */ $task = GeneralUtility::makeInstance($this->submittedData['class']); - if ((int)$this->submittedData['type'] === 1) { + if ((int)$this->submittedData['type'] === AbstractTask::TYPE_SINGLE) { // Set up single execution $task->registerSingleExecution($this->submittedData['start']); } else { @@ -1361,7 +1365,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas } } // Check end date, if recurring task - if ($this->submittedData['type'] == 2 && !empty($this->submittedData['end'])) { + if ((int)$this->submittedData['type'] === AbstractTask::TYPE_RECURRING && !empty($this->submittedData['end'])) { try { $this->submittedData['end'] = (int)$this->submittedData['end']; if ($this->submittedData['end'] < $this->submittedData['start']) { @@ -1377,7 +1381,7 @@ class SchedulerModuleController extends \TYPO3\CMS\Backend\Module\BaseScriptClas $this->submittedData['interval'] = 0; $this->submittedData['croncmd'] = ''; // Check type and validity of frequency, if recurring - if ($this->submittedData['type'] == 2) { + if ((int)$this->submittedData['type'] === AbstractTask::TYPE_RECURRING) { $frequency = trim($this->submittedData['frequency']); if (empty($frequency)) { // Empty frequency, not valid diff --git a/typo3/sysext/scheduler/Classes/Task/AbstractTask.php b/typo3/sysext/scheduler/Classes/Task/AbstractTask.php index 8550a615d64af68d722bb1f14d09b7edd05290ee..fc966c4419a624e34b4d9f0ad2706da4320b1466 100644 --- a/typo3/sysext/scheduler/Classes/Task/AbstractTask.php +++ b/typo3/sysext/scheduler/Classes/Task/AbstractTask.php @@ -21,6 +21,10 @@ namespace TYPO3\CMS\Scheduler\Task; */ abstract class AbstractTask { + + const TYPE_SINGLE = 1; + const TYPE_RECURRING = 2; + /** * Reference to a scheduler object * @@ -515,4 +519,18 @@ abstract class AbstractTask { $this->scheduler->removeTask($this); } + + /** + * Guess task type from the existing information + * If an interval or a cron command is defined, it's a recurring task + * + * @return int + */ + public function getType() + { + if (!empty($this->getExecution()->getInterval()) || !empty($this->getExecution()->getCronCmd())) { + return self::TYPE_RECURRING; + } + return self::TYPE_SINGLE; + } }