1 <?php
2 3 4 5 6 7 8
9
10 class CatalogBaseFiltersExtension extends Extension {
11
12 static $multi_choice_classes = array('CheckboxSetField', 'OptionsetField', 'DropdownField');
13 static $cache = false;
14
15 function updateFilterFields(& $fields) {
16 if ((rand(0,100) < 1) || (isset($_REQUEST) && isset($_REQUEST['flush']))) {
17 self::clean_cache();
18 }
19
20 $parentClass = $this->owner->data()->class;
21 foreach ($fields as $field) {
22 $dataPresents = true;
23
24 if (($field->class == 'TextField') || ($field->class == 'CheckboxField')) {
25 continue;
26 } elseif ($field->class == 'RangeField') {
27 if ($values = $this->getMinMaxFieldValues($field->Name())) {
28 $field->setValue($values);
29 $field->setMinMaxValue($values);
30 }
31 else {
32 $dataPresents = false;
33 }
34 }
35 else {
36
37 $values = $this->getUniqFieldValues($field->Name());
38 if ($values && count($values) > 1) {
39
40 if (array_search($field->class, self::$multi_choice_classes) !== false) {
41
42 if (singleton($parentClass::$subpage_children)->has_one(substr($field->Name(), 0, -2))) {
43 if ($field->getSource() && $field->getSource()->getItems()) {
44 $oldSource = $field->getSource()->getItems()->map();
45 $values = array_intersect_key($oldSource, array_combine($values, $values));
46 asort($values);
47 }
48 } else {
49 sort($values);
50 $values = array_combine($values, $values);
51 unset($values['']);
52 }
53 $field->setSource($values);
54 }
55 }
56 else {
57 $dataPresents = false;
58 }
59 }
60
61
62 if (!$dataPresents) {
63 $fields->removeByName($field->Name());
64 }
65 }
66 }
67
68 69 70 71 72 73 74
75 function getUniqFieldValues($field, $table='Product') {
76 $parentClass = $this->owner->data()->class;
77 $table = $parentClass::productFieldTable($field);
78 $where = implode(' AND ', $this->owner->getProductsListWhere());
79 $cacheKey = "_{$table}_{$field}_".md5($where);
80 if (!$res = self::get_cached_data($cacheKey)) {
81 $join = ($table == 'SiteTree') ? '' : "JOIN \"SiteTree\" ON \"{$table}\".\"ID\" = \"SiteTree\".\"ID\"";
82 $rs = DB::Query("SELECT DISTINCT {$field} FROM \"{$table}\" {$join} WHERE {$where}");
83 if ($rs->numRecords()) {
84 $res = $rs->column();
85 self::set_cached_data($cacheKey, $res);
86 return $res;
87 }
88 }
89 return $res;
90 }
91
92 93 94 95 96 97 98
99 function getMinMaxFieldValues($field, $table='Product') {
100 $parentClass = $this->owner->data()->class;
101 $table = $parentClass::productFieldTable($field);
102 $where = implode(' AND ', $this->owner->getProductsListWhere());
103 $cacheKey = "_{$table}_{$field}_".md5($where);
104 if (!$res = self::get_cached_data($cacheKey)) {
105 $join = ($table == 'SiteTree') ? '' : "JOIN \"SiteTree\" ON \"{$table}\".\"ID\" = \"SiteTree\".\"ID\"";
106 $rs = DB::Query("SELECT MIN({$field}) as min, MAX({$field}) as max FROM \"{$table}\" {$join} WHERE {$where}");
107 if ($rs->numRecords()) {
108 $values = $rs->record();
109 $values['min'] = floor($values['min']);
110 $values['max'] = ceil($values['max']);
111 self::set_cached_data($cacheKey, $values);
112 return $values;
113 }
114 }
115 return $res;
116 }
117
118 static function get_cache() {
119 if (!self::$cache) {
120 self::$cache = SS_Cache::factory('filter');
121 }
122 return self::$cache;
123 }
124
125 static function get_cached_data($key) {
126 if (!$key) return false;
127 return unserialize(self::get_cache()->load($key));
128 }
129
130 static function set_cached_data($key, $data) {
131 if (!$key) return false;
132 return self::get_cache()->save(serialize($data), $key);
133 }
134
135 static function clean_cache() {
136 return self::get_cache()->clean();
137 }
138 }
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-