Advertisement
shapoval

Timerange Filter Form

May 27th, 2017
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.08 KB | None | 0 0
  1. <?php
  2.  
  3. namespace ErstiesAdmin\Forms;
  4.  
  5. class TimerangeFilterForm extends \CMS\FilterForm {
  6.     public function __construct() {
  7.         parent::__construct('get');
  8.        
  9.         $end = new \DateTime();
  10.         $start = clone($end);
  11.         $start->modify('-1 week');
  12.  
  13.         $_GET['start'] = @$_GET['start'] ?: $start->format("d.m.Y");
  14.         $_GET['end'] = @$_GET['end'] ?: $end->format("d.m.Y");
  15.  
  16.         $this
  17.             ->fieldset()
  18.             ->select('range', _t('Range'), [
  19.                 _t('Last Week')     => 'last_week',
  20.                 _t('Last Month')    => 'last_month',
  21.                 _t('Last Year')     => 'last_year',
  22.                 _t('Select Week')   => 'week',
  23.                 _t('Select Month')  => 'month',
  24.                 _t('Select Year')   => 'year',
  25.                 _t('Free Select')   => 'free'
  26.             ], '', false, [
  27.                 'id' => 'events_chart_range_type',
  28.             ])
  29.             ->select('week', _t('Select week'), $this->getWeekOptions(15), '', false, [
  30.                 'class' => 'chart_select chart_select-week',
  31.             ])
  32.             ->select('month', _t('Select month'), $this->getMonthOptions(12), '', false, [
  33.                 'class' => 'chart_select chart_select-month',
  34.             ])
  35.             ->select('year', _t('Select year'), $this->getYearOptions(5), '', false, [
  36.                 'class' => 'chart_select chart_select-year',
  37.             ])
  38.             ->text_date('start', _t('Start'), '', $start, [
  39.                 'class' => 'chart_select chart_select-free',
  40.             ])
  41.             ->text_date('end', _t('End'), '', $end, [
  42.                 'class' => 'chart_select chart_select-free',
  43.             ])
  44.             ->select('step', _t('Step'), [
  45.                 _t('Day')    => 'day',
  46.                 _t('Week')   => 'week',
  47.                 _t('Month')  => 'month',
  48.                 _t('Year')   => 'year',
  49.             ], '');
  50.     }
  51.  
  52.     public function validate() {
  53.         if (parent::validate()) {
  54.             $range = $this->values['range'];
  55.  
  56.             switch ($range) {
  57.                 case 'last_week':
  58.                     $end = new \DateTime();
  59.                     $start = clone($end);
  60.                     $start->modify('-1 week');
  61.                     break;
  62.  
  63.                 case 'last_month':
  64.                     $end = new \DateTime();
  65.                     $start = clone($end);
  66.                     $start->modify('-1 month');
  67.                     break;
  68.  
  69.                 case 'last_year':
  70.                     $end = new \DateTime();
  71.                     $start = clone($end);
  72.                     $start->modify('-1 year');
  73.                     break;
  74.  
  75.                 case 'week':
  76.                 case 'month':
  77.                 case 'year':
  78.                         $arr = explode('-', $this->values[$range]);
  79.                         $start = new \DateTime($arr[0]);
  80.                         $end = new \DateTime($arr[1]);
  81.                 break;
  82.  
  83.                 case 'free':
  84.                 default:
  85.                     $start = $this->values['start'] ?: $this->start;
  86.                     $end = $this->values['end'] ?: $this->end;
  87.                     break;
  88.             }
  89.  
  90.             $start = \Ersties\DateTimeHelper::roundDownTimeToStep($start, $this->values['step']);
  91.             $end = \Ersties\DateTimeHelper::roundUpTimeToStep($end, $this->values['step']);
  92.  
  93.             $this->values['start'] = $start;
  94.             $this->values['end'] = $end;
  95.  
  96.             return true;
  97.         }
  98.        
  99.         return false;
  100.     }
  101.  
  102.     public function getChartBlankData($emptyItemData = 0) {
  103.  
  104.         $daterange = $this->getDatePeriod();
  105.        
  106.         $emptyChartData = [];
  107.         foreach($daterange as $datetime) {
  108.             $datetime->setTime(0, 0, 0);
  109.             $emptyChartData[($datetime->getTimestamp() + $datetime->getOffset()) * 1000] = $emptyItemData;
  110.         }
  111.         ksort($emptyChartData);
  112.  
  113.         return $emptyChartData;
  114.     }
  115.  
  116.     private function getWeekOptions($count) {
  117.         $latestWeeks = [];
  118.         $dateTo = new \DateTime();
  119.         $dateTo->setTime(0, 0, 0);
  120.         $dateTo = \Ersties\DateTimeHelper::getWeekFirstDay($dateTo);
  121.         $dateFrom = clone($dateTo);
  122.         $dateFrom->modify("-$count weeks");
  123.         $dateTo->setTime(23, 59, 59);
  124.        
  125.         $daterange = new \DatePeriod($dateFrom, new \DateInterval('P7D'), $dateTo);
  126.         foreach ($daterange as $date) {
  127.             $date2 = clone $date;
  128.             $date2 = \Ersties\DateTimeHelper::getWeekLastDay($date2);
  129.             $date2->setTime(23, 59, 59);
  130.             $latestWeeks[$date->format('d F Y') . ' - ' . $date2->format('d F Y')] = $date->format('d.m.Y') . '-' . $date2->format('d.m.Y');
  131.         }
  132.  
  133.         return array_reverse($latestWeeks, true);
  134.     }
  135.    
  136.     private function getMonthOptions($count) {
  137.         $latestMonths = [];
  138.         $dateTo = new \DateTime();
  139.         $dateTo->setTime(0, 0, 0);
  140.         $dateTo = \Ersties\DateTimeHelper::getMonthFirstDay($dateTo);
  141.         $dateFrom = clone($dateTo);
  142.         $dateFrom->modify("-$count months");
  143.         $dateTo->setTime(23, 59, 59);
  144.        
  145.         $daterange = new \DatePeriod($dateFrom, new \DateInterval('P1M'), $dateTo);
  146.         foreach ($daterange as $date) {
  147.             $date2 = clone $date;
  148.             $date2 = \Ersties\DateTimeHelper::getMonthLastDay($date2);
  149.             $date2->setTime(23, 59, 59);
  150.             $latestMonths[$date->format('F Y')] = $date->format('d.m.Y') . '-' . $date2->format('d.m.Y');
  151.         }
  152.  
  153.         return array_reverse($latestMonths, true);
  154.     }
  155.    
  156.     private function getYearOptions($count) {
  157.         $latestMonths = [];
  158.         $dateTo = new \DateTime();
  159.         $dateTo->setTime(0, 0, 0);
  160.         $dateTo = \Ersties\DateTimeHelper::getYearFirstDay($dateTo);
  161.         $dateFrom = clone($dateTo);
  162.         $dateFrom->modify("-$count years");
  163.         $dateTo->setTime(23, 59, 59);
  164.        
  165.         $daterange = new \DatePeriod($dateFrom, new \DateInterval('P1Y'), $dateTo);
  166.         foreach ($daterange as $date) {
  167.             $date2 = clone $date;
  168.             $date2 = \Ersties\DateTimeHelper::getYearLastDay($date2);
  169.             $date2->setTime(23, 59, 59);
  170.             $latestMonths[$date->format('Y')] = $date->format('d.m.Y') . '-' . $date2->format('d.m.Y');
  171.         }
  172.  
  173.         return array_reverse($latestMonths, true);
  174.     }
  175.    
  176.     public function getDatePeriod() {
  177.         switch($this->values['step']) {
  178.             case 'week':
  179.                 $dateInterval = new \DateInterval('P7D');
  180.                 break;
  181.             case 'month':
  182.                 $dateInterval = new \DateInterval('P1M');
  183.                 break;
  184.             case 'year':
  185.                 $dateInterval = new \DateInterval('P1Y');
  186.                 break;
  187.             case 'day':
  188.                 $dateInterval = new \DateInterval('P1D');
  189.                 break;
  190.             default:
  191.                 $dateInterval = new \DateInterval('P1D');
  192.                 break;
  193.         }
  194.        
  195.         return new \DatePeriod($this->values['start'], $dateInterval, $this->values['end']);
  196.     }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement