| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Plugins\CoreVisualizations\Visualizations; |
|
|
| use Piwik\Date; |
| use Piwik\Period; |
| use Piwik\Period\Factory; |
| use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines\Config; |
|
|
| class EvolutionPeriodSelector |
| { |
| |
| |
| |
| private $config; |
|
|
| public function __construct(Config $config) |
| { |
| $this->config = $config; |
| } |
|
|
| public function getNumDaysDifference(Date $date1, Date $date2): int |
| { |
| $days = abs($date1->getTimestamp() - $date2->getTimestamp()) / 60 / 60 / 24; |
| return (int) round($days); |
| } |
|
|
| public function setDatePeriods($params, Period $originalPeriod, $comparisonPeriods, $isComparing): array |
| { |
| $highestPeriodInCommon = $this->getHighestPeriodInCommon($originalPeriod, $comparisonPeriods); |
|
|
| if ($isComparing) { |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| $params['period'] = $highestPeriodInCommon; |
| $params['date'] = $originalPeriod->getRangeString(); |
|
|
| $params['compareDates'] = []; |
| $params['comparePeriods'] = []; |
|
|
| foreach ($comparisonPeriods as $period) { |
| $params['compareDates'][] = $period->getRangeString(); |
| $params['comparePeriods'][] = $params['period']; |
| } |
| } else { |
| |
| |
| $params = $this->config->getGraphParamsModified($params); |
| if ($originalPeriod->getLabel() === 'range') { |
| |
| |
| $params['period'] = $highestPeriodInCommon; |
| $params['date'] = $originalPeriod->getRangeString(); |
| } |
| } |
|
|
| return $params; |
| } |
|
|
| public function getComparisonPeriodObjects($comparePeriods, $compareDates): array |
| { |
| $periods = []; |
| if (!empty($comparePeriods)) { |
| foreach ($comparePeriods as $periodIndex => $period) { |
| $date = $compareDates[$periodIndex]; |
| $periods[] = Factory::build($period, $date); |
| } |
| } |
| return $periods; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function getHighestPeriodInCommon(Period $originalPeriod, $comparisonPeriods): string |
| { |
| $lowestNumDaysInRange = $this->getNumDaysDifference($originalPeriod->getDateStart(), $originalPeriod->getDateEnd()); |
|
|
| if (!empty($comparisonPeriods)) { |
| foreach ($comparisonPeriods as $period) { |
| $numDaysInRange = $this->getNumDaysDifference($period->getDateStart(), $period->getDateEnd()); |
| if ($numDaysInRange < $lowestNumDaysInRange) { |
| $lowestNumDaysInRange = $numDaysInRange; |
| } |
| } |
| } |
|
|
| $periodToUse = 'day'; |
| if ($lowestNumDaysInRange >= 7 * 365) { |
| $periodToUse = 'year'; |
| } elseif ($lowestNumDaysInRange >= 2 * 365) { |
| $periodToUse = 'month'; |
| } elseif ($lowestNumDaysInRange >= 180) { |
| $periodToUse = 'week'; |
| } |
|
|
| return $periodToUse; |
| } |
| } |
|
|