Source of file ListFilterDateRange.php
Size: 4,273 Bytes - Last Modified: 2021-12-23T10:20:51+00:00
/var/www/docs.ssmods.com/process/src/code/model/ListFilterDateRange.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | <?php class ListFilterDateRange extends ListFilterBase { private static $db = array( 'StartDateField' => 'Varchar(60)', 'EndDateField' => 'Varchar(60)', 'DefaultDaysToDisplay' => 'Int' ); private static $defaults = array( 'Title' => 'Filter by Date', 'StartDateField' => 'Created', 'EndDateField' => 'Created', ); /** * {@inheritdoc} */ public function getCMSFields() { $self = &$this; $self->beforeUpdateCMSFields(function($fields) use ($self) { $class = $self->getListClass(); $dbFields = array( '' => '(Please select a field)', 'ID' => 'ID', 'Created' => 'Created', 'LastEdited' => 'LastEdited', ); if ($class && class_exists($class)) { $classDbFields = array_keys($class::config()->db); $classDbFields = ArrayLib::valuekey($classDbFields); $dbFields = array_merge($dbFields, $classDbFields); } $fields->addFieldToTab('Root.Main', DropdownField::create('StartDateField', 'Start Date Field', $dbFields)); $fields->addFieldToTab('Root.Main', DropdownField::create('EndDateField', 'End Date Field', $dbFields)); $fields->addFieldToTab('Root.Main', NumericField::create('DefaultDaysToDisplay') ); }); $fields = parent::getCMSFields(); return $fields; } /** * {@inheritdoc} */ public function getFilterFields() { $fields = parent::getFilterFields(); $fields->push(DateField::create('StartDate', _t('ListFilterDateRange.START_DATE', 'Start Date'))); $fields->push(DateField::create('EndDate', _t('ListFilterDateRange.END_DATE', 'End Date'), $this->getEndDateDefault())); return $fields; } /** * {@inheritdoc} */ public function getFilterData(DataObject $record) { $startDateField = $this->StartDateField; $endDateField = $this->EndDateField; $startDate = $record->$startDateField; $startDate = explode(' ', $startDate); $startDate = $startDate[0]; $endDate = $record->$endDateField; $endDate = explode(' ', $endDate); $endDate = $endDate[0]; return array( 'value' => array( 'StartDate' => array($startDate), 'EndDate' => array($endDate), ) ); } /** * {@inheritdoc} */ public function applyFilter(SS_List $list, array $data) { $start = isset($data['StartDate']) ? $data['StartDate'] : null; $end = isset($data['EndDate']) ? $data['EndDate'] : $this->getEndDateDefault(); if (!$start && !$end) { return; } $list = $this->applyDateRange($list, $start, $end); return $list; } /** * Apply filters to the list based on the date range. * * @return SS_List */ public function applyDateRange(SS_List $list, $start, $end) { // get both date fields, or a single field $startDateField = $this->StartDateField; $endDateField = $this->EndDateField ?: $startDateField; // Use DateField to convert from the date format to 'yyyy-mm-dd' for // database use. $dateField = DBField::create_field('DateField', $start); $start = $dateField->dataValue(); $dateField->setValue($end); $end = $dateField->dataValue(); // Default blank date to anything in the future if (!$start) { $start = SS_Datetime::now()->Format('Y-m-d'); } // Apply filter // todo(Jake): Use ->filter() where possible as that will work with ArrayList if($start && $end) { $list = $list->where(" ($startDateField <= '$start' AND $endDateField >= '$end') OR ($startDateField BETWEEN '$start' AND '$end') OR ($endDateField BETWEEN '$start' AND '$end') "); } else if ($start) { $list = $list->where("($startDateField >= '$start' OR $endDateField > '$start')"); } else if ($end) { $list = $list->where("($endDateField <= '$end' OR $startDateField < '$end')"); } return $list; } /** * {@inheritdoc} */ public function getJavascriptCallback() { return 'ListFilterDateRange'; } /** * {@inheritdoc} */ public function getContext() { if ($this->isInDB()) { $result = array(); if ($value = $this->StartDateField) { $result[] = 'Start Date Field: '.$value; } if ($value = $this->EndDateField) { $result[] = 'End Date Field: '.$value; } return implode(',', $result); } } public function getEndDateDefault() { return $this->DefaultDaysToDisplay ? date('Y-m-d', strtotime("+{$this->DefaultDaysToDisplay} days")) : null; } } |