Webylon 3.1 API Docs
  • Package
  • Class
  • Tree
  • Deprecated
  • Download
Version: current
  • 3.2
  • 3.1

Packages

  • auth
  • Booking
  • cart
    • shipping
    • steppedcheckout
  • Catalog
  • cms
    • assets
    • batchaction
    • batchactions
    • bulkloading
    • comments
    • content
    • core
    • export
    • newsletter
    • publishers
    • reports
    • security
    • tasks
  • Dashboard
  • DataObjectManager
  • event
  • faq
  • forms
    • actions
    • core
    • fields-basic
    • fields-dataless
    • fields-datetime
    • fields-files
    • fields-formatted
    • fields-formattedinput
    • fields-relational
    • fields-structural
    • transformations
    • validators
  • googlesitemaps
  • guestbook
  • installer
  • newsletter
  • None
  • photo
    • gallery
  • PHP
  • polls
  • recaptcha
  • sapphire
    • api
    • bulkloading
    • control
    • core
    • cron
    • dev
    • email
    • fields-formattedinput
    • filesystem
    • formatters
    • forms
    • i18n
    • integration
    • misc
    • model
    • parsers
    • search
    • security
    • tasks
    • testing
    • tools
    • validation
    • view
    • widgets
  • seo
    • open
      • graph
  • sfDateTimePlugin
  • spamprotection
  • stealth
    • captha
  • subsites
  • userform
    • pagetypes
  • userforms
  • webylon
  • widgets

Classes

  • Catalog
  • CatalogAdmin
  • CatalogBaseFiltersExtension
  • CatalogCMSActionDecorator
  • CatalogPrice
  • CatalogSiteConfig
  • CMSSiteTreeFilter_Catalog
  • Orders1CExchangeSiteConfig
  • PaymentType
  • Product
  • ProductSearchPage
  • SimpleOrderButton
  • SimpleOrderData
  • SimpleOrderPage
  • StartCatalog
  • VirtualProduct

Interfaces

  • OrderButtonInterface
  1 <?php
  2 /**
  3  * Расширение базовых фильтров каталога.
  4  * По умолчанию, сделано заполнение фильтра по произодителю (CheckboxSetField) и по цене (крайние значения для слайдера)
  5  *
  6  * @package Catalog
  7  * @author menedem
  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') { // 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                         // если поле has_one, то оставляем в списке только те значения, которые встречаются в товарах
 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      * @param Varchar $field 
 72      * 
 73      * @return array
 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      * @param Varchar $field 
 96      * 
 97      * @return array
 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. -
Webylon 3.1 API Docs API documentation generated by ApiGen 2.8.0