Version: current

      1 <?php
      2 // Расшрение для SiteConfig для определения виджетов сайта (в т.ч. для мультиязыковых сайтов)
      3 class SiteConfigWidgets extends DataObjectDecorator {
      4
      5     function extraStatics() {
      6         return array(
      7             'has_many' => array(
      8                 'WidgetAreas' => 'WebylonWidgetArea',
      9             )
     10         );
     11     }
     12
     13     // это только для примера, реальный список WidgetArea задаем в site/_00config.php
     14     private static $widgets_areas = array(
     15         'HomeCentral' => 'HomepageWidgetArea',
     16         'Home2Central' => 'HomepageWidgetArea',
     17         'Home3Central' => 'HomepageWidgetArea',
     18         'HomeLeft' => 'SidebarWidgetArea',
     19         'InnerLeft' => 'SidebarWidgetArea',
     20     );
     21
     22     public static function get_widget_areas() {
     23         return self::$widgets_areas;
     24     }
     25
     26     public static function set_widget_areas($areas) {
     27         self::$widgets_areas = $areas;
     28     }
     29
     30     public static function add_widget_area($techName, $class) {
     31         self::$widgets_areas[$techName] = $class;
     32     }
     33
     34     public static function del_widget_area($techName) {
     35         unset(self::$widgets_areas[$techName]);
     36     }
     37
     38     /**
     39      * список виджетов, разрешенных для конкртеной области
     40      * например:
     41      *  array(
     42      *      'HomeCentral' => array(
     43      *          'NewsHomepageWidget', 'SliderHomepageWidget'
     44      *      )
     45      *  )
     46      *
     47      */
     48     private static $allowed_area_widgets = array();
     49
     50     public static function set_allowed_area_widgets($widgets) {
     51         // чтобы можно было передавать по одной области
     52         self::$allowed_area_widgets = array_merge(self::$allowed_area_widgets, $widgets);
     53     }
     54
     55     /**
     56      * Возвращает список виджетов разрешенных для области
     57      *
     58      * @param mixed $area - область или ее имя
     59      *
     60      * @return array - список разрешенных виджетов
     61      */
     62     public static function get_allowed_area_widgets($area = false) {
     63
     64         // нет параметра - возвращаем для всех (как раньше)
     65         if (!$area)
     66             return self::$allowed_area_widgets;
     67
     68         // передан объект
     69         if (is_a($area , 'WebylonWidgetArea')) {
     70             $res = isset(self::$allowed_area_widgets[$area->TechName]) ? self::$allowed_area_widgets[$area->TechName] : array();
     71         }
     72         else {
     73             // считаем что строка
     74             $res = isset(self::$allowed_area_widgets[$area]) ? self::$allowed_area_widgets[$area] : array();
     75         }
     76         return (is_array($res)) ? $res : array($res);
     77     }
     78
     79     // области виджетов, которые нельзя редактировать (readonly)
     80     private static $readonly_widget_areas = array();
     81
     82     public static function set_readonly_widget_areas($areas) {
     83         self::$readonly_widget_areas = $areas;
     84     }
     85
     86     public static function get_readonly_widget_areas() {
     87         return self::$readonly_widget_areas;
     88     }
     89
     90     public static function is_area_readonly($name) {
     91         return (array_search($name, self::$readonly_widget_areas) !== false);
     92     }
     93
     94     function requireDefaultRecords() {
     95         $siteConfigs = DataObject::get('SiteConfig');
     96         if(!$siteConfigs) {
     97             SiteConfig::make_site_config();
     98             DB::alteration_message("Added default site config","created");
     99             $siteConfigs = DataObject::get('SiteConfig');
    100         }
    101         foreach($siteConfigs as $siteConfig) {
    102             if ($currentAreas = DataObject::get('WebylonWidgetArea', "SiteConfigID = {$siteConfig->ID}")) {
    103                 $currentAreasIDs = $currentAreas->map('ID', 'ID');
    104             } else {
    105                 $currentAreas = new DataObjectSet();
    106                 $currentAreasIDs = array();
    107             }
    108             if (self::get_widget_areas()) {
    109                 $sort = 1;
    110                 foreach (self::get_widget_areas() as $name => $type) {
    111                     $area = $currentAreas->find('TechName', $name); //DataObject::get_one('WebylonWidgetArea', "SiteConfigID = {$this->owner->ID} AND TechName = '{$name}'");
    112                     if (!$area) {
    113                         $area = new $type();
    114                         $area->TechName = $name;
    115                         $area->SiteConfigID = $siteConfig->ID;
    116                         $area->Sort = $sort;
    117                         $area->write();
    118                         DB::alteration_message("Область {$area->TechName} создана","created");
    119                     }
    120                     $area->Active = 1;
    121                     $area->write();
    122                     //DB::alteration_message("Область {$area->TechName} включена","created");
    123                     unset($currentAreasIDs[$area->ID]);
    124                     $sort++;
    125                 }
    126             }
    127             if (count($currentAreasIDs)) {
    128                 foreach($currentAreasIDs as $currentAreasID) {
    129                     if ($area = DataObject::get_by_id('WebylonWidgetArea', $currentAreasID)) {
    130                         $area->Active = 0;
    131                         $area->write();
    132                         DB::alteration_message("Область {$area->TechName} выключена","created");
    133                     }
    134                 }
    135             }
    136         }
    137     }
    138
    139     function getActiveWidgetAreas() {
    140         return $this->owner->WidgetAreas('Active = 1', "ID");
    141     }
    142
    143     // конкретная WA
    144     function WidgetArea($techName) {
    145         return DataObject::get_one('WebylonWidgetArea', "SiteConfigID = {$this->owner->ID} and TechName='" . Convert::raw2sql($techName) . "'");
    146     }
    147
    148     // в шаблонах нужны сами виджеты
    149     function getAreaWidgets($techName, $all=false) {
    150         if (!$area = $this->WidgetArea($techName)) return false;
    151         return ($all) ? $area->Widgets() : $area->ActiveWidgets();
    152     }
    153 }

[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. -