PHP КОДЫ вывода данных

Добавляем в XML вывода данных интернет-магазина дополнительные свойства
->itemsProperties(TRUE)
->groupsProperties(TRUE)

- addAllowedTags('/node/path', array('description')) массив тегов для элементов, указанных в первом аргументе, разрешенных к передаче в генерируемый XML
- addForbiddenTags('/node/path', array('description')) массив тегов для элементов, указанных в первом аргументе, запрещенных к передаче в генерируемый XML

Для уменьшения нагрузки на сервер, убираем передачу в XML некоторых данных

     ->groupsMode('none')
                  ->group(FALSE)
                  ->itemsForbiddenTags(
                                array(
                                'description',
                                'text',
                                'vendorcode',
                                'guid',
                                'ip',
                                'seo_description',
                                'seo_keywords',
                                'seo_title',
                                'comment',
                                'image_large_width', 
                                'image_large_height',
                                'image_large',
                                'datetime', 
                                'start_datetime', 
                                'end_datetime', 
                                'store', 
                                'adult', 
                                'delivery', 
                                'pickup', 
                                'cpa', 
                                'modification_id', 
                                'showed', 
                                'length', 
                                'width', 
                                'height', 
                                'min_quantity', 
                                'max_quantity', 
                                'quantity_step',
			        'shortcut_id',
                                'ip'
                               ))
                           ->groupsForbiddenTags(
                                array(
                                'description',
                                'text',
                                'seo_title',
                                'seo_item_description_template',
                                'seo_item_keywords_template',
                                'seo_item_title_template',
                                'seo_group_description_template',
                                'seo_group_keywords_template',
                                'seo_group_title_template',
                                'seo_description',
                                'seo_keywords',
                                'siteuser_group_id',
                                'user_id',
                                'guid',
                                'shop_id',
                                'siteuser_id',
                                'items_count',
                                'items_total_count',
                                'image_large',           
                                'image_large_width',
                                'image_large_height',
                                'image_small_width',
                                'image_small_height',
                                'path',
                                'siteuser_group_id',               
                                'indexing',
                                'subgroups_count',
                                'subgroups_total_count'
                            ))
                         ->associatedItems(FALSE)
                         ->specialprices(TRUE)
                         ->bonuses(FALSE)
                         ->cart(FALSE)
                         ->comparing(FALSE)
                         ->favorite(FALSE)
                         ->filterShortcuts(FALSE)
                         ->groupsProperties(FALSE)
                         ->groupsPropertiesList(FALSE) 
                         ->itemsProperties(array(445))
                         ->itemsPropertiesList(FALSE)
                         ->modifications(FALSE)
                         ->modificationsList(FALSE)
                         ->siteuser(FALSE)
                         ->siteuserProperties(FALSE)
                         ->tags(FALSE)
                         ->taxes(FALSE)
                         ->viewed(FALSE)
                         ->votes(FALSE)
                         ->warehousesItems(FALSE)
                         ->cache(FALSE)
                         ->comments(FALSE)
                         ->commentsPropertiesList(FALSE)
                         ->commentsRating(TRUE)
                         ->addMinMaxPrice()
                         ->nestedGroupsToXml(FALSE)
                         ->limit(4)
                         ->show();
Добавляем в ТДС "ИнтернетМагазин" ограничение вывода данных
if ($Shop_Controller_Show->item) {


  // XML-сущность, к которй будут добавляться похожие приложения
  $oSimilarXmlEntity = Core::factory('Core_Xml_Entity')->name('similar');


  // Добавляем XML-сущность контроллеру показа
  $Shop_Controller_Show->addEntity($oSimilarXmlEntity);


  $oShop_Items = $oShop->Shop_Items;
  $oShop_Items
      ->queryBuilder()
      ->select('shop_items.*')
      ->where('shop_items.active', '=', 1)
      ->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group)
      ->where('shop_items.id', '!=', $Shop_Controller_Show->item)
      ->limit(5)
      ->clearOrderBy()
      ->orderBy('RAND()');


  $aShop_Items = $oShop_Items->findAll(FALSE);
  foreach  ($aShop_Items as $oShop_Item)
  {
      $oSimilarXmlEntity->addEntity(
        $oShop_Item->clearEntities()
            ->addForbiddenTag('text')
            ->showXmlProperties(TRUE) // Добавляем дополнительные свойства в похожие товары
      );
  }



    $Shop_Controller_Show
    ->xsl(
        Core_Entity::factory('Xsl')->getByName($xslName)
    )
                    ->groupsMode('none')
                    ->itemsForbiddenTags(
                                array(
                                'vendorcode',
                                'guid',
                                  'ip',
                                'seo_description',
                                'seo_keywords',
                                'seo_title',
                  ))
                    ->groupsForbiddenTags(
                                array(
                                'seo_title',
                                'seo_item_description_template',
                                'seo_item_keywords_template',
                                'seo_item_title_template',
                                'seo_group_description_template',
                                'seo_group_keywords_template',
                                'seo_group_title_template',
                                'seo_description',
                                'seo_keywords',
                                'siteuser_group_id',
                                'user_id',
                                'guid',
                                'shop_id',
                                'siteuser_id',
                                'path',
                                'siteuser_group_id',               
                                'indexing',
                        ))
                        ->associatedItems(TRUE)
                        ->bonuses(FALSE)
                      // ->comments(TRUE)
                        ->comparing(FALSE)
                        ->favorite(TRUE)
                        ->filterShortcuts(FALSE)
                        ->groupsProperties(FALSE)
                        ->groupsPropertiesList(FALSE)
                        ->itemsProperties(TRUE)
                        ->itemsPropertiesList(TRUE)
                        ->modifications(FALSE)
                        ->modificationsList(FALSE)
                        ->siteuser(TRUE)
                        ->siteuserProperties(TRUE)
                        ->specialprices(FALSE)
                      // ->tags(FALSE)
                        ->taxes(FALSE)
                        ->viewed(TRUE)
                        //->votes(FALSE)
                        ->warehousesItems(FALSE)
                        ->cache(FALSE)
                        ->producer(FALSE)
                        ->cart(TRUE)
                        ->show();



}else{


$Shop_Controller_Show
    ->xsl(
        Core_Entity::factory('Xsl')->getByName($xslName)
    )
          ->groupsMode('all')
              //->group(FALSE)
              ->itemsForbiddenTags(
                                array(
                                'vendorcode',
                                'guid',
                                'text',
                                  'ip',
                                'seo_description',
                                'shop_producer',
                                'shop_seller',
                                'seo_keywords',
                                'seo_title',
                                'comment'
                  ))
                      ->groupsForbiddenTags(
                                array(
                                'seo_title',
                                'seo_item_description_template',
                                'seo_item_keywords_template',
                                'seo_item_title_template',
                                'seo_group_description_template',
                                'seo_group_keywords_template',
                                'seo_group_title_template',
                                'seo_description',
                                'seo_keywords',
                                'siteuser_group_id',
                                'user_id',
                                'guid',
                                'shop_id',
                                'siteuser_id',
                                'path',
                                'siteuser_group_id',               
                                'indexing',
                        ))
                    ->tags(FALSE)
                    ->cart(FALSE)
                    ->comparing(FALSE)
                    ->favorite(TRUE)
                    ->comments(FALSE)
                    ->associatedItems(FALSE)
                    ->itemsProperties(array(62,63,64,65,68))
                    ->itemsPropertiesList(FALSE)
                    ->modifications(FALSE)
                    ->modificationsList(FALSE)
                    ->groupsProperties(FALSE)
                    ->siteuser(FALSE)
                    ->siteuserProperties(FALSE)
                    ->specialprices(FALSE)
                    ->taxes(FALSE)
                    ->viewed(FALSE)
                    ->votes(FALSE)
                    ->warehousesItems(FALSE)
                    ->cache(FALSE)
                    ->addMinMaxPrice()
    ->show();
}

Для контроллеров 

$oShop_Item
                    ->addForbiddenTag('text')
                    ->addForbiddenTag('description')
                    ->addForbiddenTag('shop_producer')
                    ->showXmlComments(FALSE)
                    ->showXmlAssociatedItems(FALSE)
                    ->showXmlModifications(FALSE)
                    ->showXmlSpecialprices(FALSE)
                    ->showXmlTags(FALSE)
                    ->showXmlWarehousesItems(FALSE)
                    ->showXmlSiteuser(FALSE)
                    ->showXmlProperties(FALSE)
              );

Краткая корзина

<?php
                    // Краткая корзина
                        $Shop_Cart_Controller_Show = new Shop_Cart_Controller_Show(
                              Core_Entity::factory('Shop', 1)
                        );
                        $Shop_Cart_Controller_Show
                              ->xsl(
                                  Core_Entity::factory('Xsl')->getByName('МагазинКорзинаКраткая')
                              )
                              ->couponText(isset($_SESSION) ? Core_Array::get($_SESSION, 'coupon_text') : '')
                              ->show();
                        ?>

Как показывать краткую корзину только в разделе /shop/ и, если в корзине есть товары, то показывать везде!      

   <?php
                                        $oShop = Core_Entity::factory('Shop', 4);
                                        $Shop_Cart_Controller = Shop_Cart_Controller::instance();
                                        $aShop_Cart = $Shop_Cart_Controller->getAll($oShop);
                                          if ($aShop_Cart) {
                                            $Shop_Cart_Controller_Show = new Shop_Cart_Controller_Show(
                                              Core_Entity::factory('Shop', 4)
                                          );
                                            $Shop_Cart_Controller_Show
                                          ->xsl(
                                                  Core_Entity::factory('Xsl')->getByName('МагазинКорзинаКраткаяСайт3')
                                            )
                                        ->couponText(isset($_SESSION) ? Core_Array::get($_SESSION, 'coupon_text') : '')
                                        ->show();
                                          }
                                            elseif (is_object(Core_Page::instance()->object) && get_class(Core_Page::instance()->object) == 'Shop_Controller_Show') {
                                        $Shop_Cart_Controller_Show = new Shop_Cart_Controller_Show(
                                        Core_Entity::factory('Shop', 4)
                                              );
                                        $Shop_Cart_Controller_Show
                                          ->xsl(
                                                  Core_Entity::factory('Xsl')->getByName('МагазинКорзинаКраткаяСайт3')
                                            )
                                        ->couponText(isset($_SESSION) ? Core_Array::get($_SESSION, 'coupon_text') : '')
                                                ->show();
                                              }
                                ?>

Выводить товары из подгрупп

if ($Shop_Controller_Show->group !== 0){
   // Выводить товары из подгрупп
   $Shop_Controller_Show->subgroups(TRUE);
}

Вывод Групп и Подгрупп товаров

<?php
      // Разделы магазина
      if (Core::moduleIsActive('shop'))
      {
        $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', 1)
        );
        $Shop_Controller_Show
            ->xsl(
              Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавной')
            )
            ->groupsMode('all')
            ->itemsForbiddenTags(array('text'))
            ->limit(0)
            ->show();
      }
            ?>

Вывод групп интернет-магазина в макет сайта по дополнительному свойству, тип "галочка"

<?php
        if (Core::moduleIsActive('shop'))
        {
                $Shop_Controller_Show = new Shop_Controller_Show(
                        Core_Entity::factory('Shop', 1)
                );
                $Shop_Controller_Show
                ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавной')
                )
                ->groupsMode('all');

                // Объединение с нужной таблицей свойств
                $Shop_Controller_Show
                   ->shopGroups()
                   ->queryBuilder()
                   ->leftJoin('shop_group_properties', 'shop_group_properties.shop_id', '=', 'shop_group_properties.shop_id')
                   ->leftJoin('property_value_ints', 'shop_groups.id', '=', 'property_value_ints.entity_id',
                              array(
                                        array('AND' => array('shop_group_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
                                )
                        )
                // Идентификатор дополнительного свойства
                ->where('shop_group_properties.property_id', '=', 61)
                // Значение дополнительного свойства
                ->where('property_value_ints.value', '=', '1')
                ->groupBy('shop_groups.id')
                // Количество свойств
                ->having(Core_Querybuilder::expression('COUNT(DISTINCT `shop_group_properties`.`property_id`)'), '=', 1);
                $Shop_Controller_Show->show();

        }

?>

//Заменяем ID доп. свойства «63» на свой, так же «1» ID магазина, так же XSL шаблон на свой «МагазинГруппыТоваровНаГлавной».
//property_value_datetimes для даты и даты-времени
//property_value_files для файлов
//property_value_ints для целых чисел
//property_value_strings для строк
//property_value_texts для текстов

Разделы магазина на Главной

<?php
        // Разделы магазина
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавной')
                    )
                    ->groupsMode('tree')
                    //->itemsForbiddenTags(array('text'))
                    ->group(0)
                    ->limit(0)
                    ->show();
          }
      ?>

Вывод товаров на Главной со скидкой и избранных товаров

