findComponents('PeriodFactory', self::class); foreach ($customPeriodFactories as $customPeriodFactoryClass) { $customPeriodFactory = StaticContainer::get($customPeriodFactoryClass); if ($customPeriodFactory->shouldHandle($period, $date)) { return $customPeriodFactory->make($period, $date, $timezone); } } throw new \Exception("Don't know how to create a '$period' period! (date = $date)"); } public static function checkPeriodIsEnabled($period) { if (!self::isPeriodEnabledForAPI($period)) { self::throwExceptionInvalidPeriod($period); } } /** * @param $strPeriod * @throws \Exception */ private static function throwExceptionInvalidPeriod($strPeriod) { $periods = self::getPeriodsEnabledForAPI(); $periods = implode(", ", $periods); $message = Piwik::translate('General_ExceptionInvalidPeriod', array($strPeriod, $periods)); throw new Exception($message); } private static function convertRangeToDateIfNeeded($period, $date) { if (is_string($period) && is_string($date) && $period === 'range') { $dates = explode(',', $date); if (count($dates) === 2 && $dates[0] === $dates[1]) { $period = 'day'; $date = $dates[0]; } } return array($period, $date); } /** * Creates a Period instance using a period, date and timezone. * * @param string $timezone The timezone of the date. Only used if `$date` is `'now'`, `'today'`, * `'yesterday'` or `'yesterdaySameTime'`. * @param string $period The period string: `"day"`, `"week"`, `"month"`, `"year"`, `"range"`. * @param string $date The date or date range string. Can be a special value including * `'now'`, `'today'`, `'yesterday'`, `'yesterdaySameTime'`. * @return \Piwik\Period */ public static function makePeriodFromQueryParams($timezone, $period, $date) { if (empty($timezone)) { $timezone = 'UTC'; } [$period, $date] = self::convertRangeToDateIfNeeded($period, $date); if ($period == 'range') { self::checkPeriodIsEnabled('range'); $oPeriod = new Range('range', $date, $timezone, Date::factory('today', $timezone)); } else { if (!($date instanceof Date)) { if (preg_match('/^(now|today|yesterday|yesterdaySameTime|last[ -]?(?:week|month|year))$/i', $date)) { $date = Date::factoryInTimezone($date, $timezone); } $date = Date::factory($date); } $oPeriod = Factory::build($period, $date); } return $oPeriod; } /** * @param $period * @return bool */ public static function isPeriodEnabledForAPI($period) { $periodValidator = new PeriodValidator(); return $periodValidator->isPeriodAllowedForAPI($period); } /** * @return array */ public static function getPeriodsEnabledForAPI() { $periodValidator = new PeriodValidator(); return $periodValidator->getPeriodsAllowedForAPI(); } }