Version: current

      1 <?php
      2  /**
      3  * @class FavoritePage - страница просмотра избранного
      4  *
      5  * @author menedem
      6  */
      7 class FavoritePage extends Page {
      8
      9     static $defaults = array(
     10         'DevEditType' => 'Fixed',
     11         'AutoChild' => 0
     12     );
     13     static $allowed_children = 'none';
     14
     15     protected static $favorite_object_class = 'Product';    // класс объекта для добавления в избранное
     16
     17     static $favorite_cookie_name = 'FavoriteProducts';
     18
     19     /**
     20      * Получение ссылки на страницу избранных товаров + действие (если есть)
     21      *
     22      * @return string
     23      */
     24     static function find_link($action = false, $productID = false) {
     25         if (!$page = DataObject::get_one('FavoritePage')) {
     26             user_error('Создайте страницу "Избранные товары"', E_USER_ERROR);
     27         }
     28         if ($action == false) {
     29             return $page->Link();
     30         } else {
     31             return $page->Link($action . "/{$productID}");
     32         }
     33     }
     34
     35     /**
     36      * Задать объект для добавления в избранное
     37      *
     38      * @return string
     39      */
     40     static function get_favorite_object_class() {
     41         return self::$favorite_object_class;
     42     }
     43
     44     /**
     45      * Задать объект для добавления в избранное
     46      *
     47      * @param string
     48      */
     49     static function set_favorite_object_class($class) {
     50         self::$favorite_object_class = $class;
     51     }
     52
     53     /**
     54      * Возврат избранного (из профиля или из кук)
     55      *
     56      * @return string
     57      */
     58     static function get_user_favorites() {
     59         $member = Member::currentUser();
     60         if ($member) {
     61             $IDs = base64_decode($member->FavoriteProducts);
     62         } else {
     63             $IDs = CookieExtention::get_cookie_data(FavoritePage::$favorite_cookie_name);
     64         }
     65         return $IDs;
     66     }
     67
     68     function canCreate($member = false) {
     69         $favoritePage = Dataobject::get_one('FavoritePage');
     70         if ($favoritePage) {
     71             return false;
     72         }
     73         return parent::canCreate($member);
     74     }
     75
     76     function canDelete($member = false) {
     77         if (Director::isDev()) {
     78             return true;
     79         }
     80         return parent::canDelete($member);
     81     }
     82
     83     /**
     84      * Получение избранных товаров (из Кук или изпрофиля пользователя)
     85      *
     86      * @return DataObjectSet
     87      */
     88     function ShowFavoriteObjects() {
     89         $IDs = self::get_user_favorites();
     90         $rs = new DataObjectSet();
     91         if ($IDs) {
     92             $IDs = explode(',', $IDs);
     93             foreach($IDs as $id) {
     94                 if ($object = Dataobject::get_by_id(self::$favorite_object_class, (int)$id)) {
     95                     $rs->push($object);
     96                 }
     97             }
     98         }
     99         return $rs;
    100     }
    101
    102     /**
    103      * Для совместимости со старыми сайтами
    104      *
    105      * @return DataObjectSet
    106      */
    107     function ShowFavoriteProducts() {
    108         return $this->ShowFavoriteObjects();
    109     }
    110
    111     /**
    112      * Получение количества товаров в избранном
    113      *
    114      * @return int
    115      */
    116     function FavoriteCount() {
    117         $IDs = self::get_user_favorites();
    118         $count = 0;
    119         if ($IDs) {
    120             $IDs = explode(',', $IDs);
    121             $count = count($IDs);
    122         }
    123         return $count;
    124     }
    125
    126     function requireDefaultRecords() {
    127         parent::requireDefaultRecords();
    128
    129         if ($this->class != 'FavoritePage') return;
    130         // default pages
    131         if(!($page = SiteTree::get_by_link('favorite'))) {
    132             $page = new FavoritePage();
    133             $page->Title = _t('SiteTree.DEFAULTFAVORITETITLE', 'Favorite');
    134             $page->Content = _t('SiteTree.DEFAULTFAVORITECONTENT', '<p>Welcome to SilverStripe! This is the default Favorite page. </p>');
    135             $page->URLSegment = 'favorite';
    136             $page->Status = 'Published';
    137             //$page->Sort = 3; // !!! порядок 1-home, 2-about, 3-contacts
    138             $page->write();
    139             $page->publish('Stage', 'Live');
    140             $page->flushCache();
    141             DB::alteration_message('Favorite page created', 'created');
    142         }
    143     }
    144 }
    145
    146 class FavoritePage_Controller extends Page_Controller {
    147
    148     /**
    149      * Обработчик очистки избранных
    150      *
    151      */
    152     function clear_favorite() {
    153         CookieExtention::clear_cookies(FavoritePage::$favorite_cookie_name);
    154         FavoriteProductMemberExtention::saveFavorites('');
    155         if (!$this->isAjax())
    156             Director::redirectBack();
    157         return Convert::raw2json('success');
    158     }
    159
    160     /**
    161      * Обработчик добавления товара в избранное
    162      *
    163      */
    164     function additem($params) {
    165         $rs = false;
    166         $params = $params->allParams();
    167         if (isset($params['ID'])) {
    168             $productID[] = $params['ID'];
    169             $rs = CookieExtention::add_item_to_cookie(FavoritePage::$favorite_cookie_name, $productID);
    170             FavoriteProductMemberExtention::saveFavorites($rs);
    171         }
    172         if (!$this->isAjax())
    173             Director::redirectBack();
    174         if (trim($rs)) {
    175             return Convert::raw2json(count(explode(',', $rs)));
    176         }
    177         return 0;
    178     }
    179
    180     /**
    181      * Обработчик удаления избранных товаров из корзины
    182      *
    183      */
    184     function deleteitem($params) {
    185         $rs = false;
    186         $params = $params->allParams();
    187         if (isset($params['ID'])) {
    188             $productID[] = $params['ID'];
    189             $rs = CookieExtention::delete_item_from_cookie(FavoritePage::$favorite_cookie_name, $productID);
    190             FavoriteProductMemberExtention::saveFavorites($rs);
    191         }
    192         if (!$this->isAjax())
    193             Director::redirectBack();
    194         if (trim($rs)) {
    195             return Convert::raw2json(count(explode(',', $rs)));
    196         }
    197         return 0;
    198     }
    199 }

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