<?php
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПред')
                    )
                    ->groupsMode('none')
                    //->itemsForbiddenTags(array('text'))
                    ->cache(FALSE)
                    ->limit(4);

              $Shop_Controller_Show
                    ->shopItems()
                    ->queryBuilder()
                    ->join('shop_item_discounts', 'shop_item_discounts.shop_item_id', '=', 'shop_items.id')
                    ->join('shop_discounts', 'shop_discounts.id', '=', 'shop_item_discounts.shop_discount_id')
                    ->where('shop_discounts.active', '=', 1)
                    ->where('shop_discounts.start_datetime', '<', Core_Date::timestamp2sql(time()))
                    ->where('shop_discounts.end_datetime', '>', Core_Date::timestamp2sql(time()))
                    ->where('shop_discounts.deleted', '=', 0)
                    ->where('shop_items.modification_id', '=', 0)
                    ->clearOrderBy()
                    ->orderBy('RAND()');
              $Shop_Controller_Show->show();
          }

          //Избранные товары
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('ИзбранноеНаГлавной')
                    )
                    ->groupsMode('none')
                    ->group(FALSE)
                    ->limit(0)
                    ->cache(FALSE)
                    ->show();
          }
          ?>

Вывод товаров по значению дополнительного свойства

<?php
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('КаталогНаГлавнойСпецПред')
                    )
                    ->groupsMode('none')
                    //->itemsForbiddenTags(array('text'))
                    ->group(FALSE)
                    ->itemsProperties(TRUE)
                    ->limit(2);

    // Объединение с нужной таблицей свойств
    $Shop_Controller_Show
        ->ShopItems()
        ->queryBuilder()
        ->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
        ->leftJoin('property_value_ints', 'shop_items.id', '=', 'property_value_ints.entity_id',
            array(
            array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
        )
        // Идентификатор дополнительного свойства
        ->where('shop_item_properties.property_id', '=', 78)
          // Значение дополнительного свойства
        ->where('property_value_ints.value', '=', '1')
        ->groupBy('shop_items.id')
        // Количество свойств
        ->having('COUNT(shop_item_properties.shop_id)', '=', 1);
          $Shop_Controller_Show->show();
          }
          ?>

Вывод товаров по значению дополнительного свойства типа радиокнопка (в случайном порядке)

<?php
        // НОВИНКИ
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 3)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавной')
                    )
                    ->groupsMode('none')
                    //->itemsForbiddenTags(array('text'))
                    ->group(FALSE)
                    ->itemsProperties(TRUE)
                    ->limit(3);

    // Объединение с нужной таблицей свойств
      $Shop_Controller_Show
        ->ShopItems()
        ->queryBuilder()
        ->where('shop_items.active', '=', 1)
        ->clearOrderBy()
        ->orderBy('RAND()')
        ->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
        ->leftJoin('property_value_ints', 'shop_items.id', '=', 'property_value_ints.entity_id',
            array(
              array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
        )
        // Идентификатор дополнительного свойства
        ->where('shop_item_properties.property_id', '=', 62)
          // Значание дополнительного свойства
        ->where('property_value_ints.value', '=', '1')
        ->groupBy('shop_items.id')
        // Количество свойств
        ->having('COUNT(shop_item_properties.shop_id)', '=', 1);
          $Shop_Controller_Show->show();
          }
          ?>

 

Вывод товаров по значению дополнительного свойства типа строка (в случайном порядке)

<?php
        // СПЕЦИАЛЬНАЯ ЦЕНА
          if (Core::moduleIsActive('shop'))
          {
              $Shop _Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 3)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПред')
                    )

                    ->groupsMode('none')
                    //->itemsForbiddenTags(array('text'))
                    ->group(FALSE)
                    ->itemsProperties(TRUE)
                    ->limit(3);

