/** * Constructor * * @api * @param string $cronCommand The cron command can hold any combination documented as valid * @param bool|int $timestamp Optional start time, used in unit tests * @return \TYPO3\CMS\Scheduler\CronCommand\CronCommand */ public function __construct($cronCommand, $timestamp = FALSE) { $cronCommand = \TYPO3\CMS\Scheduler\CronCommand\NormalizeCommand::normalize($cronCommand); // Explode cron command to sections $this->cronCommandSections = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(' ', $cronCommand); // Initialize the values with the starting time // This takes care that the calculated time is always in the future if ($timestamp === FALSE) { $timestamp = strtotime('+1 minute'); } else { $timestamp += 60; } $this->timestamp = $this->roundTimestamp($timestamp); }
/** * @test * @dataProvider normalizeValidDataProvider * @param string $expression Cron command to test * @param string $expected Expected result (normalized cron command syntax) */ public function normalizeConvertsCronCommand($expression, $expected) { $result = \TYPO3\CMS\Scheduler\CronCommand\NormalizeCommand::normalize($expression); $this->assertEquals($expected, $result); }
/** * Checks the submitted data and performs some pre-processing on it * * @return boolean TRUE if everything was ok, FALSE otherwise */ protected function preprocessData() { $result = TRUE; // Validate id $this->submittedData['uid'] = empty($this->submittedData['uid']) ? 0 : intval($this->submittedData['uid']); // Validate selected task class if (!class_exists($this->submittedData['class'])) { $this->addMessage($GLOBALS['LANG']->getLL('msg.noTaskClassFound'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); } // Check start date if (empty($this->submittedData['start'])) { $this->addMessage($GLOBALS['LANG']->getLL('msg.noStartDate'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); $result = FALSE; } else { try { $timestamp = $this->checkDate($this->submittedData['start']); $this->submittedData['start'] = $timestamp; } catch (\Exception $e) { $this->addMessage($GLOBALS['LANG']->getLL('msg.invalidStartDate'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); $result = FALSE; } } // Check end date, if recurring task if ($this->submittedData['type'] == 2 && !empty($this->submittedData['end'])) { try { $timestamp = $this->checkDate($this->submittedData['end']); $this->submittedData['end'] = $timestamp; if ($this->submittedData['end'] < $this->submittedData['start']) { $this->addMessage($GLOBALS['LANG']->getLL('msg.endDateSmallerThanStartDate'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); $result = FALSE; } } catch (\Exception $e) { $this->addMessage($GLOBALS['LANG']->getLL('msg.invalidEndDate'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); $result = FALSE; } } // Set default values for interval and cron command $this->submittedData['interval'] = 0; $this->submittedData['croncmd'] = ''; // Check type and validity of frequency, if recurring if ($this->submittedData['type'] == 2) { $frequency = trim($this->submittedData['frequency']); if (empty($frequency)) { // Empty frequency, not valid $this->addMessage($GLOBALS['LANG']->getLL('msg.noFrequency'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); $result = FALSE; } else { $cronErrorCode = 0; $cronErrorMessage = ''; // Try interpreting the cron command try { \TYPO3\CMS\Scheduler\CronCommand\NormalizeCommand::normalize($frequency); $this->submittedData['croncmd'] = $frequency; } catch (\Exception $e) { // Store the exception's result $cronErrorMessage = $e->getMessage(); $cronErrorCode = $e->getCode(); // Check if the frequency is a valid number // If yes, assume it is a frequency in seconds, and unset cron error code if (is_numeric($frequency)) { $this->submittedData['interval'] = intval($frequency); unset($cronErrorCode); } } // If there's a cron error code, issue validation error message if (!empty($cronErrorCode)) { $this->addMessage(sprintf($GLOBALS['LANG']->getLL('msg.frequencyError'), $cronErrorMessage, $cronErrorCode), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR); $result = FALSE; } } } // Validate additional input fields if (!empty($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][$this->submittedData['class']]['additionalFields'])) { $providerObject = \TYPO3\CMS\Core\Utility\GeneralUtility::getUserObj($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][$this->submittedData['class']]['additionalFields']); if ($providerObject instanceof \TYPO3\CMS\Scheduler\AdditionalFieldProviderInterface) { // The validate method will return TRUE if all went well, but that must not // override previous FALSE values => AND the returned value with the existing one $result &= $providerObject->validateAdditionalFields($this->submittedData, $this); } } return $result; }
public static function normalizeWeekday($weekday) { return parent::normalizeWeekday($weekday); }
/** * @test * @dataProvider normalizeValidDataProvider * @param string $expression Cron command to test * @param string $expected Expected result (normalized cron command syntax) */ public function normalizeConvertsCronCommand($expression, $expected) { $result = NormalizeCommand::normalize($expression); $this->assertEquals($expected, $result); }