From 9e8c4f8d12090800594867897df47131088bd0ff Mon Sep 17 00:00:00 2001 From: baberuth22 Date: Tue, 22 Oct 2013 14:32:37 -0700 Subject: [PATCH 1/3] remove the prefix filter from table joins - requires cake core pull request https://github.com/baberuth22/cakephp/commit/5f28ae777bce3284839ce6f9a0cf4db9b0f1cfe3 --- Model/Behavior/FilteredBehavior.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Model/Behavior/FilteredBehavior.php b/Model/Behavior/FilteredBehavior.php index 481d1a6..e01a318 100644 --- a/Model/Behavior/FilteredBehavior.php +++ b/Model/Behavior/FilteredBehavior.php @@ -139,7 +139,7 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field { if (isset($Model->{$type}) && isset($Model->{$type}[$configurationModelName])) { - $filterModelName = 'Filter'.$configurationModelName; + $filterModelName = $configurationModelName; $relationType = $type; break; } @@ -154,7 +154,7 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field if ($filterModelName != $Model->alias) { - $filterModelName = 'Filter'.$filterModelName; + $filterModelName = $filterModelName; } } else @@ -169,7 +169,7 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field if (isset($Model->{$relationType}) && isset($Model->{$relationType}[$configurationModelName])) { $relatedModel = $Model->{$configurationModelName}; - $relatedModelAlias = 'Filter'.$relatedModel->alias; + $relatedModelAlias = $relatedModel->alias; if (!Set::matches(sprintf('/joins[alias=%s]', $relatedModelAlias), $query)) { @@ -206,7 +206,7 @@ protected function buildFilterJoin(Model &$Model, Model &$relatedModel) { if (isset($Model->{$type}) && isset($Model->{$type}[$relatedModel->alias])) { - $relatedModelAlias = 'Filter'.$relatedModel->alias; + $relatedModelAlias = $relatedModel->alias; $relationType = $type; break; } From 5154432339313386996c6b23e1d6b6fd7ad025eb Mon Sep 17 00:00:00 2001 From: baberuth22 Date: Tue, 22 Oct 2013 14:38:28 -0700 Subject: [PATCH 2/3] Handle boolean values and fix bug when value is 0 --- Controller/Component/FilterComponent.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Controller/Component/FilterComponent.php b/Controller/Component/FilterComponent.php index 077acd5..c3707a1 100644 --- a/Controller/Component/FilterComponent.php +++ b/Controller/Component/FilterComponent.php @@ -247,6 +247,27 @@ function beforeRender(Controller $controller) $options['options'] = $workingModel->find('list', array_merge($selectOptions, array('nofilter' => true))); } } + // Bryan - strange behavior where array key of 0 gets mapped to empty key + // e.g. $options[] = 0; + if( isset($options['options'][null]) ){ + if( isset($options['options'][0]) ){ + // do nothing - zero already set + unset($options['options'][null]); + }else{ + $options['options'][0] = $options['options'][null]; + unset($options['options'][null]); + } + } + + if(count($options['options']) == 2){ + if( isset($options['options'][0]) && $options['options'][0] == 0){ + if( isset($options['options'][1]) && $options['options'][1] == 1){ + $options['options'][0] = 'No'; + $options['options'][1] = 'Yes'; + } + } + + } if (!$settings['required']) { From e4b57611c776b7ab668b7f977f883ca6e8b3fce2 Mon Sep 17 00:00:00 2001 From: baberuth22 Date: Tue, 22 Oct 2013 16:18:08 -0700 Subject: [PATCH 3/3] Added filtering on date range - also switched default to not required --- Controller/Component/FilterComponent.php | 38 +++++++++++++++++++++++- Model/Behavior/FilteredBehavior.php | 23 ++++++++++++-- View/Elements/filter_form_fields.ctp | 21 ++++++++++++- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/Controller/Component/FilterComponent.php b/Controller/Component/FilterComponent.php index c3707a1..b9cb315 100644 --- a/Controller/Component/FilterComponent.php +++ b/Controller/Component/FilterComponent.php @@ -295,6 +295,42 @@ function beforeRender(Controller $controller) } break; + case 'date': + if (isset($options['value'])) + { + $options['selected'] = $options['value']; + if( isset($this->formData[$fieldModel][$fieldName . "_end_date"]) ){ + $options['selected_end_date'] = $this->formData[$fieldModel][$fieldName . "_end_date"]; + } + + }else if (isset($settings['default'])) + { + $options['selected'] = $settings['default']; + }else{ + $options['selected'] = array('day' => date('d'), 'month' => date('m'), 'year' => ( date('Y') - 40) ); + } + if( !isset($options['selected_end_date']) ){ + $options['selected_end_date'] = array('day' => date('d'), 'month' => date('m'), 'year' => date('Y')); + } + if (isset($settings['maxYear'])) + { + $options['maxYear'] = $settings['maxYear']; + }else{ + $options['maxYear'] = date('Y'); + } + if (isset($settings['minYear'])) + { + $options['minYear'] = $settings['minYear']; + }else{ + $options['minYear'] = date('Y') - 40; + } + + unset($options['value']); + + $options['type'] = 'date'; + + break; + default: continue; } @@ -302,7 +338,7 @@ function beforeRender(Controller $controller) // if no value has been set, show the default one if (!isset($options['value']) && isset($settings['default']) && - $options['type'] != 'checkbox') + $options['type'] != 'checkbox' && $options['type'] != 'date') { $options['value'] = $settings['default']; } diff --git a/Model/Behavior/FilteredBehavior.php b/Model/Behavior/FilteredBehavior.php index e01a318..1c02ecb 100644 --- a/Model/Behavior/FilteredBehavior.php +++ b/Model/Behavior/FilteredBehavior.php @@ -165,6 +165,10 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field } $realFilterField = sprintf('%s.%s', $filterModelName, $filterFieldName); + // Correct real field name if end_date + if( substr($realFilterField, -strlen('_end_date')) === '_end_date' ){ + $realFilterField = preg_replace('/_end_date$/', '', $realFilterField); + } if (isset($Model->{$relationType}) && isset($Model->{$relationType}[$configurationModelName])) { @@ -183,8 +187,12 @@ protected function addFieldToFilter(&$Model, &$query, $settings, $values, $field $query, $realFilterField, $field_options, - $values[$configurationModelName][$configurationFieldName] + $values, + $configurationModelName, + $configurationFieldName ); + + } /** @@ -268,8 +276,10 @@ protected function buildFilterJoin(Model &$Model, Model &$relatedModel) * @param array $options Configuration options for this field. * @param mixed $value Field value. */ - protected function buildFilterConditions(array &$query, $field, $options, $value) + protected function buildFilterConditions(array &$query, $field, $options, $values, $configurationModelName, $configurationFieldName) { + $value = $values[$configurationModelName][$configurationFieldName]; + $conditionFieldFormats = array ( 'like' => '%s like', @@ -334,6 +344,15 @@ protected function buildFilterConditions(array &$query, $field, $options, $value case 'checkbox': $query['conditions'][$field] = $value; break; + case 'date': + $query['conditions'][$field . ' >=' ] = "$value[year]-$value[month]-$value[day]"; + + $endValueFieldName = $configurationFieldName . "_end_date"; + if(isset($values[$configurationModelName][$endValueFieldName])){ + $endValue = $values[$configurationModelName][$endValueFieldName]; + $query['conditions'][$field . ' <=' ] = "$endValue[year]-$endValue[month]-$endValue[day]"; + } + break; } } diff --git a/View/Elements/filter_form_fields.ctp b/View/Elements/filter_form_fields.ctp index 82400ff..26e731a 100644 --- a/View/Elements/filter_form_fields.ctp +++ b/View/Elements/filter_form_fields.ctp @@ -17,7 +17,26 @@ if (isset($viewFilterParams)) { if(empty($includeFields)) { - echo $this->Form->input($field['name'], $field['options']); + $fieldName = $field['name']; + $fieldOptions = $field['options']; + + if($field['options']['type'] === "date"){ + $selectedEndDate = $fieldOptions['selected_end_date']; + } + if( !isset($fieldOptions['required'])){ + $fieldOptions['required'] = false; + } + unset($fieldOptions['selected_end_date']); + $myFormField = $this->Form->input($fieldName, $fieldOptions); + echo $myFormField; + + if($field['options']['type'] === "date"){ + $endDateFieldOptions = $fieldOptions; + $endDateFieldOptions['label'] = str_replace('From', 'To', $endDateFieldOptions['label']); + $endDateFieldOptions['selected'] = $selectedEndDate; + $myEndDateFormField = $this->Form->input($fieldName . "_end_date", $endDateFieldOptions); + echo $myEndDateFormField; + } } else {