// Объединение с нужной таблицей свойств
    $Shop_Controller_Show
        ->ShopItems()
        ->queryBuilder()
        ->where('shop_items.active', '=', 1)
        ->clearOrderBy()
          ->orderBy('RAND()')
        ->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
        ->leftJoin('property_value_strings', 'shop_items.id', '=', 'property_value_strings.entity_id',
            array(
            array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_strings`.`property_id`')))
            )
        )

        // Идентификатор дополнительного свойства
        ->where('shop_item_properties.property_id', '=', 64)
          // Значание дополнительного свойства
        ->where('property_value_strings.value', '>', '0')
        ->groupBy('shop_items.id')
        // Количество свойств
        ->having('COUNT(shop_item_properties.shop_id)', '=', 1);

          $Shop_Controller_Show->show();
          }
          ?>

Вывод товаров по значению Дополнительного свойства и с проверкой на наличие изображения

<?php
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );

ro

              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПред')
                    )

            ->groupsMode('none')
            ->itemsForbiddenTags(array('text'))
            ->group(FALSE)
            ->itemsProperties(TRUE)
            ->limit(5);

    // Объединение с нужной таблицей свойств
    $Shop_Controller_Show

        ->ShopItems()
        ->queryBuilder()
        ->where('shop_items.active', '=', 1)
        ->clearOrderBy()
        ->orderBy('RAND()')
        ->leftJoin('shop_item_properties', 'shop_items.shop_id', '=', 'shop_item_properties.shop_id')
        ->leftJoin('property_value_ints', 'shop_items.id', '=', 'property_value_ints.entity_id',
            array(
              array('AND' => array('shop_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
        )

        // Идентификатор дополнительного свойства
        ->where('shop_item_properties.property_id', '=', 65)
          // Значение дополнительного свойства
        ->where('property_value_ints.value', '=', '1')
        ->groupBy('shop_items.id')
        // Количество свойств
        ->having('COUNT(shop_item_properties.shop_id)', '=', 1);
          $Shop_Controller_Show->show();
          }
          ?>

Вывод товаров в зависимости от текущей страницы/ раздела

<?php
$Shop_Controller_Show = new Shop_Controller_Show(
  Core_Entity::factory('Shop', 1)
);

$Shop_Controller_Show->xsl(Core_Entity::factory('Xsl')->getByName('Слайды'))
  ->groupsMode('tree')
  //->group(FALSE)
  ->limit(999);

// Если находимся на динамической странице и объект контроллера Shop_Controller_Show
if (is_object(Core_Page::instance()->object)
  && get_class(Core_Page::instance()->object) == 'Shop_Controller_Show'
  && Core_Page::instance()->object->group)
{
  $Shop_Controller_Show->group(
      Core_Page::instance()->object->group
  );
}

$Shop_Controller_Show
  ->shopItems()
  ->queryBuilder()
  //->select('shop_items.*')
  ->where('shop_items.active', '=', 1)
  ->clearOrderBy()
  ->orderBy('RAND()');

$Shop_Controller_Show->show();
?>

Показ товаров, у которых есть модификации со скидкой

<?php
          //Показ товаров, у которых есть модификации со скидкой
          $shop_id = 3;
          $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', $shop_id)
            );
          $Shop_Controller_Show
            ->xsl(
              Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПред')
            )
            ->groupsMode('none')
            ->group(FALSE)
            ->limit(3);

            $Shop_Controller_Show
            ->shopItems()
            ->queryBuilder()
            ->where('shop_items.id', '=', Core_QueryBuilder::select('shop_items.modification_id')
              ->from('shop_items')
              ->where('shop_items.modification_id', '!=', 0)
              ->where('shop_items.shop_id', '=', $shop_id)
              ->join('shop_item_discounts', 'shop_item_discounts.shop_item_id', '=', 'shop_items.id')
              ->join('shop_discounts', 'shop_discounts.id', '=', 'shop_item_discounts.shop_discount_id')
              ->where('shop_discounts.active', '=', 1)
              ->where('shop_discounts.start_datetime', '<', Core_Date::timestamp2sql(time()))
              ->where('shop_discounts.end_datetime', '>', Core_Date::timestamp2sql(time()))
              ->where('shop_discounts.deleted', '=', 0)
              ->limit(3)
            )
            ->clearOrderBy()
            ->orderBy('RAND()');
        $Shop_Controller_Show->show();
          ?>

Вывод товаров в случайном порядке

<?php
if (Core::moduleIsActive('shop'))
      {
        $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', 1)
        );
        $Shop_Controller_Show
            ->xsl(
              Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПред')
            )
            ->groupsMode('none')
            //->itemsForbiddenTags(array('text'))
            ->group(FALSE)
            ->limit(6);

        $Shop_Controller_Show
            ->shopItems()
            ->queryBuilder()
            ->clearOrderBy()
            ->orderBy('RAND()');
        $Shop_Controller_Show->show();

      }
?>

Вывод новинок

<?php
  // Новинки
    if (Core::moduleIsActive('shop'))
      {
        $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', 1)
        );
        $Shop_Controller_Show
            ->xsl(
              Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПред')
            )
            ->groupsMode('none')
            //->itemsForbiddenTags(array('text'))
            ->group(FALSE)
            ->limit(6);

        $Shop_Controller_Show
            ->shopItems()
            ->queryBuilder()
            ->clearOrderBy()
            ->orderBy('shop_items.datetime', 'DESC');

        $Shop_Controller_Show->show();
      }
?>

Выводим только новинки товаров у которых есть изображение

<?php
      if (Core::moduleIsActive('shop'))
      {
        $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', 1)
        );
        $Shop_Controller_Show
            ->xsl(
              Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойНовинки')
            )
            ->groupsMode('none')
            ->itemsForbiddenTags(array('text'))
            ->group(FALSE)
            ->itemsProperties(TRUE)
            ->limit(20);

        $Shop_Controller_Show
            ->shopItems()
            ->queryBuilder()
            ->where('shop_items.image_small', '=', '') // проверяем наличие картинки
            ->clearOrderBy()
            ->orderBy('shop_items.datetime', 'DESC');
        $Shop_Controller_Show->show();
      }

    ?>

Выводим новинки без показа модификаций

<?php
if (Core::moduleIsActive('shop'))

      {
        $Shop_Controller_Show = new Shop_Controller_Show(
            Core_Entity::factory('Shop', 1)
        );
        $Shop_Controller_Show
            ->xsl(
              Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНовинки')
            )
            ->groupsMode('none')
            //->itemsForbiddenTags(array('text'))
            ->group(FALSE)
            ->forbidSelectModifications()
            ->modifications(FALSE)
            ->limit(30);

        $Shop_Controller_Show
            ->shopItems()
            ->queryBuilder()
            ->clearOrderBy()
            ->orderBy('shop_items.datetime', 'DESC');

        $Shop_Controller_Show->show();
      }
?>

Показ просмотренных товаров

<?php
        if (Core::moduleIsActive('shop'))
        {
            $Shop_Controller_Show = new Shop_Controller_Show(
                Core_Entity::factory('Shop', 3)
            );
            $Shop_Controller_Show
                ->xsl(
                    Core_Entity::factory('Xsl')->getByName('МагазинТоварыНаГлавнойНовинкиСайт2')
                )
                ->groupsMode('none')
                ->group(FALSE)
                ->viewed(TRUE)property
                ->limit(0)
                ->show();
        }
        ?>

Показ товаров со скидкой

<?php
            // СКИДКИ
            if (Core::moduleIsActive('shop'))
    {
          $Shop_Controller_Show = new Shop_Controller_Show(
              Core_Entity::factory('Shop', 3)
          );
          $Shop_Controller_Show
              ->xsl(
                    Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавнойСпецПредСайт2')
              )
              ->groupsMode('none')
              ->group(FALSE)
              ->cache(FALSE)
              ->limit(3);

          $Shop_Controller_Show
              ->shopItems()
              ->queryBuilder()
              ->join('shop_item_discounts', 'shop_item_discounts.shop_item_id', '=', 'shop_items.id')
              ->join('shop_discounts', 'shop_discounts.id', '=', 'shop_item_discounts.shop_discount_id')
              ->where('shop_discounts.active', '=', 1)
              ->where('shop_discounts.start_datetime', '<', Core_Date::timestamp2sql(time()))
              ->where('shop_discounts.end_datetime', '>', Core_Date::timestamp2sql(time()))
              ->where('shop_discounts.deleted', '=', 0)
              ->where('shop_items.modification_id', '=', 0)
              ->clearOrderBy()
              ->orderBy('RAND()');

          $Shop_Controller_Show->show();
    }
              ?>

Избранные товары

<?php
          //Избранные товары
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('ИзбранноеНаГлавной')
                    )
                    ->groupsMode('none')
                    ->group(FALSE)
                    ->limit(0)
                    ->cache(FALSE)
                    ->show();
          }
          ?>

Показ производителей

<?php
    // Список производителей
    $oShop_Producer_Controller_Show = new Shop_Producer_Controller_Show(
    Core_Entity::factory('Shop', 1)
    );

    $oShop_Producer_Controller_Show
    ->xsl(
        Core_Entity::factory('Xsl')->getByName('МагазинСписокПроизводителей')
    )
    ->limit(100)
    ->show();
    ?>
 <?php
          // Разделы магазина
            if (Core::moduleIsActive('shop'))
            {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );

          $oShop = $Shop_Controller_Show->getEntity();
          // XML-сущность, к которй будут добавляться производители
          $oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
          // Добавляем XML-сущность контроллеру показа
          $Shop_Controller_Show->addEntity($oProducersXmlEntity);

          // Список производителей
          $aShop_Producers = $oShop->Shop_Producers->findAll();
            foreach ($aShop_Producers as $oShop_Producer)
          {
          // Добавляем производителя потомком XML-сущности
            $oProducersXmlEntity->addEntity(
            $oShop_Producer->clearEntities()
            );
            }
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинСписокПроизводителей')
                    )
                    ->groupsMode('all')
                    //->itemsForbiddenTags(array('text'))
                    ->itemsProperties(TRUE)
                    ->group(0)
                    ->limit(0)
                    ->show();
                }
            ?>

Список  производителей для текущей группы

<?php
        // Список  производителей для текущей группы
          if (Core::moduleIsActive('shop'))
          {
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 1)
              );
            $oShop_Producers = $oShop->Shop_Producers;
            $oShop_Producers->queryBuilder()
          ->select('shop_producers.*')
          ->distinct()
          ->join('shop_items', 'shop_items.shop_producer_id', '=', 'shop_producers.id')
          ->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group)
          ->where('shop_items.deleted', '=', 0);
            $aShop_Producers = $oShop_Producers->findAll();
        ?>

ДЛЯ ТДС Интернет-магазин
Показ производителей текущей группы

/* Производители */
$oShop = $Shop_Controller_Show->getEntity();

// XML-сущность, к которй будут добавляться производители
$oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');

// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity($oProducersXmlEntity);

// Список производителей
$oShop_Producers = $oShop->Shop_Producers;
$oShop_Producers->queryBuilder()
    ->select('shop_producers.*')
    ->distinct()
    ->join('shop_items', 'shop_items.shop_producer_id', '=', 'shop_producers.id')
    ->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group)
    ->where('shop_items.deleted', '=', 0);

$aShop_Producers = $oShop_Producers->findAll();
foreach ($aShop_Producers as $oShop_Producer)
{
    // Добавляем производителя потомком XML-сущности
    $oProducersXmlEntity->addEntity(
        $oShop_Producer->clearEntities()
    );
}

Показ всех производителей интернет-магазина

/* Производители */
$oShop = $Shop_Controller_Show->getEntity();

// XML-сущность, к которй будут добавляться производители
$oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');

// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity($oProducersXmlEntity);

// Список производителей
$oShop_Producers = $oShop->Shop_Producers;

$aShop_Producers = $oShop_Producers->findAll();
foreach ($aShop_Producers as $oShop_Producer)
{
    // Добавляем производителя потомком XML-сущности
    $oProducersXmlEntity->addEntity(
        $oShop_Producer->clearEntities()
    );
}

КОММЕНТАРИИ МАГАЗИНА

Вариант 1

<?php

  // Вывод комментариев на Главной
  $oComments = Core_Entity::factory('Comment');
  $oComments
  ->queryBuilder()
  ->join('comment_shop_items', 'comments.id', '=', 'comment_shop_items.comment_id')
  ->join('shop_items', 'shop_items.id', '=', 'comment_shop_items.shop_item_id')
  ->where('shop_id', '=', 1)
  ->where('comments.active', '=', 1)
  ->orderBy('comments.datetime', 'DESC')
  ->limit(5);

  $aComments = $oComments->findAll();
  foreach($aComments as $oComment)
  {
  $sStructurePath = $oComment->Shop_Item->Shop->Structure->getPath();

  ?><p><a href="<?php echo $sStructurePath . $oComment->Shop_Item->getPath()?>"><b><?php echo htmlspecialchars($oComment->subject)?></b></a>
  <br />Текст: <?php echo $oComment->text?>
  <br />Автор: <?php echo htmlspecialchars($oComment->author)?>
  <br />Дата: <?php echo Core_Date::sql2date($oComment->datetime)?>
  </p>
<?php
}
?>

Вариант 2

<?php
      // Комментарии
      $oComments = Core_Entity::factory('Comment');
      $oComments
    ->queryBuilder()
    ->join('comment_shop_items', 'comments.id', '=', 'comment_shop_items.comment_id')
    ->join('shop_items', 'shop_items.id', '=', 'comment_shop_items.shop_item_id')
    ->where('shop_id', '=', 3)
    ->where('comments.active', '=', 1)
    ->orderBy('comments.datetime', 'DESC')
    ->limit(3);
      $aComments = $oComments->findAll();
      foreach($aComments as $oComment)
          {
      $sStructurePath = $oComment->Shop_Item->Shop->Structure->getPath();
        ?>
      <div class="comment_users">
      <a href="<?php echo $sStructurePath . $oComment->Shop_Item->getPath()?>"><span class="icon-bubble" ></span>  <?php echo htmlspecialchars($oComment->subject)?></a>
      <p><?php echo $oComment->text?></p>
      <span class="icon-user" style="padding-right:6px;"></span><?php echo htmlspecialchars($oComment->author)?><br/>
      <span class="icon-calendar" style="padding-right:6px;"></span><?php echo Core_Date::sql2date($oComment->datetime)?><hr/>
    </div>
  <?php
        }
      ?>

МЕТКИ МАГАЗИНА

<?php
        // Метки
          if (Core::moduleIsActive('shop')){
              $Shop_Controller_Tag_Show = new Shop_Controller_Tag_Show(
                    Core_Entity::factory('Shop', 1)
              );
              $Shop_Controller_Tag_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('ОблакоТэговМагазин')
                    )
                    ->show();
          } ?>

Метки магазина из текущего раздела и из определенных групп Меток

<?php
   
// Метки
              $Shop_Controller_Tag_Show = new Shop_Controller_Tag_Show(
                    Core_Entity::factory('Shop', 16)
              );
              
              // Показывать метки только для товаров текущей группы
	if (is_object(Core_Page::instance()->object)
	&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show'
	&& Core_Page::instance()->object->group)
	{
		$Shop_Controller_Tag_Show->group(Core_Page::instance()->object->group);
	}
	
              $Shop_Controller_Tag_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('ОблакоТэговМагазинPNEVMOTEX')
                    )
                ->tag_dir(array(12,13,14,15,16,17))
                ->show();
         
	        $Shop_Controller_Show->addEntity(
		    Core::factory('Core_Xml_Entity')
		    	->name('tags_list')->value(ob_get_clean())
	);
?>

Добавляется в XSL шаблон "МагазинКаталогТоваров" - проверить работу!

<div class="TagsCloud">
  <xsl:for-each select=".//shop_item[tag !='']">
          <xsl:variable name="name" select="tag/name"/>
          <xsl:if test ="not(preceding::tag[name = $name])">
                      <a href="/shop/tag/{tag/path}"><xsl:value-of select="tag/name"/></a>
          </xsl:if>
    </xsl:for-each>
</div>

Метки с разбивкой по разделам

<?php
   $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
  ->from('tag_dirs')
  ->where('deleted', '=', 0);
    $aRows = $oCore_QueryBuilder_Select->execute()->asAssoc()->result();
    foreach ($aRows as $pr) {
    $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
  ->from('tags')
  ->where('tag_dir_id', '=', $pr["id"]);
    $aRows_tag = $oCore_QueryBuilder_Select->execute()->asAssoc()->result();
    if (count($aRows_tag)!=0) {
    echo '<p class="h1">'.$pr["name"].'</p>';
    echo '<div class="TagsCloud">';
    foreach ($aRows_tag as $tag) {
          echo '<a href="/shop/tag/'.$tag["name"].'/" style="font-size: 9pt">'.$tag["name"].'</a>';
    echo '</div><br/>';
    ?>

Вывод товаров со специальной ценой 

<?php
        // Вывод товаров со специальной ценой
          if (Core::moduleIsActive('shop'))
              $Shop_Controller_Show = new Shop_Controller_Show(
                    Core_Entity::factory('Shop', 3)
              );
              $Shop_Controller_Show
                    ->xsl(
                        Core_Entity::factory('Xsl')->getByName('МагазинКаталогТоваровНаГлавной')
                    ->groupsMode('none')
                    ->itemsForbiddenTags(array('text'))
                    ->group(FALSE)
                    ->modifications(false)
                    ->forbidSelectModifications()
                    ->specialprices(TRUE)
                    ->limit(3);

              $Shop_Controller_Show
                    ->shopItems()
                    ->queryBuilder()
                    ->clearOrderBy()
                    ->orderBy('RAND()');
              $Shop_Controller_Show->show();
          ?>

Самые популярные товары

<?php
/** Показ популярных товаров - начало **/
if (Core::moduleIsActive('shop'))
{
    $shop_specials_xsl_name = 'МагазинСамыеПопулярныеТовары';
    $items_to_show = 6;
    $shop_id = 3;
    $oShop = Core_Entity::factory('Shop', $shop_id);
    $oShop_Controller_Show_Popular_Items = Shop_Controller_Show_Popular_Items::instance($oShop);
    $oShop_Controller_Show_Popular_Items
                ->limit($items_to_show) // макс. количество выводимых товаров
                ->selection_method('shows') // на основании данных о заказах
                ->only_paid_orders(TRUE) // при отборе учитывать только оплаченные заказы
                ->count_method('orders_and_count') // метод подсчета популярности товара в заказах - с учетом кол-ва в каждом заказе
                ->show_parent_items_instead_modifications(TRUE) // TRUE - показывать родительские товары вместо модификаций
                ->exclude_out_of_rest_items(TRUE) // TRUE - запрещает показывать товары, которых нет в наличии
                ->is_random(TRUE) // сортировка: FALSE - по уменьшению популярности
                ->cache(TRUE) // TRUE - разрешает использовать кеширование;
                ->xsl(Core_Entity::factory('Xsl')->getByName($shop_specials_xsl_name)) // назначаем xsl-шаблон
                ->Shop_Controller_Show() // полчаем экземпляр котроллера показа магазина, для дополнительной настройки
                        ->addEntity(Core::factory('Core_Xml_Entity')->name('block_title')->value('Самые популярные товары')) // передаем пользовательские данные в XML
                        ->comments(TRUE); // включаем передачу комментариев к товарам в XML
        $oShop_Controller_Show_Popular_Items
                ->show(); // отображаем список
}
?>

Получение верхней корневой группы магазина независимо от уровня вложенности.
Идентификатор текущей группы содержится в $iCurrentGroupID.

// Текущая группа магазина
$oShop_Group = Core_Entity::factory('Shop_Group', $iCurrentGroupID);
while ($oShop_Group->parent_id){
    $oShop_Group = $oShop_Group->getParent();}

Полный код. Вставляется в конец кода ТДС Интернет-магазина

if ($Shop_Controller_Show->group)
{
// Текущая группа магазина
$iCurrentGroupID =0;
$oShop_Group = Core_Entity::factory('Shop_Group', $iCurrentGroupID);

while ($oShop_Group->parent_id)
{
    $oShop_Group = $oShop_Group->getParent();
}
}

Показ нескольких товаров из той же категории, что и текущий товар. Добавляется в ТДС магазина перед блоком с ->show()

if ($Shop_Controller_Show->item) { 
// для загрузки статичного документа 
$Shop_Controller_Show->addEntity( 
   Core::factory('Core_Xml_Entity') 
      ->name('my_document')->value( 
         Core_Entity::factory('Document', 22)->text 
      ) 
); 


   // XML-сущность, к которй будут добавляться похожие приложения 
   $oSimilarXmlEntity = Core::factory('Core_Xml_Entity')->name('similar'); 
   // Добавляем XML-сущность контроллеру показа 
   $Shop_Controller_Show->addEntity($oSimilarXmlEntity); 
   $oShop_Items = $oShop->Shop_Items; 
   $oShop_Items 
      ->queryBuilder() 
      ->select('shop_items.*') 
      ->where('shop_items.active', '=', 1) 
      ->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group) 
      ->where('shop_items.id', '!=', $Shop_Controller_Show->item) 
      ->limit(4) 
      ->clearOrderBy() 
      ->orderBy('RAND()'); 

   $aShop_Items = $oShop_Items->findAll(FALSE); 
   foreach   ($aShop_Items as $oShop_Item) 
   { 
      $oSimilarXmlEntity->addEntity( 
         $oShop_Item->clearEntities() 
            ->addForbiddenTag('text') 
            ->showXmlProperties(TRUE) // Добавляем дополнительные свойства в похожие товары 
      ); 
 } 
}

В XML пойдет тег similar, в нем будут товары текущей группы, кроме просматриваемого товара. Ну а далее просто выводите их в XSL-шаблоне товара.

Вызов:
    <div class="col-xs-12">
        <h2>Похожие товары</h2>
        <div class="row products-grid">
            <xsl:apply-templates select="/shop/similar/shop_item" mode="similar"/>
        </div>
    </div>

и сам темплейт:

<!-- Шаблон для схожих товаров-->
<xsl:template match="shop_item" mode="similar">
....
</xsl:template>

Не показывать товары, которых нет в наличииОграничения на вывод товаров задаются через метод shopItems() контроллера Shop_Controller_Show, метод возвращает объект Shop_Item_Model с настроенными ограничениями. Дополним их через queryBuilder()
Добавить в ТДС

$Shop_Controller_Show
->shopItems()
->queryBuilder()
->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
->having('SUM(shop_warehouse_items.count)', '>', 0)
->groupBy('shop_items.id');

$Shop_Controller_Show->show();

Ограничение с учетом остатков на складе модификаций
Вывод товаров, имеющих остатки на складах, либо товаров, имеющих модификации с остатками на складе.

$Shop_Controller_Show
    ->shopItems()
    ->queryBuilder()
    // Модификации и остатки на складах модификаций
    ->leftJoin(array('shop_items', 'modifications'), 'modifications.modification_id', '=', 'shop_items.id')
    ->leftJoin(array('shop_warehouse_items', 'modifications_shop_warehouse_items'), 'modifications_shop_warehouse_items.shop_item_id', '=', 'modifications.id')
    // Остатки на складах основного отвара
    ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
    // Есть остатки на основном складе
    ->having('SUM(shop_warehouse_items.count)', '>', 0)
    // Или
    ->setOr()
    // Есть остатки на складах у модификаций
    ->having('SUM(modifications_shop_warehouse_items.count)', '>', 0)
    ->groupBy('shop_items.id');


$Shop_Controller_Show->show();

Мета-теги магазина как в HostCMS v.5

Изменения вносятся в код настроек типовой динамической страницы магазина со строки, начинающейся с if ($Shop_Controller_Show->group):
if ($Shop_Controller_Show->group)
{
    $oShop_Group = Core_Entity::factory('Shop_Group', $Shop_Controller_Show->group);
    Core_Page::instance()->title($oShop_Group->seo_title != ''
          ? $oShop_Group->seo_title
          : $oShop_Group->name);
    Core_Page::instance()->description($oShop_Group->seo_description != ''
          ? $oShop_Group->seo_description
          : $oShop_Group->name);
    Core_Page::instance()->keywords($oShop_Group->seo_keywords != ''
          ? $oShop_Group->seo_keywords
          : $oShop_Group->name);
}
if ($Shop_Controller_Show->item)
{
    $oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item);
    Core_Page::instance()->title($oShop_Item->seo_title != ''
          ? $oShop_Item->seo_title
          : $oShop_Item->name);
    Core_Page::instance()->description($oShop_Item->seo_description != ''
          ? $oShop_Item->seo_description
          : $oShop_Item->name);
    Core_Page::instance()->keywords($oShop_Item->seo_keywords != ''
          ? $oShop_Item->seo_keywords
          : $oShop_Item->name);
}
Core_Page::instance()->object = $Shop_Controller_Show;

Добавление новых узлов в XML

if (is_object(Core_Page::instance()->object) && get_class(Core_Page::instance()->object) == 'Shop_Controller_Show')
            {
          $Shop_Controller_Show->addEntity(
              Core::factory('Core_Xml_Entity')
            ->name('current_group_id')
            ->value(intval(Core_Page::instance()->object->group))
              );
          }


$Shop_Controller_Show->addEntity(
        Core::factory('Core_Xml_Entity')
        ->name('ТекущаяГруппа')
        ->value($Shop_Controller_Show->group)
);

Добавляем Статичный Документ в XML

Код добавляем в ТДС Интернет-магазина
вариант 1
Создаем в параметрах ТДС переменную document_id со следующими данными
Название параметра - Документ для гарантии
Название переменной - document_id
Тип - SQL запрос
SQL-запрос 
SELECT * FROM documents WHERE site_id = {SITE_ID}
Поле заголовка - name
Поле значания - id

Далее в код ТДС вставляем следующий код

// для загрузки документа гарантии
$iDocumentID = intval(Core_Array::get(Core_Page::instance()->libParams, 'document_id'));
$oDocument = Core_Entity::factory('Document')->find($iDocumentID);
if ($Shop_Controller_Show->item)
{
if (!is_null($oDocument) && $oDocument->id){
    ob_start();
    $oDocument->Document_Versions->getCurrent()->execute();
    $Shop_Controller_Show->addEntity(Core::factory('Core_Xml_Entity')->name('page_content')->value(ob_get_clean()));
}
}
Затем в настройка Структуры узла Интернет-магазин указываем Документ, который нужно выводить

вариант 2
// для ajax загрузки статичного документа
$document = Core_Entity::factory('Document', 19)->Document_Versions->getCurrent()->loadFile(); // 19 Заменить на ID Документа

if ($Shop_Controller_Show->item)
{
        $Shop_Controller_Show
        // добавляем собственный тег для вывода документа
          ->addEntity(Core::factory('Core_Xml_Entity')
          ->name('document')
          ->value($document));
}

вариант 3

$Shop_Controller_Show->addEntity(
  Core::factory('Core_Xml_Entity')
      ->name('my_document')->value(
        Core_Entity::factory('Document', 123)->text
      )
);

ДЛЯ ЯРЛЫКА ДОБАВЛЯЕМ В XML ID РОДИТЕЛЬСКОЙ ГРУППЫ
*Добавляем в самом начале кода настроек ТДС показа интернет-магазина

Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Observer', 'onBeforeGetXml'));


class Shop_Item_Observer
{
  static public function onBeforeGetXml($object, $args)
  {
      $object->addXmlTag('parent_group_id', $object->shop_group_id);
  }
}

Добавить название группы товара в Корзину
в ТДС. Перед:

$Shop_Cart_Controller_Show
  ->couponText(
      Core_Str::stripTags(Core_Array::get(Core_Array::get($_SESSION, 'hostcmsOrder', array()), 'coupon_text'))
  )
  ->xsl(
      Core_Entity::factory('Xsl')->getByName($xslName)
  )
  ->show();

добавить:

class Shop_Item_Cart_Observer
{
  static public function onBeforeGetXml($object, $args)
  {
      if (is_object(Core_Page::instance()->object)
      && get_class(Core_Page::instance()->object) == 'Shop_Cart_Controller_Show')
      {
        $oShop_Group = Core_Entity::factory('Shop_Group', intval($object->shop_group_id));

        if (!is_null($oShop_Group))
        {
            // Добавить новый тег, содержащий имя группы товара
            $object->addXmlTag('shop_group_name', $oShop_Group->name);
        }
      }
  }
}

// Add shop_item observer
Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Cart_Observer', 'onBeforeGetXml'));

Этот хук добавит в каждый shop_item в корзине новый тег shop_group_name. В котором будет название группы товара. После такой вывод:

<xsl:value-of disable-output-escaping="yes" select="shop_item/shop_group_name"/>

Добавить название группы в карточке товара
В ТДС добавляем

$oShop_Group = Core_Entity::factory('Shop_Group', intval($Shop_Controller_Show->group));

$Shop_Controller_Show->addEntity(
                  Core::factory('Core_Xml_Entity')
                  ->name('shop_group_name')
                  ->value($oShop_Group->name)
  );

Показ товаров только с ценой (больше 0)

// Показываем только с положительной ценой
$Shop_Controller_Show
	->shopItems()
	->queryBuilder()
	->where('shop_items.price', '>', 0);

Не выводим товары, которых нет в наличии (0 на всех складах)

  $Shop_Controller_Show
     ->shopItems()
     ->queryBuilder()
     ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
     ->having('SUM(shop_warehouse_items.count)', '>', 0)
     ->groupBy('shop_items.id');

Выводить товары с сортировкой по цене и показом в конце списка товаров, которых нет в наличии на складе.

    $Shop_Controller_Show
   ->shopItems()
   ->queryBuilder()
   ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
   ->clearOrderBy()
   ->orderBy('SIGN(shop_warehouse_items.count)', 'DESC')
   ->orderBy('shop_items.price','ASC');

Меняем ID макета для товара

if (isset($Shop_Controller_Show->item) && $Shop_Controller_Show->item)
{
	Core_Page::instance()->template(
		Core_Entity::factory('Template', 12)
	);
}


Core_Page::instance()->template(Core_Entity::factory('Template', 54)); // указываем id макета для Товара или Инфоэлемента

Вывод неактивных товаров

Показ товаров в клиентском разделе происходит в типовой динамической странице «Интернет-магазин» с использованием контроллераShop_Controller_Show, при этом по умолчанию отображаются только активные товары.
Опция, регулирующая вид отображаемых товаров, называется itemsActivity() и может иметь 3 значения:
'active' — только активные (по умолчанию);
'inactive' — только неактивные;
'all' — все.

$Shop_Controller_Show
    ->itemsActivity('all')
    ->xsl(
        Core_Entity::factory('Xsl')->getByName($xslName)
    )
    ...
    ->show();

Динамическая подгрузка контента на страницу (ajax-подгрузка)

Пример реализации динамической подгрузки товаров в каталоге.
Редактируем XSL-шаблон каталога товаров. В нём, в самом начале темплейта <xsl:template match="/shop">  добавляем скрипт:
<xsl:if test="not(/shop/ajax/node())">
<SCRIPT type="text/javascript">
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
$(function() {
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() >= $(document).height() - 100) {
$('div.products-grid-ajax a.load-more-items')
.click()
.prop('onclick', null)
.off('click');
}
});
});
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
</xsl:if>
2. Добавим кнопку "Показать еще". Для этого в этом же XSL-шаблоне каталога товаров меняем блок:
<!-- Выводим товары магазина -->
<div class="row products-grid">
<xsl:apply-templates select="shop_item" />
</div>
на:
<!-- Выводим товары магазина -->
<div class="row products-grid products-grid-ajax">
<xsl:apply-templates select="shop_item" />
<xsl:if test="count(/shop/shop_item) = /shop/limit">
<div class="col-xs-12">
<a class="btn btn-primary full-width margin-top-30 load-more-items" onclick="$(this).find('i').addClass('fa-spin'); $.showShopItems('{.//shop_group[@id=$group]/url}page-{/shop/page + 2}/')">
<i class="fa fa-refresh"></i>
Показать еще
</a>
</div>
</xsl:if>
</div>
3. При нажатии на кнопку или при достижении конца страницы будет отправляться ajax-запрос функцией showShopItems. Добавим обработку js-функции в основной макет сайта, вкладка "Javascript":
$(function() {
$.extend({
showShopItems: function(path){
jQuery.ajax({
url: path,
type: 'POST',
data: { 'ajaxLoadItems': true },
dataType: 'json',
success: function(answer){
var jDiv = $('<div>').html(answer),
jDivItems = $('div.products-grid-ajax');
jDivItems.find('a.load-more-items').remove();
jDivItems.append(
jDiv.find('div.products-grid-ajax').children()
);
// Pagination
$('.pagination').after(jDiv.find('.pagination')).remove();
}
});
}
});
});
4. Переходим в код настроек типовой динамической страницы интернет-магазина и после блока:
$Shop_Controller_Show
->limit($limit)
->parseUrl();
Добавляем PHP-обработку ответа для ajax-запроса:
// Ajax upload items
if (!is_null(Core_Array::getRequest('ajaxLoadItems')))
{
$xslName = Core_Array::get(Core_Page::instance()->libParams, 'shopXsl');
ob_start();
$Shop_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
);
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('ajax')
->value(1)
);
$Shop_Controller_Show->show();
Core::showJson(ob_get_clean());
}
После всех описанных манипуляций, при нажатии на кнопку "Показать еще" или при достижении конца страницы будут подгружаться товары.

Добавление цен в других валютах в карточке товара

Обработчик размещаем в коде типовой динамической страницы.


     // Если идет показ товара
    if ($Shop_Controller_Show->item){
      class Shop_Item_Observer_Prices
      {
         static public function onBeforeGetXml($object, $args)
         {
            $oPrices = Core::factory('Core_Xml_Entity')
               ->name('prices');

            $oShop = $object->Shop;
            $aShop_Currencies = Core_Entity::factory('Shop_Currency')->findAll();

            foreach ($aShop_Currencies as $oShop_Currency)
            {
               $fCurrencyCoefficient = $object->shop_currency_id > 0 && $oShop_Currency->id > 0
                  ? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
                     $object->Shop_Currency, $oShop_Currency
                  )
                  : 0;

               // Prices
               $oShop_Item_Controller = new Shop_Item_Controller();
               if (Core::moduleIsActive('siteuser'))
               {
                  $oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();
                  $oSiteuser && $oShop_Item_Controller->siteuser($oSiteuser);
               }
               //$oShop_Item_Controller->count($this->_cartQuantity);
               $aPrices = $oShop_Item_Controller->getPrices($object);

               $oPrices->addEntity(
                  Core::factory('Core_Xml_Entity')
                     ->name('price')
                     ->addEntity(
                        Core::factory('Core_Xml_Entity')
                           ->name('value')
                           ->value(
                              Shop_Controller::instance()->round($aPrices['price_discount'] * $fCurrencyCoefficient)
                           )
                     )
                     ->addEntity(
                        $oShop_Currency
                     )
               );
            }

            $object->addEntity($oPrices);
         }
      }

      Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Observer_Prices', 'onBeforeGetXml'));}

Добавляем в Личный кабинет показ заказанных товаров

Код ТДС "Пользователи сайта"

<?php

if (!Core::moduleIsActive('siteuser'))
{
    ?>
    <h1>Пользователи сайта</h1>
    <p>Функционал недоступен, приобретите более старшую редакцию.</p>
    <p>Модуль &laquo;<a href="http://www.hostcms.ru/hostcms/modules/users/">Пользователи сайта</a>&raquo; доступен в редакциях &laquo;<a href="http://www.hostcms.ru/hostcms/editions/corporation/">Корпорация</a>&raquo; и &laquo;<a href="http://www.hostcms.ru/hostcms/editions/business/">Бизнес</a>&raquo;.</p>
    <?php
    return ;
}

$Siteuser_Controller_Show = Core_Page::instance()->object;

$xslUserAuthorization = Core_Array::get(Core_Page::instance()->libParams, 'userAuthorizationXsl');

$oSiteuser = $Siteuser_Controller_Show->getEntity();

if ($oSiteuser->id)
{
    if (Core::moduleIsActive('shop'))
    {
        /* Последние заказы пользователя */
        $oShop_Orders = Core_Entity::factory('Shop_Order');

        $oShop_Orders
            ->queryBuilder()
            ->leftJoin('shops', 'shop_orders.shop_id', '=', 'shops.id')
            ->where('shop_orders.siteuser_id', '=', $oSiteuser->id)
            ->where('shops.site_id', '=', CURRENT_SITE)
            ->limit(6)
            ->clearOrderBy()
            ->orderBy('shop_orders.id', 'DESC');

        $aShop_Orders = $oShop_Orders->findAll(FALSE);

        foreach ($aShop_Orders as $oShop_Order)
        {
            $sum = $oShop_Order->sum();

            $aShop_Order_Items = $oShop_Order->Shop_Order_Items->findAll(FALSE);

            foreach ($aShop_Order_Items as $oShop_Order_Item)
            {
                $oShop_Order->addEntity(
                    $oShop_Order_Item->clearEntities()
                );
            }

            $oShop_Order
                ->showXmlOrderStatus(TRUE)
                ->showXmlDelivery(FALSE);

            //Currency
            $oShop_Currency = Core_Entity::factory('Shop_Currency', $oShop_Order->shop_currency_id);

            if (!is_null($oShop_Currency))
            {
                $oShop_Order->addEntity(
                    $oShop_Currency
                );
            }

            $Siteuser_Controller_Show->addEntity(
                $oShop_Order
                    ->addEntity(
                        Core::factory('Core_Xml_Entity')
                        ->name('sum')
                        ->value($sum)
                )
            );



        }
    }

    if (Core::moduleIsActive('maillist'))
    {
        /* Почтовые рассылки */
        $aMaillists = $oSiteuser->getAllowedMaillists();

        if (count($aMaillists))
        {
            $Siteuser_Controller_Show->addEntity(
                    $oMaillistEntity = Core::factory('Core_Xml_Entity')
                        ->name('maillists')
                );

            foreach ($aMaillists as $oMaillist)
            {
                $oMaillist_Siteuser = $oSiteuser->Maillist_Siteusers->getByMaillist($oMaillist->id);

                $oMaillistEntity->addEntity(
                    $oMaillist->clearEntities()
                );

                if (!is_null($oMaillist_Siteuser))
                {
                    $oMaillist->addEntity(
                        $oMaillist_Siteuser->clearEntities()
                    );
                }
            }
        }
    }

    if (Core::moduleIsActive('helpdesk'))
    {
        $aHelpdesks = Core_Entity::factory('Site', CURRENT_SITE)->Helpdesks->findAll(FALSE);

        if (count($aHelpdesks))
        {
            $Siteuser_Controller_Show->addEntity(
                $oTicketEntity = Core::factory('Core_Xml_Entity')
                    ->name('helpdesk_tickets')
            );

            $oHelpdesk = $aHelpdesks[0];

            $oHelpdesk_Tickets = $oHelpdesk->Helpdesk_Tickets;

            $oHelpdesk_Tickets
                ->queryBuilder()
                ->where('helpdesk_tickets.siteuser_id', '=', $oSiteuser->id)
                ->limit(5)
                ->clearOrderBy()
                ->orderBy('helpdesk_tickets.id', 'DESC');

            $aHelpdesk_Tickets = $oHelpdesk_Tickets->findAll(FALSE);

            foreach ($aHelpdesk_Tickets as $oHelpdesk_Ticket)
            {
                $oTicketEntity->addEntity(
                    $oHelpdesk_Ticket->clearEntities()
                        ->showXmlSiteuser(FALSE)
                );

                $oHelpdesk_Messages = $oHelpdesk_Ticket->Helpdesk_Messages;
                $oHelpdesk_Messages
                    ->queryBuilder()
                    ->clearOrderBy()
                    ->orderBy('helpdesk_messages.id', 'ASC')
                    ->limit(1);

                $aHelpdesk_Messages = $oHelpdesk_Messages->findAll(FALSE);

                if (count($aHelpdesk_Messages))
                {
                    $oHelpdesk_Message = $aHelpdesk_Messages[0];

                    $oHelpdesk_Ticket->addEntity(
                        Core::factory('Core_Xml_Entity')
                            ->name('helpdesk_ticket_subject')
                            ->value($oHelpdesk_Message->subject)
                    );
                }
            }
        }
    }

    $Siteuser_Controller_Show->addEntity(
        Core::factory('Core_Xml_Entity')
            ->name('item')
            ->addEntity(
                Core::factory('Core_Xml_Entity')->name('name')->value('Личная информация')
            )
            ->addEntity(
                Core::factory('Core_Xml_Entity')->name('path')->value('registration/')
            )
            ->addEntity(
                Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/info.png')
            )
    );

    if (Core::moduleIsActive('maillist'))
    {
        $Siteuser_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
                ->name('item')
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('name')->value('Почтовые рассылки')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('path')->value('maillist/')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/maillist.png')
                )
        );
    }

    if (Core::moduleIsActive('helpdesk'))
    {
        $Siteuser_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
                ->name('item')
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('name')->value('Служба техподдержки')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('path')->value('helpdesk/')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/helpdesk.png')
                )
        );
    }

    if (Core::moduleIsActive('shop'))
    {
        $Siteuser_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
                ->name('item')
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('name')->value('Мои заказы')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('path')->value('order/')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/order.png')
                )
        );

        if (Core::moduleIsActive('siteuser'))
        {
            $oAffiliate_Plans = Core_Entity::factory('Site', CURRENT_SITE)->Affiliate_Plans;

            $aSiteuserGroupId = array();

            $oSiteuser_Groups = $oSiteuser->Siteuser_Groups->findAll();
            foreach ($oSiteuser_Groups as $oSiteuser_Group)
            {
                $aSiteuserGroupId[] = $oSiteuser_Group->id;
            }

            if (count($aSiteuserGroupId))
            {
                $oAffiliate_Plans->queryBuilder()
                    ->where('siteuser_group_id', 'IN', $aSiteuserGroupId);

                $aAffiliate_Plans = $oAffiliate_Plans->findAll();

                if (count($aAffiliate_Plans))
                {
                    $Siteuser_Controller_Show->addEntity(
                        Core::factory('Core_Xml_Entity')
                            ->name('item')
                            ->addEntity(
                                Core::factory('Core_Xml_Entity')->name('name')->value('Партнерские программы')
                            )
                            ->addEntity(
                                Core::factory('Core_Xml_Entity')->name('path')->value('affiliats/')
                            )
                            ->addEntity(
                                Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/partner.png')
                            )
                    );
                }
            }
        }
    }

    if (Core::moduleIsActive('siteuser'))
    {
        $Siteuser_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
                ->name('item')
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('name')->value('Лицевой счет')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('path')->value('account/')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/account.png')
                )
        );
    }

    if (Core::moduleIsActive('shop'))
    {
        $Siteuser_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
                ->name('item')
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('name')->value('Мои объявления')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('path')->value('my_advertisement/')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/bulletin-board.png')
                )
        );
    }

    if (Core::moduleIsActive('message'))
    {
        $Siteuser_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
                ->name('item')
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('name')->value('Мои сообщения')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('path')->value('my_messages/')
                )
                ->addEntity(
                    Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/message.png')
                )
        );
    }

    $Siteuser_Controller_Show->addEntity(
        Core::factory('Core_Xml_Entity')
            ->name('item')
            ->addEntity(
                Core::factory('Core_Xml_Entity')->name('name')->value('Выход')
            )
            ->addEntity(
                Core::factory('Core_Xml_Entity')->name('path')->value('?action=exit')
            )
            ->addEntity(
                Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/exit.png')
            )
    );

}


$Siteuser_Controller_Show->xsl(
    Core_Entity::factory('Xsl')->getByName($xslUserAuthorization)
)

    ->showGroups(true)
    ->show();

// Добавляем заказы Пользователя
if ($oSiteuser->id)
{
$oShop = Core_Entity::factory('Shop', 1);
$Shop_Order_Controller_Show = new Shop_Order_Controller_Show($oShop);

$Shop_Order_Controller_Show
    ->xsl(
        Core_Entity::factory('Xsl')->getByName('СписокЗаказовВЛичномКабинетеNewVersion')
    )
    ->limit(15)
    ->parseUrl()
    ->itemsProperties(TRUE)
    ->show();
}

XSL "СписокЗаказовВЛичномКабинетеNewVersion"

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:hostcms="http://www.hostcms.ru/"
    exclude-result-prefixes="hostcms">
    <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="no" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
    
    <xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
    
    <xsl:template match="/">
        <xsl:apply-templates select="shop"/>
    </xsl:template>
    
    <!-- Шаблон для списка заказов -->
    <xsl:template match="shop">
        <div class="lk-my-slider">
        <p><span>Сделайте наш сервис еще лучше </span> <br />Оставьте отзывы о купленных вами товарах</p>
            <div class="row">
                <div class="lk-my-slider__main">
                    <!-- Не показываем доставки и купоны -->
                    <xsl:apply-templates select="shop_order/shop_order_item[shop_item_id !=0 and type !=1]"/> 
                    <div class="clearfix"></div>
                </div>
            </div>
        </div>
    </xsl:template>
    
    <!-- Шаблон для элементов заказа -->
    <xsl:template match="shop_order/shop_order_item">
        <div class="col-xs-6 col-sm-4 col-md-3 col-lg-13 margin-top-20">
            <div class="product-card">
                <div class="product-card__img">
                <xsl:if test="shop_item/image_small !=''"><a href="{shop_item/url}"><img src="{shop_item/dir}{shop_item/image_small}" alt="" class="shop_img"/></a></xsl:if>
                </div>
                <!-- /.proguct-card__img -->
                
                <div class="product-card__descr">
                    <a href="{shop_item/url}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
                </div>
                <!-- /.product-card__descr -->
            </div>
        </div>
    </xsl:template>  
    
    <xsl:template match="shop_currency/code">
        <xsl:param name="value" />
        
        <xsl:variable name="spaced" select="format-number($value, '# ###', 'my')" />
        
        <xsl:choose>
            <xsl:when test=". = 'USD'">$<xsl:value-of select="$spaced"/></xsl:when>
            <xsl:when test=". = 'EUR'">€<xsl:value-of select="$spaced"/></xsl:when>
            <xsl:when test=". = 'GBP'">£<xsl:value-of select="$spaced"/></xsl:when>
        <xsl:when test=". = 'RUR'"><xsl:value-of select="$spaced"/>  <i class="fa fa-ruble"></i></xsl:when>
            <xsl:when test=". = 'AUD'">AU$<xsl:value-of select="$spaced"/></xsl:when>
            <xsl:when test=". = 'CNY'"><xsl:value-of select="$spaced"/>元</xsl:when>
            <xsl:when test=". = 'JPY'"><xsl:value-of select="$spaced"/>¥</xsl:when>
            <xsl:when test=". = 'KRW'"><xsl:value-of select="$spaced"/>₩</xsl:when>
            <xsl:when test=". = 'PHP'"><xsl:value-of select="$spaced"/>₱</xsl:when>
            <xsl:when test=". = 'THB'"><xsl:value-of select="$spaced"/>฿</xsl:when>
            <xsl:when test=". = 'BRL'">R$<xsl:value-of select="$spaced"/></xsl:when>
        <xsl:when test=". = 'INR'"><xsl:value-of select="$spaced"/><i class="fa fa-inr"></i></xsl:when>
        <xsl:when test=". = 'TRY'"><xsl:value-of select="$spaced"/><i class="fa fa-try"></i></xsl:when>
        <xsl:when test=". = 'ILS'"><xsl:value-of select="$spaced"/><i class="fa fa-ils"></i></xsl:when>
            <xsl:otherwise><xsl:value-of select="$spaced"/> <xsl:value-of select="." /></xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    
</xsl:stylesheet>

Добавляем Инфосистему в код Интернет-магазина

В ТДС Интернет-магазина добавляем следующий код, который выведет нам данные из Инфосистемы в XML тег (в данном случае назовём его banners)

PHP

 // ADD ИНФОСИСТЕМА
  ob_start();
  if (Core::moduleIsActive('informationsystem')) {
    $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
      Core_Entity::factory('Informationsystem', 31)  // Здесь указываем ID Инфосистемы
    );
    $Informationsystem_Controller_Show
      ->informationsystemItems()
      ->queryBuilder()
      ->clearOrderBy()
      ->orderBy('datetime', 'DESC');
    $Informationsystem_Controller_Show
      ->xsl(Core_Entity::factory('Xsl')->getByName('БаннерыВИнтернетМагазине')) // Здесь указываем Xsl шаблон для Инфосистемы
      ->groupsMode('none')
      ->itemsForbiddenTags([
        'text',
        'description',
        'seo_description',
        'seo_keywords',
        'seo_title',
      ])
      ->group(false)
      ->itemsPropertiesList(false)
      ->itemsProperties(true)
      ->limit(1)
      // ->votes(TRUE)
      ->cache(false)
      ->show();
  }
  $Shop_Controller_Show->addEntity(
    Core::factory('Core_Xml_Entity')
      ->name('banners')
      ->value(ob_get_clean())
  );
  // END ADD

ДОБАВЛЯЕМ ПРОВЕРКУ НА СРОК РАЗМЕЩЕНИЯ ОБЪЯВЛЕНИЯ В ДОСКАХ ОБЪЯВЛЕНИЙ

Дописываем в ТДС "Доска объявлений"

// СРОК РАЗМЕЩЕНИЯ ОБЪЯВЛЕНИЯ
$iTime = Core_Array::getPost('property_136', 0);
$aTimes = array(1013 => 1, 1015 => 3, 1016 => 6, 1017 => 9);
$iTimeMonth = isset($aTimes[$iTime]) ? $aTimes[$iTime] : 1;
$oShop_Item->end_datetime = date('Y-m-d H:i:s', time() + $iTimeMonth * 30 * 24 * 60 * 60);
//~ END

property_136  - ID дополнительного свойства "Срок размещения"
1013 => 1, 1015 => 3, 1016 => 6, 1017 => 9  - ID элементов списка "Срок размещения" (соответственно 1, 3, 6 и 9 месяцев)

КОМПЛЕКТЫ ТОВАРОВ

В настройки ТДС Корзины добавляем код после блока 
-- // Добавление товара в корзину

/**
* Комплекты
* Начало >>
*/


$aAssoc = Core_Array::getRequest('addassoc');
    if (count($aAssoc))
    {
        foreach($aAssoc as $assoc)
        {
            $oShop_Cart_Controller = Shop_Cart_Controller::instance();
            $oShop_Cart_Controller
                ->shop_item_id($assoc)
                ->quantity(1)
                ->add();
        }
    }


/**
* << Конец
*/
Добавляем в макет Каталога скрипт:
/**
* Обработчик решения set-of-goods
*/
var lastCheck="";$(document).ready(function(){function t(){total=parseInt($("#mainprice").data("price")),$("select.associated option").each(function(){$(this).prop("selected")&&$(this).data("price")&&(total+=parseInt($(this).data("price")))}),$("input.associated").each(function(){$(this).prop("checked")&&(total+=parseInt($(this).data("price")))}),totalStr="",totalStr+=total,total=totalStr.replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1 "),$("#bz_price").val(total),$("#mainprice").html(total)}$("input[type='radio'].associated").click(function(){lastCheck=lastCheck==this?($(this).prop("checked",!$(this).prop("checked")),""):this}),$("input.associated").click(function(){t()}),$("select.associated").change(function(){t()}),$("input[type=radio].associated:checked").click(),t(),$("select.associated option:selected").click(),t(),jQuery.extend({kaddIntoCart:function(t,a,e,c){c=c||0;var i="";return $(".associated"+a).each(function(){$(this).prop("checked")&&$.clientRequest({path:t,data:{add:$(this).data("item"),count:1},callBack:function(){},context:$("#little_cart")})}),$("select.associated option").each(function(){$(this).prop("selected")&&(i+="&addassoc[]="+$(this).data("item"))}),c?$.bootstrapAddIntoCart(t,a+i,e):$.addIntoCart(t,a+i,e),!1}})});


var lastCheck = ""; 
$(document).ready(function() { 
    function t() { 
        total = parseInt($("#mainprice").data("price")), $("select.associated option").each(function() { 
            $(this).prop("selected") && $(this).data("price") && (total += parseInt($(this).data("price"))) 
        }), $("input.associated").each(function() { 
            $(this).prop("checked") && (total += parseInt($(this).data("price"))) 
        }), totalStr = "", totalStr += total, total = totalStr.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1 "), $("#bz_price").val(total), $("#mainprice").html(total) 
    } 
    $("input[type='radio'].associated").click(function() { 
        lastCheck = lastCheck == this ? ($(this).prop("checked", !$(this).prop("checked")), "") : this 
    }), $("input.associated").click(function() { 
        t() 
    }), $("select.associated").change(function() { 
        t() 
    }), $("input[type=radio].associated:checked").click(), t(), $("select.associated option:selected").click(), t(), jQuery.extend({ 
        kaddIntoCart: function(t, a, e, c) { 
            c = c || 0; 
            var i = ""; 
            return $(".associated" + a).each(function() { 
                $(this).prop("checked") && $.clientRequest({ 
                    path: t, 
                    data: { 
                        add: $(this).data("item"), 
                        count: 1 
                    }, 
                    callBack: function() {}, 
                    context: $("#little_cart") 
                }) 
            }), $("select.associated option").each(function() { 
                $(this).prop("selected") && (i += "&addassoc[]=" + $(this).data("item")) 
            }), c ? $.bootstrapAddIntoCart(t, a + i, e) : $.addIntoCart(t, a + i, e), !1 
        } 
    }) 
});

В XSL шаблон "КарточкаТовара" добавляем блок вывода комплектов
<!--
                    *
                    * Комплекты
                    * Начало >>
                    -->
                    <xsl:if test="count(associated/shop_item) &gt; 0">
                        <div class="associated-block gifts-list clearfix">
                        <p class="h5 text-center red bold"><i class="fa fa-gift"></i>  Выберите подарок: </p>
                            
                            <div class="slider-similar-wrapper">
                                <div id="gifts" class="slick-slider">
                                    <xsl:apply-templates select="associated/shop_item" mode="assoc"><xsl:sort select="sorting"  data-type="number"/></xsl:apply-templates>
                                </div>
                            </div>
                            <span class="hr"></span>
                            
                        </div>
                    </xsl:if>
                    
                    <!--
                    * << Конец
                            -->

МАКЕТ "ВЕРСИЯ ДЛЯ ПЕЧАТИ" С АВТОМАТИЧЕСКОЙ ОТПРАВКОЙ НА ПЕЧАТЬ

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
 <head>
      <title><?php Core_Page::instance()->showTitle()?></title>
      <meta name="description" content="<?php Core_Page::instance()->showDescription()?>"></meta>
      <meta name="keywords" content="<?php Core_Page::instance()->showKeywords()?>"></meta>
      <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
      <meta content="text/html; charset=<?php echo SITE_CODING?>" http-equiv="Content-Type"></meta>

      <?php Core_Page::instance()->showCss()?>
      <!-- jQuery -->
      <script type="text/javascript" src="/hostcmsfiles/jquery/jquery.js"></script>

 </head>
 <body>
 <?php Core_Page::instance()->execute()?>

 <script type="text/javascript">
 $(document).ready(function() {
     window.print();
 });
 </script>

 </body>
 </html> 

Меняем название кнопки при добавлении товара в корзину

Идём в Основной макет сайта, во вкладку Javascript, находим фрагмент кода добавления товара в корзину:

// Функции без создания коллекции
$.extend({
...
bootstrapAddIntoCart: function(path, shop_item_id, count){
...

});

Возможно, у вас используется другая функция добавления товара в корзину:

// Функции без создания коллекции
$.extend({
...
AddIntoCart: function(path, shop_item_id, count){
...

});

Добавляем в эту функцию (которая у вас используется), перед закрывающей фигурной скобкой, следующий код:

$('#incart_'+ shop_item_id).removeClass('hidden');
$('#cart_'+ shop_item_id).addClass('hidden');
return false;

Далее находим фрагмент кода:

// Функции без создания коллекции
$.extend({
...
deleteLittleCart: function(path, shop_item_id){
...
},

и добавлем сюда следующий код, перед закрыывающей фигурной скобкой:

	    $('#incart_'+ shop_item_id).addClass('hidden');
	    $('#cart_'+ shop_item_id).removeClass('hidden');

Если вы используете библиотеку Bootstrap 5 и выше, то замените hidden на d-none

Далее идём в XSL-шаблон вывода карточек товара. Это может быть XSL-шаблон МагазинКаталогТоваров, либо отдельный шаблон для карточек и заменяем кнопку "В корзину" на следующие:

<a href="{/shop/url}cart/" id="incart_{@id}" class="incart hidden">
		<xsl:if test="@id = /shop/items_in_cart//shop_item/@id">
			<xsl:attribute name="class">incart</xsl:attribute>
		</xsl:if>
		<span class="icon"><i class="fa fa-shopping-cart"></i></span> <span class="button_caption">Оформить заказ</span>
</a>

<a onclick="return $.bootstrapAddIntoCart('{/shop/url}cart/', {@id}, 1)" data-itemId="{@id}" id="cart_{@id}">
		<xsl:if test="@id = /shop/items_in_cart//shop_item/@id">
			<xsl:attribute name="class">hidden</xsl:attribute>
		</xsl:if>
								<span class="icon"><i class="fa fa-shopping-basket"></i></span> <span class="button_caption">В корзину</span>
</a>

Из кода видно, что делается проверка на наличие товара в корзине и если товар в корзине, то меняется класс у кнопок. Одна скрывается, другая показывается.

Класс hidden можно заменить на d-none, если вы используете библиотеку Bootstrap 5 версии и выше. Чтобы проверка работала, в ТДС "Интернет Магазин" должно быть прописано:

->cart(TRUE)

Теперь у вас, при добавлении товара в корзину, вместо кнопки "В корзину" будет показываться кнопка "Оформить заказ" с ссылкой на корзину

Обновление курса валют

В стандартную поставку входит два источника получения курсов валют:

  1. сайт ЦБ РФ (официальные курсы валют);
  2. сайт www.floatrates.com (актуальные биржевые курсы).

Для обновления курсов валют с сайта ЦБ РФ выберите в меню Обновить курсы валют, затем в подменю выберите источник данных о курсах.

Автоматическое обновление курсов валют через планировщик

В модуле Планировщик добавьте задачу обновления курсов валют, указав Идентификатор сущности название драйвера (cbrf или floatrates):

Автоматическое обновление курсов валют через отдельный вызов файла

Добавьте в cron вызов файла обновления валют cron/update_currency.php, не забудьте указать полный путь к файлу на сервере.

Источники курсов валют

Информация о доступных источниках валют размещается в конфигурационном файле modules/shop/currency/config/config.php

<?php

return array(
	'cbrf' => array(
		'driver' => 'cbrf',
		'name' => 'ЦБ РФ'
	),
	'floatrates' => array(
		'driver' => 'floatrates',
		'name' => 'Exchange Rates for USD'
	)
);

Файлы драйверов для загрузки курсов валют размещены в modules/shop/currency/driver/

PHP . Файл update_currency.php

<?php
/**
 * Обновление валют на текущий день по курсу ЦБ.
 *
 * @package HostCMS 7\cron
 * @version 7.x
 * @author Hostmake LLC
 * @copyright © 2005-2023 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 */
require_once(dirname(__FILE__) . '/../' . 'bootstrap.php');
setlocale(LC_NUMERIC, 'POSIX');
// При увеличении курса ЦБ на 2% установите значение 1.02
$coefficient = 1;
$url = 'http://www.cbr.ru/scripts/XML_daily.asp';
$Core_Http = Core_Http::instance()
->url($url)
->port(80)
->timeout(10)
->userAgent('Mozilla/5.0 (Windows NT 5.1; rv:26.0) Gecko/20100101 Firefox/26.0')
->execute();
$xml = $Core_Http->getDecompressedBody();
$oXml = @simplexml_load_string($xml);
if (is_object($oXml))
{
$fDate = Core_Date::date2sql($oXml->attributes()->Date);
$oDefaultCurrency = Core_Entity::factory('Shop_Currency')->getBydefault(1);
foreach ($oXml->Valute as $Valute)
{
$exchangeRate[strval($Valute->CharCode)] = floatval((str_replace(',', '.', $Valute->Value))) / floatval(str_replace(',', '.', $Valute->Nominal));
}
if ($oDefaultCurrency->code != 'RUB'
&& $oDefaultCurrency->code != 'RUR'
&& !isset($exchangeRate[$oDefaultCurrency->code])
)
{
throw new Exception('Default currency does not exist in the XML');
}
// любая валюта по умолчанию равна 1
$oDefaultCurrency->exchange_rate(1)->date($fDate)->save();
/* Рубль - не всегда валюта по умолчанию, но он всегда отсутствует во входящем XML.
* Итак, если:
валюта по умолчанию НЕ рубль
И рубль присутсвует в списке валют
ставим рублю его котировку, относительно валюты по умолчанию
*/
if ($oDefaultCurrency->code != 'RUB' && $oDefaultCurrency->code != 'RUR')
{
$fRubRate = 1.0 / $exchangeRate[$oDefaultCurrency->code];
$oRubCurrency = Core_Entity::factory('Shop_Currency')->getByCode('RUB');
is_null($oRubCurrency) && $oRubCurrency = Core_Entity::factory('Shop_Currency')->getByCode('RUR');
!is_null($oRubCurrency)
&& $oRubCurrency
->exchange_rate($fRubRate)
->date($fDate)
->save();
}
foreach ($exchangeRate as $code => $rate)
{
$rate *= $coefficient;
// ищем текущую валюту в магазине
$oCurrentCurrency = Core_Entity::factory('Shop_Currency')->getByCode($code);
if(is_null($oCurrentCurrency))
{
// валюта не найдена, пропускаем итерацию
continue;
}
if ($oDefaultCurrency->code == 'RUR' || $oDefaultCurrency->code == 'RUB')
{
$oCurrentCurrency->exchange_rate = $rate;
$oCurrentCurrency->date($fDate);
$oCurrentCurrency->save();
}
elseif (isset($exchangeRate[$oDefaultCurrency->code]))
{
$oCurrentCurrency->exchange_rate = $rate * $fRubRate;
$oCurrentCurrency->date($fDate);
$oCurrentCurrency->save();
}
echo "Updated currency {$code} rate is {$oCurrentCurrency->exchange_rate}\n";
}
}
echo "OK\n";

Округление цен в магазине

Централизованно округлить цены можно установкой формата округления для Shop_Controller. В файл bootstrap.php, в корне, добавьте для округления до десятых:

Shop_Controller::instance()->floatFormat("%.1f");


До целых:

Shop_Controller::instance()->floatFormat("%.0f");


Округление до тысяч, сотен, десятков
Чтобы цена товара в интернет-магазине не была отпугивающей, иногда нужно округлить её до целых десятков. Округление осуществляется с помощью хука на событие

Shop_Item_Controller.onAfterCalculatePrice, вносимого в bootstrap.php
class Shop_Price_Observer
{
    static public function round($price)
    {
        /*
        -3 — до тысяч
        -2 — до сотен
        -1 — до десятков
        */
        return round($price, -3);
    }
   
    static public function onAfterCalculatePrice($object, $args)
    {
        $aPrice = $object->getAPrice();
        $aPrice['price_discount'] = self::round($aPrice['price_discount']);
        $object->setAPrice($aPrice);
    }
}


Core_Event::attach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Price_Observer', 'onAfterCalculatePrice'));

Подменяем Url адрес финальной страницы при оформлении заказа

Добавляем в обработчики платёжных систем следующий код:

echo '<script/>window.history.replaceState(null, null, "https://site.ru/checkout/")</script>';

При завершении заказа адрес страницы заменится с https://site.ru/shop/cart/ на https://site.ru/checkout/

Подробнее про window.history

ПОКАЗАТЬ ВСЕ ТОВАРЫ

В настройках ТДС "Интернет магазин" заменяем
$Shop_Controller_Show
      ->limit($oShop->items_on_page)
      ->parseUrl();
на
$items_on_page = Core_Array::getGet('items_on_page',false);
$items_on_page = ($items_on_page)?$items_on_page:$oShop->items_on_page;
$Shop_Controller_Show
   ->limit($items_on_page)
   ->parseUrl();
Блок пагинации модернизируем:
<xsl:choose>
                     <xsl:when test="total &gt; 0 and limit &gt; 0">
                         
                          <xsl:variable name="count_pages" select="ceiling(total div limit)"/>
                         
                          <xsl:variable name="visible_pages" select="5"/>
                         
                          <xsl:variable name="real_visible_pages"><xsl:choose>
                                    <xsl:when test="$count_pages &lt; $visible_pages"><xsl:value-of select="$count_pages"/></xsl:when>
                                    <xsl:otherwise><xsl:value-of select="$visible_pages"/></xsl:otherwise>
                          </xsl:choose></xsl:variable>
                         
                          <!-- Считаем количество выводимых ссылок перед текущим элементом -->
                          <xsl:variable name="pre_count_page"><xsl:choose>
                                    <xsl:when test="page - (floor($real_visible_pages div 2)) &lt; 0">
                                         <xsl:value-of select="page"/>
                                    </xsl:when>
                                    <xsl:when test="($count_pages - page - 1) &lt; floor($real_visible_pages div 2)">
                                         <xsl:value-of select="$real_visible_pages - ($count_pages - page - 1) - 1"/>
                                    </xsl:when>
                                    <xsl:otherwise>
                                         <xsl:choose>
                                              <xsl:when test="round($real_visible_pages div 2) = $real_visible_pages div 2">
                                                   <xsl:value-of select="floor($real_visible_pages div 2) - 1"/>
                                              </xsl:when>
                                              <xsl:otherwise>
                                                   <xsl:value-of select="floor($real_visible_pages div 2)"/>
                                              </xsl:otherwise>
                                         </xsl:choose>
                                    </xsl:otherwise>
                          </xsl:choose></xsl:variable>
                         
                          <!-- Считаем количество выводимых ссылок после текущего элемента -->
                          <xsl:variable name="post_count_page"><xsl:choose>
                                    <xsl:when test="0 &gt; page - (floor($real_visible_pages div 2) - 1)">
                                         <xsl:value-of select="$real_visible_pages - page - 1"/>
                                    </xsl:when>
                                    <xsl:when test="($count_pages - page - 1) &lt; floor($real_visible_pages div 2)">
                                         <xsl:value-of select="$real_visible_pages - $pre_count_page - 1"/>
                                    </xsl:when>
                                    <xsl:otherwise>
                                         <xsl:value-of select="$real_visible_pages - $pre_count_page - 1"/>
                                    </xsl:otherwise>
                          </xsl:choose></xsl:variable>
                         
                          <xsl:variable name="i"><xsl:choose>
                                    <xsl:when test="page + 1 = $count_pages"><xsl:value-of select="page - $real_visible_pages + 1"/></xsl:when>
                                    <xsl:when test="page - $pre_count_page &gt; 0"><xsl:value-of select="page - $pre_count_page"/></xsl:when>
                                    <xsl:otherwise>0</xsl:otherwise>
                          </xsl:choose></xsl:variable>
                         
                          <p>
                               <xsl:call-template name="for">
                                    <xsl:with-param name="limit" select="limit"/>
                                    <xsl:with-param name="page" select="page"/>
                                    <xsl:with-param name="items_count" select="total"/>
                                    <xsl:with-param name="i" select="$i"/>
                                    <xsl:with-param name="post_count_page" select="$post_count_page"/>
                                    <xsl:with-param name="pre_count_page" select="$pre_count_page"/>
                                    <xsl:with-param name="visible_pages" select="$real_visible_pages"/>
                               </xsl:call-template>                             

                <!-- Кнопка показа всех товаров и возврата к пагинации-->
                 <xsl:choose>
                     <xsl:when test="limit &gt; 30">
                               <a href="./?items_on_page=30" class="button" style="margin-top:-1px;">Показать по 30 товаров</a>
                     </xsl:when>
                                  <xsl:otherwise>
                               <a href="./?items_on_page=999" class="button" style="margin-top:-1px;">Показать все товары</a>
                     </xsl:otherwise>
                </xsl:choose>                       
                              
                          </p>
                          <div style="clear: both"></div>
                  </xsl:when>
                     <xsl:otherwise>
                               <h2>К сожалению, таких товаров сейчас нет</h2>
                </xsl:otherwise>
           </xsl:choose> 

Сообщение при добавлении товара в корзину

1. Код кнопки, которая добавляет товар в корзину:

<button type="button" class="btn" data-item-id="{@id}" onclick="return $.bootstrapAddIntoCart('/shop/cart/', $(this).data('item-id'), 1)" tabindex="0">
        <span>
          <i class="fa fa-shopping-bag"></i>
        </span>
        <span>В корзину</span>
</button>

2. Размещаем в макете код модального окна, которое будет показываться при добавлении товара в корзину:

<div class="modal fade" id="modalCart" tabindex="-1" role="dialog">
     <div class="modal-dialog">
       <div class="modal-content">
          <div class="modal-header"><button class="close" type="button" data-dismiss="modal"></button>
             <h6 class="modal-title" id="myModalLabel">Товар добавлен в корзину</h6>
          </div>
          <div class="modal-body text-center">
                 <a  class="close-reveal-modal btn btn-secondary" data-dismiss="modal">Продолжить покупки</a>
                <a href="/shop/cart/" class="btn btn-primary" >Перейти в корзину</a> 
         </div>
     </div>
  </div>
</div>

3. В макете шаблона во вкладке Javascript дорабатываем скрипт. Находим блок:

// Функции без создания коллекции
$.extend({
...	
     bootstrapAddIntoCartCallback: function(data, status, jqXHR)
	{
		$.loadingScreen('hide');
		$(this).html(data);
	},
...

и добавляем код, который активизирует модальное окно с сообщением. Получится так:

// Функции без создания коллекции
$.extend({
...	
	bootstrapAddIntoCartCallback: function(data, status, jqXHR)
	{
		$.loadingScreen('hide');
		$(this).html(data);
		
		$("body").append(data.html);   // Перемещаем модальное окно по DOM в конец body
		$("#modalCart").modal("show"); // активируем модальное окно
	},
...

Сортировка товаров со скидкой

1. Открываем Типовую динамическую страницу "Интернет-магазин".
2. Открываем вкладку Код страницы.
3. После строки
$Shop_Controller_Show->addCacheSignature('sorting=' . $sorting);
вставляем код:
        if(intval(Core_Array::getGet('filter')) && intval(Core_Array::getGet('is_sale'))) {
          $current_date = date('Y-m-d H:i:s');
        $Shop_Controller_Show->shopItems()
           ->queryBuilder()
        ->join('shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id')
            ->join('shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id', array(
                array('AND (' => array('shop_discounts.end_datetime', '>=', $current_date)),
                array('OR' => array('shop_discounts.end_datetime', '=', '0000-00-00 00:00:00')),
               array('AND' => array('shop_discounts.start_datetime', '<=', $current_date)),
             array(')' => NULL)
              ));
        }
Для вывода товаров со скидкой в url пишем: https: //site.ru /shop /?filter=1&is_sale=1

Ссылка на предыдущий и следующий товар в интернет-магазине

в ТДС интернет-магазина перед показом вставляем:
// добавляем окружающие элементы
// Если мы находимся на странице товара
if ($Shop_Controller_Show->item) {
   $oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item);

   // Текущий элемент
   $cur_elem = $Shop_Controller_Show->item;
   // Текущая группа
   $cur_group = $oShop_Item->shop_group_id;
   // SELECT * FROM shop_items WHERE shop_items.id < $cur_elem ORDER BY shop_items.id DESC LIMIT 1
   $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
      ->select('shop_items.path','shop_items.name')
      ->from('shop_items')
      ->open()
      ->where('shop_items.id', '<', $cur_elem)
      ->setAnd()
      ->where('shop_items.shop_group_id', '=', $cur_group)
      ->setAnd()
      ->where('shop_items.deleted', '=', '0')
      ->close()
      ->clearOrderBy()
      ->orderBy('id', 'DESC')
      ->limit(1);
      $prev = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
      $prev = $prev['path'];
      $prev_name = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
      $prev_name = $prev_name['name'];
   // SELECT * FROM shop_items WHERE shop_items.id > $cur_elem ORDER BY shop_items.id LIMIT 1
   $oCore_QueryBuilder_Select = Core_QueryBuilder::select()
      ->select('shop_items.path','shop_items.name')
      ->from('shop_items')
      ->open()
      ->where('shop_items.id', '>', $cur_elem)
      ->setAnd()
      ->where('shop_items.shop_group_id', '=', $cur_group)
      ->setAnd()
      ->where('shop_items.deleted', '=', '0')
      ->close()
      ->clearOrderBy()
      ->orderBy('id')
      ->limit(1);
      $next = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
      $next = $next ['path'];
      $next_name = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
      $next_name = $next_name['name'];
   $Shop_Controller_Show
      ->addEntity(Core::factory('Core_Xml_Entity')
      ->name('neighboring_items')
         ->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item')->value($prev))
         ->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item_name')->value($prev_name))
         ->addEntity(Core::factory('Core_Xml_Entity')->name('next_item')->value($next))
         ->addEntity(Core::factory('Core_Xml_Entity')->name('next_item_name')->value($next_name))
      );
}
// добавляем окружающие элементы
в XSL товара добавляем:
<!-- Получаем ID родительской группы и записываем в переменную $group -->
      <xsl:variable name="group" select="/shop/group"/>

добавляем:
<!-- окружающие элементы -->
      <xsl:variable name="path">
         <xsl:choose>
            <xsl:when test="/shop//shop_group[@id=$group]/node()"><xsl:value-of select="/shop//shop_group[@id=$group]/url"/></xsl:when>
            <xsl:otherwise><xsl:value-of select="/shop/url"/></xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      <xsl:variable name="link_path" select="/shop//shop_group[@id=$group]/url"/>
      <xsl:variable name="prev_item" select="/shop/neighboring_items/prev_item"/>
      <xsl:variable name="next_item" select="/shop/neighboring_items/next_item"/>
      <xsl:variable name="prev_item_name" select="/shop/neighboring_items/prev_item_name"/>
      <xsl:variable name="next_item_name" select="/shop/neighboring_items/next_item_name"/>
      <div class="navigator">
         <xsl:choose>
            <xsl:when test="$prev_item != ''">
               <a href="{$link_path}{$prev_item}/">&#60; Предыдущий товар (<xsl:value-of select="$prev_item_name" />)</a>
            </xsl:when>
            <xsl:otherwise>
               <span class="previous">&#60; Предыдущий товар</span>
            </xsl:otherwise>
         </xsl:choose>
         <xsl:choose>
            <xsl:when test="$next_item != ''">
               <a href="{$link_path}{$next_item}/">(<xsl:value-of select="$next_item_name" />) Следующий товар &#62;</a>
            </xsl:when>
            <xsl:otherwise>
               <span class="next">Следующий товар &#62;</span>
            </xsl:otherwise>
         </xsl:choose>
      </div>
      <!-- /окружающие элементы -->

СТРАНИЦА КОНТАКТЫ С МИКРОРАЗМЕТКОЙ

Готовый блок для адреса с микроразметкой
<div class="vcard">
<div class="fn org">ООО "Фирма"</div>
<div class="adr">
   <span class="type">Адрес:</span>
   <span class="locality">г. Москва</span>, 
   <span class="street-address">ул. Королева, д. 122,</span>,
   <span class="country-name">Россия</span>, 
   <span class="postal-code">100105</span>
</div>
<div class="tel">
   <span class="type">Телефон:</span>
   <span class="value">+7 (727) 231-01-01</span>
</div>
<div>
   <span class="type">E-mail:</span> 
   <span class="email">info@site.qrg</span>
</div>
</div>

<div class="vcard clearfix">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="h6 fn org">ООО <span>БАХЧА</div>
<p>ИНН 5001571097017</p>
<p>ОГРН 116500410522292</p>
<p>Расчётный счёт 4070281050075000020204</p>
<p>В АО "РайффайзенБанке" Корр.счёт 3010181020000460000700</p>
<p> БИК 044525700</p>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
<div class="h6"><i class="fa fa-phone padding-right-10"></i> Телефон:</div>
<div><span class="tel">+7 (928) 000-0000</span></div>
<div>ежедневно с 9:00 до 21:00</div>
<div class="h6"><i class="fa fa-envelope-o padding-right-10"></i>Электронная почта:</div>
<div><span class="email">info@site.ru</span></div>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
<div class="h6"><i class="fa fa-globe padding-right-10"></i> Наш&nbsp;адрес:</div>
<div class="adr"><span class="postal-code">143912</span>, <span class="locality">г. Бахчисарай</span>, <span class="street-address">ул. Флёрова, д. 4А</span></div>
<p class="padding-top-40">Перед визитом настоятельно просим Вас&nbsp;связаться с&nbsp;нами по&nbsp;телефону.</p>
</div>
</div>

<div itemscope itemtype="http://schema.org/Organization">
  <span itemprop="name">Название организации</span>
  Контакты:
  <div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
    Адрес:
    <span itemprop="streetAddress">Лубянка, 4</span>
    <span itemprop="postalCode"> 001122</span>
    <span itemprop="addressLocality">Москва</span>,
  </div>
  Телефон:<span itemprop="telephone">+7 495 000–00–00</span>,
  Факс:<span itemprop="faxNumber">+7 495 000–00–00</span>,
  Электронная почта: <span itemprop="email">email@organizacii.ru</span></div>

Текущая дата в Каталоге товаров

В XSL шаблон к xsl:stylesheet добавляем новые атрибуты xmlns:date="http://exslt.org/dates-and-times" и extension-element-prefixes="date", должно получится:

<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:hostcms="http://www.hostcms.ru/"
	exclude-result-prefixes="hostcms"
	xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date">

Далее например можно записать в переменную текущую дату и вычислить разницу с другой датой с помощью date:difference(string, string).



Чтобы код работал, в настройках магазина меняем формат даты на %Y-%m-%d

в ТДС записываем текущую дату 

$oCurrent_date = date('dmY'); // именно в этом формате
$Shop_Controller_Show
    ->addEntity(Core::factory('Core_Xml_Entity')->name('сurrent_date')->value($oCurrent_date)); // теперь в XML есть сurrent_date
В XSL шаблоне (в том месте где это нужно):

Теперь, если дата создания товара меньше 30 дней, выводим слово НОВИНКА

  <xsl:variable name="current_date" select="/shop/current_date"/>
            <xsl:variable name="difference_date" select="date:difference($current_date,datetime)" />
            <xsl:variable name="difference_date_cut" select="substring-before(substring-after($difference_date, 'P'), 'D')" />
            <xsl:if test="number($difference_date_cut) &lt; 30"> <!-- 30 количество дней -->
               <div class="ribbon-wrapper-new">
                  <div class="ribbon-round-new bg-color3">НОВИНКА</div>
               </div>
            </xsl:if>

XSL

Товары со скидками

1. Создаём Типовую динамическую страницу "СКИДКИ" (код ниже).
В параметрах ТДС создаём два параметра "XSL" (xsl) и "Интернет-магазин" (shop_id) .
Для параметра "Интернет-магазин" в поле SQL-запрос прописываем
SELECT id, name FROM shops WHERE site_id = {SITE_ID} AND deleted = 0
2. Создаём XSL-шаблон "Скидки" (код ниже)
3. Создаём узел структуры "Товары со скидками" с url sale, вложенный в узел "Интернет-магазин" (например, shop).
Подключаем наш ТДС "СКИДКИ", выбираем Интернет-магазин и созданный XSL-шаблон "Скидки", подключаем макет. Сохраняем.
В итоге по адресу /shop/sale/ будут выводиться товары со скидками

PHP

// ТДС  "Скидки" 
<?php
$aLibParams = Core_Page::instance()->libParams;
$sXslItemName  = Core_Array::get($aLibParams, 'xsl');
$ShopControllerShow = Core_Page::instance()->object;
$ShopControllerShow
    ->itemsProperties(FALSE)
    ->itemsPropertiesList(FALSE)
    ->group(FALSE)
    ->xsl($sXslItemName)
    ->tags(FALSE)
    ->viewed(FALSE)
    ->show();
// ТДС  "Скидки" - Код настроек
<?php
$aLibParams = Core_Page::instance()->libParams;
$iShopId  = Core_Array::get($aLibParams, 'shop-id');
$ShopControllerShow = new Shop_Controller_Show(
    Core_Entity::factory('Shop', $iShopId)
);
$sPattern = rawurldecode(Core_Str::rtrimUri($ShopControllerShow->getEntity()->Structure->getPath())) . '/sale/' . '(page-{page}/)';
$aPatternExpressions = array(
    'page' => '\d+',
);
$Core_Router_Route = new Core_Router_Route($sPattern, $aPatternExpressions);
$matches = $Core_Router_Route->applyPattern(Core::$url['path']);
$page = 0;
if (isset($matches['page']) && is_numeric($matches['page']))
{
    if ($matches['page'] > 1)
    {
        $page = $matches['page'] - 1;
    }
}
$ShopControllerShow->addEntity(
    Core::factory('Core_Xml_Entity')->name('current_sale_page')->value($page)
);

$ShopControllerShow->limit($ShopControllerShow->getEntity()->items_on_page);
$ShopControllerShow->limit(9999);
$ShopControllerShow
    ->shopItems()
    ->queryBuilder()
    ->join('shop_item_discounts', 'shop_item_discounts.shop_item_id', '=', 'shop_items.id')
    ->join('shop_discounts', 'shop_discounts.id', '=', 'shop_item_discounts.shop_discount_id')
    ->where('shop_discounts.active', '=', 1)
    ->where('shop_discounts.start_datetime', '<', Core_Date::timestamp2sql(time()))
    ->where('shop_discounts.end_datetime', '>', Core_Date::timestamp2sql(time()))
    ->where('shop_discounts.deleted', '=', 0)
    ->where('shop_items.modification_id', '=', 0)
    ->groupBy('shop_items.id')
    ->clearOrderBy()
    ->orderBy('RAND()')
 //   ->where('shortcut_id', '=', 0) проверить
    ;
$ShopControllerShow
    ->group(FALSE)
    ->groupsMode('none')
    ->favorite(FALSE);
Core_Page::instance()->object = $ShopControllerShow;

XSL

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- МагазинКаталогТоваровНаГлавнойСпецПред -->
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
<xsl:template match="/">
<xsl:apply-templates select="/shop"/>
</xsl:template>
<xsl:template match="/shop">
<!-- Есть товары -->
<xsl:if test="shop_item">
<p class="h1 red">Товары со скидкой</p>
<div class="shop_block">
<div class="shop_table">
<!-- Выводим товары магазина -->
<xsl:apply-templates select="shop_item" />
</div>
</div>
</xsl:if>
</xsl:template>
<!-- Шаблон для товара -->
<xsl:template match="shop_item">
<div class="shop_item">
<div class="shop_table_item">
<div class="image_row">
<div class="image_cell">
<a href="{url}">
<xsl:choose>
<xsl:when test="image_small != ''">
<img src="{dir}{image_small}" alt="{name}" title="{name}"/>
</xsl:when>
<xsl:otherwise>
<img src="/images/no-image.png" alt="{name}" title="{name}"/>
</xsl:otherwise>
</xsl:choose>
</a>
<div class="hit">Хит</div>
</div>
</div>
<div class="description_row">
<div class="description_sell">
<p>
<a href="{url}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="shop_item">
<xsl:value-of select="name"/>
</a>
</p>
<div class="price">
<xsl:value-of select="format-number(price, '### ##0,00', 'my')"/><xsl:text> </xsl:text><xsl:value-of disable-output-escaping="yes" select="currency"/><xsl:text> </xsl:text>
<!-- Ссылку на добавление в корзины выводим, если:
type = 0 - простой тип товара
type = 1 - электронный товар, при этом остаток на складе больше 0 или -1,
что означает неограниченное количество -->
<xsl:if test="type = 0 or (type = 1 and (digitals > 0 or digitals = -1))">
<a href="{/shop/url}cart/?add={@id}" onclick="return $.addIntoCart('{/shop/url}cart/', {@id}, 1)">
<img src="/images/add_to_cart.gif" alt="Добавить в корзину" title="Добавить в корзину" />
</a>
</xsl:if>
<!-- Сравнение товаров -->
<xsl:variable name="shop_item_id" select="@id" />
<div class="compare" onclick="return $.addCompare('{/shop/url}', {@id}, this)">
<xsl:if test="/shop/comparing/shop_item[@id = $shop_item_id]/node()">
<xsl:attribute name="class">compare current</xsl:attribute>
</xsl:if>
</div>
<!-- Избранное -->
<div class="favorite" onclick="return $.addFavorite('{/shop/url}', {@id}, this)">
<xsl:if test="/shop/favorite/shop_item[@id = $shop_item_id]/node()">
<xsl:attribute name="class">favorite favorite_current</xsl:attribute>
</xsl:if>
</div>
</div>
</div>
</div>
</div>
</div>
</xsl:template>
</xsl:stylesheet>

Увеличить время хранения избранных товаров

Товары в Избранном стали очень мало времени храниться, иногда через 1-2 часа исчезают. Что делать?
Увеличить время жизни сессии в настройках ТДС магазина:
Core_Session::setMaxLifeTime(86400 * 30);




// Избранное
if (Core_Array::getRequest('favorite'))
{
$shop_item_id = intval(Core_Array::getRequest('favorite'));


if (Core_Entity::factory('Shop_Item', $shop_item_id)->shop_id == $oShop->id)
{
Core_Session::start();
if (isset($_SESSION['hostcmsFavorite'][$oShop->id]) && in_array($shop_item_id, $_SESSION['hostcmsFavorite'][$oShop->id]))
{
unset($_SESSION['hostcmsFavorite'][$oShop->id][
array_search($shop_item_id, $_SESSION['hostcmsFavorite'][$oShop->id])
]);
}
else
{
$_SESSION['hostcmsFavorite'][$oShop->id][] = $shop_item_id;
}
}