oConfig)) { $this->oConfig = MetaModel::GetConfig(); } return $this->oConfig; } /** * Interpret current setting for the week days * * @returns int[] (monday = 1) * @throws ProcessInvalidConfigException */ public function InterpretWeekDays() { static $aWEEKDAYTON = array( 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6, 'sunday' => 7, ); $aDays = array(); $sWeekDays = $this->getOConfig()->GetModuleSetting( $this->GetModuleName(), static::MODULE_SETTING_WEEKDAYS, static::DEFAULT_MODULE_SETTING_WEEKDAYS ); if ($sWeekDays !== '') { $aWeekDaysRaw = explode(',', $sWeekDays); foreach ($aWeekDaysRaw as $sWeekDay) { $sWeekDay = strtolower(trim($sWeekDay)); if (array_key_exists($sWeekDay, $aWEEKDAYTON)) { $aDays[] = $aWEEKDAYTON[$sWeekDay]; } else { throw new ProcessInvalidConfigException($this->GetModuleName().": wrong format for setting '".static::MODULE_SETTING_WEEKDAYS."' (found '$sWeekDay')"); } } } if (count($aDays) === 0) { throw new ProcessInvalidConfigException($this->GetModuleName().': missing setting \''.static::MODULE_SETTING_WEEKDAYS.'\''); } $aDays = array_unique($aDays); sort($aDays); return $aDays; } /** * @param string $sCurrentTime Date string to extract time dependency * this parameter is not present in the interface but as it is optional it's ok * * @return DateTime the exact time at which the process must be run next time * @throws \ProcessInvalidConfigException */ public function GetNextOccurrence($sCurrentTime = 'now') { $bEnabled = $this->getOConfig()->GetModuleSetting( $this->GetModuleName(), static::MODULE_SETTING_ENABLED, static::DEFAULT_MODULE_SETTING_ENABLED ); if (!$bEnabled) { return new DateTime('3000-01-01'); } // 1st - Interpret the list of days as ordered numbers (monday = 1) // $aDays = $this->InterpretWeekDays(); // 2nd - Find the next active week day // $sProcessTime = $this->getOConfig()->GetModuleSetting( $this->GetModuleName(), static::MODULE_SETTING_TIME, static::GetDefaultModuleSettingTime() ); if (!preg_match('/[0-2]\d:[0-5]\d/', $sProcessTime)) { throw new ProcessInvalidConfigException($this->GetModuleName().": wrong format for setting '".static::MODULE_SETTING_TIME."' (found '$sProcessTime')"); } $oNow = new DateTime($sCurrentTime); $iNextPos = false; $sDay = $oNow->format('N'); for ($iDay = (int) $sDay; $iDay <= 7; $iDay++) { $iNextPos = array_search($iDay, $aDays, true); if ($iNextPos !== false) { if (($iDay > $oNow->format('N')) || ($oNow->format('H:i') < $sProcessTime)) { break; } $iNextPos = false; // necessary on sundays } } // 3rd - Compute the result // if ($iNextPos === false) { // Jump to the first day within the next week $iFirstDayOfWeek = $aDays[0]; $iDayMove = $oNow->format('N') - $iFirstDayOfWeek; $oRet = clone $oNow; $oRet->modify('-'.$iDayMove.' days'); $oRet->modify('+1 weeks'); } else { $iNextDayOfWeek = $aDays[$iNextPos]; $iMove = $iNextDayOfWeek - $oNow->format('N'); $oRet = clone $oNow; $oRet->modify('+'.$iMove.' days'); } list($sHours, $sMinutes) = explode(':', $sProcessTime); $oRet->setTime((int)$sHours, (int)$sMinutes); return $oRet; } /** * @see \iProcess * * @param int $iUnixTimeLimit * * @return string */ abstract public function Process($iUnixTimeLimit); }