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 макета для Товара или Инфоэлемента

PHP КОДЫ вывода данных для ИНФОСИСТЕМ

Снижаем нагрузку за счёт оптимизации обращений к базе данных
    
                        ->groupsMode('none')
                        ->itemsForbiddenTags(
                                array(
                                'description',
                                'text',
                                'guid',
                                'ip',
                                'seo_description',
                                'seo_keywords',
                                'seo_title',
                                'comment',
                                'image_large_width', 
                                'image_large_height',
                                'image_large',
                                'datetime', 
                                'start_datetime', 
                                'end_datetime', 
                                'adult', 
                                'cpa', 
                                'showed', 
                                'indexing',
                                'comments_count',
                                'comments_grade_sum',
                                'comments_grade_count',
                                'comments_average_grade',
                               ))
                        ->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',
                                'siteuser_id',
                                'items_count',
                                'items_total_count',
                                'image_large',           
                                'image_large_width',
                                'image_large_height',
                                'image_small_width',
                                'image_small_height',
                                'siteuser_group_id',               
                                'indexing',
                                'subgroups_count',
                                'subgroups_total_count'
                            ))
                        ->groupsProperties(FALSE)
                        ->groupsPropertiesList(FALSE)
                        ->itemsProperties(FALSE)
                        ->itemsPropertiesList(FALSE)
                        ->siteuser(FALSE)
                        ->siteuserProperties(FALSE)
                        ->tags(FALSE)
                        ->votes(FALSE)
                        //->cache(FALSE) 
                        ->comments(FALSE)
                        ->commentsRating(TRUE)
Меняем ID макета для инфоэлемента
if (isset($Informationsystem_Controller_Show->item) && $Informationsystem_Controller_Show->item)
{
	Core_Page::instance()->template(
		Core_Entity::factory('Template', 35)
	);
}
Меню инфосистемы
 <?php
     // Меню из инфосистемы
    $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
    Core_Entity::factory('Informationsystem', 15)
     );
     $Informationsystem_Controller_Show
    ->xsl(
       Core_Entity::factory('Xsl')->getByName('МенюИнфосистемы')
    )

    ->group(FALSE)
    ->limit(15)
    ->show();
    ?>

     <?php
     // МЕНЮ ИНФОСИСТЕМЫ
     if (Core::moduleIsActive('informationsystem'))
     {
     $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
      Core_Entity::factory('Informationsystem', 1)
      );

      $Informationsystem_Controller_Show
      ->xsl(
         Core_Entity::factory('Xsl')->getByName('ДеревоНовостей')
      )
      ->groupsMode('all')
      ->itemsForbiddenTags(array('text', 'description'))
      ->group(FALSE)
      ->limit(0)
      ->show();
      }
      ?>
Вывод статей или новостей
  <?php
          // Новости
          if (Core::moduleIsActive('informationsystem'))
          {
               $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
                    Core_Entity::factory('Informationsystem', 27)
               );
               $Informationsystem_Controller_Show
                    ->xsl(
                         Core_Entity::factory('Xsl')->getByName('СписокНовостейНаГлавной')
                    )
                    ->groupsMode('none')
                    ->itemsForbiddenTags(array('text'))
                    ->group(FALSE)
                    ->limit(2)
                    ->show();
          }
     ?>
Случайный вывод новостей из группы
<?php
          // Новости
          if (Core::moduleIsActive('informationsystem'))
          {
               $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
                    Core_Entity::factory('Informationsystem', 1)
               );

               $Informationsystem_Controller_Show
                    ->informationsystemItems()
                    ->queryBuilder()
                    ->clearOrderBy()
                    ->orderBy('RAND()');

               $Informationsystem_Controller_Show
                    ->xsl(
                         Core_Entity::factory('Xsl')->getByName('СписокУслугНаГлавной')
                    )
                    ->groupsMode('none')
                    ->itemsForbiddenTags(array('text'))
                    ->group(14)
                    ->limit(2)
                    ->show();
          }
    ?>
Вывод новостей с ссылкой на архив
<?php
     // НОВОСТИ
      if (Core::moduleIsActive('informationsystem'))
     {
     $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
          Core_Entity::factory('Informationsystem', '15')
     );

     $Informationsystem_Controller_Show
          ->xsl(
               Core_Entity::factory('Xsl')->getByName('НовостиНаГлавной')
          )
          ->groupsMode('none')
          ->itemsForbiddenTags(array('text'))
          ->group(FALSE)
          ->limit(2)
          ->addEntity(Core::factory('Core_Xml_Entity')
               ->name('НовостиНаГлавной')
               ->value(1))
          ->addEntity(Core::factory('Core_Xml_Entity')
               ->name('ОтображатьСсылкуНаАрхив')
               ->value(1))
          ->show();
}
?>
Вывод одной новости по ее id
<?php
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
   Core_Entity::factory('Informationsystem', 1)
);

$Informationsystem_Controller_Show
   ->xsl(
      Core_Entity::factory('Xsl')->getByName('Новость')
   )
   ->item(123)
   ->show();
?>
Вывод элементов инфосистемы по id дополнительного свойства
<?php

  // Новости
      $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
         Core_Entity::factory('Informationsystem', 1)
      );
      $Informationsystem_Controller_Show
         ->xsl(
            Core_Entity::factory('Xsl')->getByName('СписокНовостейНаГлавной')
         )
         ->groupsMode('none')
         ->itemsForbiddenTags(array('text'))
         ->itemsProperties(TRUE)
         ->group(FALSE)
         ->limit(3);

      // Объединение с нужной таблицей свойств
      $Informationsystem_Controller_Show
         ->informationsystemItems()
         ->queryBuilder()
         ->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')
         ->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id',
            array(
               array('AND' => array('informationsystem_item_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
         )
         // Идентификатор дополнительного свойства
         ->where('informationsystem_item_properties.property_id', '=', 19)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', '123')
         ->groupBy('informationsystem_items.id')
         // Количество свойств
         ->having('COUNT(informationsystem_item_properties.informationsystem_id)', '=', 1);

         $Informationsystem_Controller_Show->show();
?>
Вывод групп инфосистемы по id дополнительного свойства
<?php

  // ГРУППЫ
      $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
         Core_Entity::factory('Informationsystem', 16)
      );
      $Informationsystem_Controller_Show
         ->xsl(
            Core_Entity::factory('Xsl')->getByName('СписокСтатейСайт4')
         )
         ->groupsMode('none')
         ->itemsForbiddenTags(array('text'))
         ->group(TRUE)
         ->groupsProperties(TRUE)
         ->limit(3)
         //->show()
         ;

      // Объединение с нужной таблицей свойств
      $Informationsystem_Controller_Show
         ->informationsystemGroups()
         ->queryBuilder()
         ->leftJoin('informationsystem_group_properties', 'informationsystem_groups.informationsystem_id', '=', 'informationsystem_group_properties.informationsystem_id')
         ->leftJoin('property_value_ints', 'informationsystem_groups.id', '=', 'property_value_ints.entity_id',
            array(
               array('AND' => array('informationsystem_group_properties.property_id', '=', Core_QueryBuilder::expression('`property_value_ints`.`property_id`')))
            )
         )
         // Идентификатор дополнительного свойства
         ->where('informationsystem_group_properties.property_id', '=', 19)
         // Значание дополнительного свойства
         ->where('property_value_ints.value', '=', '123')
         ->groupBy('informationsystem_groups.id')
         // Количество свойств
         ->having('COUNT(informationsystem_group_properties.informationsystem_id)', '=', 1);

         $Informationsystem_Controller_Show->show();
    ?>
Случайный вывод элементов Инфосистемы
<?php
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
            Core_Entity::factory('Informationsystem', 20)
         );
         $Informationsystem_Controller_Show
->xsl(Core_Entity::factory('Xsl')->getByName('СписокХитовНаГлавной'))
->groupsMode('none')
->itemsForbiddenTags(array('text'))
->group(FALSE)
->limit(3)
->itemsProperties(TRUE);

$Informationsystem_Controller_Show
->informationsystemItems()
->queryBuilder()
->clearOrderBy()
->orderBy('RAND()');
$Informationsystem_Controller_Show->show();
  ?>
Вывод меток Инфосистемы
<?php
   // Метки
          if (Core::moduleIsActive('informationsystem'))
          {
               $Informationsystem_Controller_Tag_Show = new Informationsystem_Controller_Tag_Show(
                    Core_Entity::factory('Informationsystem', 1)
               );
               $Informationsystem_Controller_Tag_Show
                    ->xsl(
                         Core_Entity::factory('Xsl')->getByName('ОблакоТэговИнформационнойСистемы')
                    )
                    ->show();
          }
        ?>
Вывод элементов конкретной группы
<?php

$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
    Core_Entity::factory('Informationsystem', 8)
);

$Informationsystem_Controller_Show
    ->xsl(
        Core_Entity::factory('Xsl')->getByName('СписокЭлементовИнфосистемы')
    )
    ->limit(50)
    ->group(34)
    ->show();
?>
Популярные информационные элементы за месяц
<h3>Популярные</h3>
<?php
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
   Core_Entity::factory('Informationsystem', 1)
);
$Informationsystem_Controller_Show
   ->xsl(
      Core_Entity::factory('Xsl')->getByName('ВыводПопулярныхФотоНаГлавной')
   )
   ->groupsMode('none')
simi
   ->itemsForbiddenTags(array('text'))
   ->group(FALSE)
   ->limit(10);

 $Informationsystem_Controller_Show
   ->informationsystemItems()
   ->queryBuilder()
   ->where('informationsystem_items.active', '=', 1)
   ->where('informationsystem_items.datetime', '>', Core_Date::timestamp2sql(strtotime("-30 day")))
   ->clearOrderBy()
   ->orderBy('informationsystem_items.showed', 'DESC');

$Informationsystem_Controller_Show->show();
?>
Вывод нескольких схожих инфоэлементов. Код добавляем в ТДС инфосистемы
$oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', $Informationsystem_Controller_Show->item);
$oTag_Informationsystem_Items = $oInformationsystem_Item->Tag_Informationsystem_Items->findAll();
// Минимальное количество тегов для совпадения.
$iSameTags = 1;
$aTagIds = array();
foreach($oTag_Informationsystem_Items as $oTag_Informationsystem_Item)
{
   $aTagIds[] = $oTag_Informationsystem_Item->tag_id;
}
if (count($aTagIds))
{
   $oSameTag_Informationsystem_Items = Core_Entity::factory('Tag_Informationsystem_Item');
   $oSameTag_Informationsystem_Items->queryBuilder()
      ->select('tag_informationsystem_items.*')
      ->where('tag_id', 'IN', $aTagIds)
      ->where('tag_informationsystem_items.informationsystem_item_id', '!=', $oInformationsystem_Item->id)
      ->join('informationsystem_items', 'tag_informationsystem_items.informationsystem_item_id', '=', 'informationsystem_items.id')
      ->join('informationsystems', 'informationsystem_items.informationsystem_id', '=', 'informationsystems.id')
      ->where('informationsystems.site_id', '=', CURRENT_SITE)
      ->groupBy('informationsystem_items.id')
      ->having('COUNT(tag_id)', '>=', $iSameTags)
      ->clearOrderBy()
      ->orderBy('RAND()')
      ->limit(4);
   $aSameTag_Informationsystem_Items = $oSameTag_Informationsystem_Items->findAll();
   $oXmlSamenews = Core::factory('Core_Xml_Entity')->name('samenews');
   $Informationsystem_Controller_Show->addEntity($oXmlSamenews);
   foreach($aSameTag_Informationsystem_Items as $oSameTag_Informationsystem_Item)
   {
      $oXmlSamenews->addEntity(
         $oSameTag_Informationsystem_Item->Informationsystem_Item->clearEntities()
         ->showXmlProperties(TRUE) // Добавляем дополнительные свойства в похожие товары
      );
   }
}


<!--==Этот код добавляем в XSL-шаблон вывода единицы Инфосистемы==-->
  <xsl:if test="count(samenews) >0">
            <div class="samenews"><p class="h4">Статьи по теме</p>
                <div class="row"><xsl:apply-templates select="//samenews/informationsystem_item[@id]" mode="samenews"
/></div>
            </div>
   </xsl:if>


<!--=== Шаблон для схожих статей ===-->
<xsl:template match="//samenews/informationsystem_item" mode="samenews"
>
    <xsl:if test="@id !=''">
        <div class="col-12"><a href="{url}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
        <xsl:value-of disable-output-escaping="yes" select="description"/>  
        </div>
    </xsl:if>
</xsl:template>
ВЫВОД ОПРЕДЕЛЕННЫХ ЭЛЕМЕНТОВ ИНФОСИСТЕМЫ
<?php
if (Core::moduleIsActive('informationsystem')) {
    $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(Core_Entity::factory('Informationsystem', 17)); // Идентификатор информационной системы
    $Informationsystem_Controller_Show->xsl(Core_Entity::factory('Xsl')->getByName('ЭлементыНаГлавной'))->groupsMode('none')->itemsForbiddenTags(array( // Название XSL шаблона
        'text'
    ))->group(FALSE)->limit(18); // Ограничение на кол-во элементов
    
    $Informationsystem_Controller_Show->informationsystemItems()->queryBuilder()->leftJoin('informationsystem_item_properties', 'informationsystem_items.informationsystem_id', '=', 'informationsystem_item_properties.informationsystem_id')->leftJoin('property_value_ints', 'informationsystem_items.id', '=', 'property_value_ints.entity_id', array(
        array(
            'AND' => array(
                'informationsystem_item_properties.property_id',
                '=',
                Core_QueryBuilder::expression('`property_value_ints`.`property_id`')
            )
        )
    ))
    
        ->where('informationsystem_item_properties.property_id', '=', 77) // Идентификатор дополнительного свойства
    
        ->where('property_value_ints.value', '=', '1'); // Значание дополнительного свойства
    $Informationsystem_Controller_Show->show();  
}
?>
Выбор инфоэлементов из подгрупп независимо от уровня вложенности. Код добавляем в ТДС Инфосистемы
class My_Informationsystem_Controller_Show extends Informationsystem_Controller_Show 
{ 
   protected function _groupCondition() 
   { 
      $oInformationsystem = $this->getEntity(); 
   
      if ($this->group) 
      { 
         // если ID группы не 0, т.е. не корневая группа 
         // получаем подгруппы 
         $aSubGroupsID = $this->fillInformationsystemGroup($oInformationsystem->id, $this->group); // добавляем текущую группу в массив 
         $aSubGroupsID[] = $this->group; 
         $this->informationsystemItems() 
            ->queryBuilder() 
            ->where('informationsystem_items.informationsystem_group_id', 'IN', $aSubGroupsID); // получаем все товары из подгрупп 
      } 
      else 
      { 
         $this->informationsystemItems() 
            ->queryBuilder() 
            ->where('informationsystem_items.informationsystem_group_id', 'NOT IN', Core_QueryBuilder::select('id')->from('informationsystem_groups')->where('informationsystem_id', '=', $oInformationsystem->id)->where('active', '=', 0)); 
      } 
      return $this; 
   } 
   protected $_aGroupTree = array(); 
   public function fillInformationsystemGroup($iInformationsystemId, $iInformationsystemGroupParentId = 0, $iLevel = 0) 
   { 
      $iInformationsystemId = intval($iInformationsystemId); 
      $iInformationsystemGroupParentId = intval($iInformationsystemGroupParentId); 
      $iLevel = intval($iLevel); 
      if ($iLevel == 0) 
      { 
         $aTmp = Core_QueryBuilder::select('id', 'parent_id') 
            ->from('informationsystem_groups') 
            ->where('informationsystem_id', '=', $iInformationsystemId) 
            ->where('deleted', '=', 0) 
            ->execute()->asAssoc()->result(); 
         foreach ($aTmp as $aGroup) 
         { 
            $this->_aGroupTree[$aGroup['parent_id']][] = $aGroup; 
         } 
      } 
      $aReturn = array(); 
      if (isset($this->_aGroupTree[$iInformationsystemGroupParentId])) 
      { 
         foreach ($this->_aGroupTree[$iInformationsystemGroupParentId] as $childrenGroup) 
         { 
            $aReturn[] = $childrenGroup['id']; 
            $aReturn = array_merge($aReturn, $this->fillInformationsystemGroup($iInformationsystemId, $childrenGroup['id'], $iLevel + 1)); 
         } 
      } 
      $iLevel == 0 && $this->_aGroupTree = array(); 
      return $aReturn; 
   } 
} 
$Informationsystem_Controller_Show = new My_Informationsystem_Controller_Show($oInformationsystem);
Меняем в ТДС макет для страницы с инфоэлементом
Core_Page::instance()->template(Core_Entity::factory('Template', 54)); // указываем id макета для Инфоэлемента

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

PHP КОДЫ вывода данных для Структуры

Код который пригодится при построении и выводе структуры сайта
->showInformationsystemGroups(TRUE)
->showInformationsystemItems(TRUE)
->showShopGroups(TRUE)
->showShopItems(TRUE)
 $Structure_Controller_Show->showProperties(TRUE);

Вывод шаблона страницы

<?php
Core_Page::instance()->execute();
?>

Вывод статичного документа на страницу

<?php
Core_Entity::factory('Document', 22)->Document_Versions->getCurrent()->execute();
?>

Вывод текста из статичного документа

<?php
echo Core_Entity::factory('Document', 13)->Document_Versions->getCurrent()->loadFile();
?>

Вывод Меню

<?php
// Меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show
->xsl(Core_Entity::factory('Xsl')
->getByName('ВерхнееМенюСайт2'))
->forbiddenTags(array(
'priority',
'changefreq',
'seo_keywords',
'seo_description',
'seo_title',
'parent_id',
'lib_id',
'document_id',
'data_template_id'
))
->menu(3)
->level(0) // Только родительские узлы, закомментировать, если нужны вложенные узлы
->show();
?>

Вывод Меню - выводим разделы инфосистем и магазина, ограничиваем вложенность уровней (3)

<?php
// ГлавноеМеню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
->getByName('ВерхнееМеню'))
->showInformationsystemGroups(TRUE)
->showInformationsystemItems(TRUE)
->showShopGroups(TRUE)
->addEntity(Core::factory('Core_Xml_Entity')
->name('max_level')
->value(3)
)
->menu(3)
->show();
?>

Показ в меню групп и элементов инфосистемы

   
   <?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));

$Structure_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')
)

->menu(1)
// Показывать группы информационных систем в
->showInformationsystemGroups(TRUE)
// Показывать элементы информационных систем
->showInformationsystemItems(TRUE)
->show();
?>

При выводе в структуре Инфоэлементов, не выводим Элементы определенной Инфосистемы

<?php
// Левое меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show->showProperties(TRUE);
$Structure_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName('ЛевоеМенюСайт2')
)
->menu(4)
->showInformationsystemGroups(TRUE)
->showInformationsystemItems(TRUE)
->showShopGroups(TRUE);

class Structure_Controller_Show_Observer
{
static public function onBeforeFindInformationsystemItems($object, $args)
{
if ($args[2]->id == 18 || $args[2]->id == 17) // проверяем id группы у инфоэлементов, которые не будем выводить
{
$args[0]
->queryBuilder()
->limit(0);
}
}
}

Core_Event::attach('Structure_Controller_Show.onBeforeFindInformationsystemItems', array('Structure_Controller_Show_Observer',
'onBeforeFindInformationsystemItems'));

$Structure_Controller_Show->show();

?>

Передача контроллеру структуры идентификатора текущего инфоэлемента и группы

<?php
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
->getByName('ЛевоеМеню')
)
->menu(3)
// Показывать группы информационных систем в меню*-***
->showInformationsystemGroups(TRUE)
// Показывать элементы информационных систем в меню
->showInformationsystemItems(FALSE);

if (is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Informationsystem_Controller_Show')
{
$Structure_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('informationsystem_group_id')
->value(intval(Core_Page::instance()->object->group))
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('informationsystem_item_id')
->value(intval(Core_Page::instance()->object->item))
);
}
$Structure_Controller_Show->show();
?>

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

     
 <?php
// Меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));

$Structure_Controller_Show
->xsl(Core_Entity::factory('Xsl')
->getByName('ВерхнееМеню'))
->parentId(90)
->show();
?>

Вывод меню на основе вложенных узлов структуры с передачей ID пользователя сайта

      

Показ подузлов родительского узла лежащего в корне

<?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));

$oStructure = Core_Page::instance()->structure;
while ($oStructure->parent_id != 0)
{
$oStructure = $oStructure->getParent();
}

$Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
->getByName('ПравоеМеню'))
->menu('3')
->parentId($oStructure->id)
->show();
?>

Хлебные крошки

    
  <?php
// Вывод строки навигации
$Structure_Controller_Breadcrumbs = new Structure_Controller_Breadcrumbs(
Core_Entity::factory('Site', CURRENT_SITE)
);
$Structure_Controller_Breadcrumbs
->xsl(
Core_Entity::factory('Xsl')->getByName('ХлебныеКрошки')
)
->show();
?>

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

<?php
$oProperty = Core_Entity::factory('Property', 220); // ID св-ва
$aPropertyValues = $oProperty->getValues(CURRENT_STRUCTURE_ID);
if (isset($aPropertyValues[0]))
{
echo $aPropertyValues[0]->value;
}
?>

Выводим в МЕНЮ дополнительное свойство структуры

  
    <?php
// ГлавноеМеню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show->showProperties(TRUE);
$Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
->getByName('ГлавноеМеню'))
->menu(3)
->showInformationsystemGroups(TRUE)
->showInformationsystemItems(TRUE)
->show();
?>

Регистрация. Вход в кабинет пользователя

<?php
               // Если модуль пользователей сайта доступен
               if (Core::moduleIsActive('siteuser'))
               {?><div id="authorization"><?php
                    if (is_null(Core_Entity::factory('Siteuser')->getCurrent()))
                    {
                         ?>
                         <form method="post" action="/users/">
                              <div><input type="text" name="login" value="Логин" /></div>
                              <div><input type="password" name="password" value="Пароль" /></div>
                              <div><input type="submit" name="apply" value="Войти" /></div>
                         </form>
                         <a href="/users/registration/" title="Зарегистрироваться">Зарегистрироваться</a>
                         <?php
                    }
                    /*else
                    {?>
                         <a href="/users/" title="Кабинет пользователя">Кабинет пользователя</a>
                    <?php
                    }*/
                    ?></div><?php
               }
               ?>

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

<?php
// Не главная страница
$sStructurePath = Core_Entity::factory('Structure', CURRENT_STRUCTURE_ID)->path;
if ($sStructurePath !== '/')
{
if (Core::moduleIsActive('informationsystem'))
{
$Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
Core_Entity::factory('Informationsystem', '16')
);

$Informationsystem_Controller_Show
->informationsystemItems()
->queryBuilder()
->clearOrderBy()
->orderBy('RAND()');

$Informationsystem_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName('ОписаниеУслугиВверхуСайт16')
)
//->groupsMode('none')
//->itemsForbiddenTags(array('text'))
->group(FALSE)
->limit(1)
->show();
}
}
else
{
Core_Entity::factory('Document', '9')->Document_Versions->getCurrent()->execute();
}
?>

Вывод хлебных крошек на всех страницах, кроме главной

<?php
$sStructurePath = Core_Entity::factory('Structure', CURRENT_STRUCTURE_ID)->path;
// Показываем "хлебные крошки" на всех страницах, кроме главной
if ($sStructurePath != '/')
{
// Вывод строки навигации
$Structure_Controller_Breadcrumbs = new Structure_Controller_Breadcrumbs(
Core_Entity::factory('Site', CURRENT_SITE)
);
$Structure_Controller_Breadcrumbs
->xsl(
Core_Entity::factory('Xsl')->getByName('ХлебныеКрошки')
)
->show();
// /Хлебные крошки
}
?>

Выводим меню на всех страницах, кроме главной

<?php
$sStructurePath = Core_Entity::factory('Structure', CURRENT_STRUCTURE_ID)->path;
// Показываем "меню" на всех страницах, кроме главной
if ($sStructurePath = '/') {
echo '';
} else {
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));

$Structure_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName('ВерхнееМенюСделатьКлючи')
)
->menu('17')
->show();
}
?>
 Получаем адрес Структуры и выводим нужный код
      <?php
$oStructure = Core_Entity::factory('Structure', CURRENT_STRUCTURE_ID);
if ($oStructure->path == '/') {
?>

... какой-то код

}
?>

ВЫВОДИМ ЗАГОЛОВОК СТАТИЧНОГО ДОКУМЕНТА

Лучший вариант
<?php Core_Page::instance()->showTitle()?>
Вариант 1 (для конкретного документа)
$oDocument = Core_Entity::factory('Document', 123);
echo '<h1>' . htmlspecialchars($oDocument->name) . '</h1>';
$oDocument->Document_Versions->getCurrent()->execute();
Вариант 2
<?php
// ID текущего узла струкутры
$structure_id = CURRENT_STRUCTURE_ID;
// Объект узла
$oStructure = Core_Entity::factory('Structure', $structure_id);
if ($oStructure->document_id)
{
$oDocument = $oStructure->Document;
echo '<div class="page-title category-title"><h1>' . htmlspecialchars($oDocument->name) . '</h1></div>';
}

// Вывод версии документа
Core_Page::instance()->execute();
?>
Вариант 3
<?php
class Document_Version_Observer
{
static public function onBeforeExecute($object, $args)
{
?><h1><?php echo htmlspecialchars($object->Document->name)?></h1><?php
}
}

// Add document_version observer
Core_Event::attach('document_version.onBeforeExecute', array('Document_Version_Observer', 'onBeforeExecute'));

// Вывод версии документа
Core_Page::instance()->execute();
?>
Вариант 4
<h1>
<?php
// Заголовок документа
$Structure_Controller_Breadcrumbs = new Structure_Controller_Breadcrumbs(
Core_Entity::factory('Site', CURRENT_SITE)
);
$Structure_Controller_Breadcrumbs
->xsl(
Core_Entity::factory('Xsl')->getByName('ЗаголовокДокумента')
)
->show();
?>
</h1>
   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:template match="/site">
<xsl:if test="count(*[@id]) &gt; 0">
<xsl:apply-templates select="*[@id]" />
</xsl:if>
</xsl:template>


<xsl:template match="*">
<!-- Определяем адрес ссылки -->
<xsl:variable name="link">
<xsl:choose>
<!-- Если внутренняя ссылка -->
<xsl:when test="link != ''">
<xsl:value-of disable-output-escaping="yes" select="link"/>
</xsl:when>
<!-- Если внешняя ссылка -->
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="url"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of disable-output-escaping="yes" select="name"/>
<xsl:apply-templates select="*[@id][link/node() or url/node()]" />
</xsl:template>
</xsl:stylesheet>

Получение элемента структуры верхнего(корневого) уровня

Если на сайте горизонтальное меню отдельно от бокового или любого другого подменю, которое содержит дочерние элементы горизонтального, возникает проблема с подсветкой активного пункта горизонтального меню. Так как вложенных элементов просто не передается в xml. Ниже приведен код для получения родительского элемента структуры самого верхнего уровня. 
<?php
$oStructure = Core_Entity::factory('structure', CURRENT_STRUCTURE_ID);
while ($oStructure->parent_id != 0 && $oStructure = $oStructure->getParent());
// Выводим id структуры верхнего уровня
echo $oStructure->id;
 Далее остается передать значение в контроллер показа <?php
$Structure_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('parent_current_structure_id')
->value($oStructure->id)
);

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

В ТДС Интернет-магазина добавляем следующий код, который выведет нам данные из Инфосистемы в 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

Добавляем меню структуры в ТДС Инфосистемы

В настройки кода ТДС Инфосистемы добавляем код, который в теге menu выведет XSL шаблон Меню структуры. В данном конкретном случае показываются Вложенные разделы с Раздел структуры с ID 421

if ($Informationsystem_Controller_Show->group==0 || $Informationsystem_Controller_Show->group) {
ob_start();

// МенюВИнфосистеме
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));

$oStructure = Core_Page::instance()->structure;
while ($oStructure->parent_id != 0)
{
$oStructure = $oStructure->getParent();
}

$Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
->getByName('МенюКомпанииВИнфосистемеPNEVMOTEX'))
->showProperties(TRUE)
->menu('43')
->parentId(421)
->show();

$Informationsystem_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('menu')
->value(ob_get_clean())
) ;

Запрос количества товаров только в наличии

PHP

$oQB = Core_QueryBuilder::select('shop_items.id')
   ->from('shop_items')
    ->join('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
    ->join('shop_warehouses', 'shop_warehouses.id', '=', 'shop_warehouse_items.shop_warehouse_id')
    ->where('shop_items.active', '=', 1)
    ->where('shop_items.deleted', '=', 0)
    ->where('shop_items.shop_id', '=', 3)
    ->where('shop_warehouses.active', '=', 1)
    ->where('shop_warehouses.deleted', '=', 0)
    ->groupBy('shop_items.id')
    ->having(Core_QueryBuilder::expression('SUM(shop_warehouse_items.count)'), '>', 0);


$oCore_QueryBuilder_Select = Core_QueryBuilder::select(array(Core_QueryBuilder::raw('COUNT(*)'), 'count'))
    ->from(array($oQB, 'x'));

$row = $oCore_QueryBuilder_Select->execute()->asObject()->current();

echo 'Сегодня в продаже ' . $row->count . ' ' . Core_Str::declensionNumber($row->count, 'товар', 'товара', 'товаров');

Информационный блок в карточке товара

Добавляем в карточку товара блок с призывом задать вопрос

1. В XSL шаблон вывода карточки товара в нужном месте размещаем данный код: 

<div class="ask-question">
            <div class="d-flex justify-content-center">
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="40px" height="40px">
                <path style="fill:#ccc" d="M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm32 352c0 17.6-14.4 32-32 32H293.3l-8.5 6.4L192 460v-76H64c-17.6 0-32-14.4-32-32V64c0-17.6 14.4-32 32-32h384c17.6 0 32 14.4 32 32v288zm-224-88c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-8.5-24h17c4.2 0 7.7-3.3 8-7.5l7-112c.3-4.6-3.4-8.5-8-8.5h-31c-4.6 0-8.3 3.9-8 8.5l7 112c.3 4.2 3.8 7.5 8 7.5z"></path>
              </svg>
              <span class="ps-3 fs-4 fw-bold title">Есть вопросы?</span>
            </div>
            <div class="text">
						Если у вас есть вопросы по товару, то задавайте их и мы вам с радостью ответим.
					</div>
            <div class="last">
              <button type="button" id="questionModalOpen" data-bs-toggle="modal" data-bs-target="#questionModal" class="btn btn-transparent">Задать вопрос о товаре</button>
            </div>
          </div>

2. В макет добавляем код загрузки формы (в примере код формы с отправкой уведомления Пользователю). Форма будет в модальном окне. Нажатие на кнопку "Задать вопрос" вызовет открытие формы.

<?php
        // ФОРМА ЗАЯВКИ
        $oForm = Core_Entity::factory('Form', 1);  
        $Form_Controller_Show = new Form_Controller_Show($oForm);
       if (!is_null(Core_Array::getPost($oForm->button_name)))
          {
         $Form_Controller_Show
         ->values($_POST + $_FILES)
         // 0 - html, 1- plain text
         ->mailType(0)
         ->mailXsl(
            Core_Entity::factory('Xsl')->getByName('ПисьмоКураторуФормыВФорматеHTML')
         )
         ->mailFromFieldName('euronasos19@gmail.com')
         ->process();

        // Отправляем письмо-подтверждение пользователю
        $Form_Controller_Show1 = clone $Form_Controller_Show;
        $sEmail = Core_Array::get($Form_Controller_Show1->values, 'email');  // здесь указать название поля input для email в форме
        if (Core_Valid::email($sEmail)){
            ob_start();
            $Form_Controller_Show1
                ->xsl(
                    Core_Entity::factory('Xsl')->getByName('ПисьмоПодтверждениеПользователюФормыВФорматеHTML')
                )
                ->show();
            $sMailText = ob_get_clean();
            if (mb_strpos($sMailText, 'ERROR TRUE') === FALSE){
                $subject = 'На сайте site.ru Вами была заполнена форма Заявки';// Тему письма отредактировать
                $oCore_Mail = Core_Mail::instance()
                    ->to($sEmail)
                    ->from('info@site.ru')
                    ->subject($subject)
                    ->message(trim($sMailText))
                    ->contentType('text/html')
                    ->header('X-HostCMS-Reason', 'Form');

                $oCore_Mail->send();
                      }
                  }
              }
                $Form_Controller_Show
                  ->xsl(
                  Core_Entity::factory('Xsl')->getByName('ОтобразитьФормуЗаявкиВМодальномОкне')
                 )
                  ->show();
?>

XSL . ФормаЗаявкиВМодальномОкне

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "lang://351">
<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:template match="/">
<xsl:apply-templates select="/form" />
</xsl:template>
<xsl:template match="/form">
<xsl:choose>
<xsl:when test="success/node() and success = 1">
<!--div id="fade" style="display: block;"></div-->
<div class="modal fade form-success-result" id="modalSuccess" tabindex="-1" role="dialog">
<div class="modal-dialog  modal-dialog-centered">
<div class="modal-content p-5">
<div class="modal-header text-center">
<!--div class="modal-title w-100 fs-4 fw-bold">&labelModalTitle1;</div-->
<button class="btn-close" type="button" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<xsl:value-of disable-output-escaping="yes" select="success_text" />
</div>
</div>
</div>
</div>
<script>
let modalSuccess = new bootstrap.Modal(document.getElementById('modalSuccess'));
modalSuccess.show();
</script>
</xsl:when>
<!-- Выводим ошибку (error), если она была передана через внешний параметр -->
<xsl:when test="error != ''">
<div class="modal fade form-success-result" id="modalError" tabindex="-1" role="dialog">
<div class="modal-dialog  modal-dialog-centered">
<div class="modal-content p-5">
<div class="modal-header text-center">
<div class="modal-title w-100 fs-3 fw-bold">ОШИБКА!</div>
<button class=" " type="button" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body"><b><xsl:value-of disable-output-escaping="yes" select="error" /></b></div>
</div>
</div>
</div>
<script>
let modalError = new bootstrap.Modal(document.getElementById('modalError'));
modalError.show();
</script>
</xsl:when>
<xsl:when test="errorId/node()">
<div class="modal fade form-success-result" id="modalError" tabindex="-1" role="dialog">
<div class="modal-dialog  modal-dialog-centered">
<div class="modal-content p-5">
<div class="modal-header text-center">
<div class="modal-title w-100 fs-3 fw-bold">&labelERROR;</div>
<button class="btn-close" type="button" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<xsl:choose>
<xsl:when test="errorId = 0">
&labelTextErrorId0;
</xsl:when>
<xsl:when test="errorId = 1">
&labelTextErrorId1;
</xsl:when>
<xsl:when test="errorId = 2">
&labelTextErrorId2;
</xsl:when>
</xsl:choose>
</div>
</div>
</div>
</div>
<script>
let modalError = new bootstrap.Modal(document.getElementById('modalError'));
modalError.show();
</script>
</xsl:when>
<xsl:otherwise>
 <div class="modal fade" id="questionModal" tabindex="-1" aria-labelledby="questionModalLabel_{@id}" aria-hidden="true">
<div class="modal-dialog  modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header justify-content-center">
<div class="h2 m-0 modal-title" id="questionModalLabel_{@id}"><xsl:value-of disable-output-escaping="yes" select="name" /></div>
<button class="btn-close" type="button" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<xsl:if test="description !=''">
<xsl:value-of disable-output-escaping="yes" select="description" />
</xsl:if>
<div id="add-text" class="text-center"> </div>
<!-- Параметр action формы должен быть "./", если обработчик на этой же странице, либо "./form/", если обработчик на другой странице, например ./form/ -->
<form name="form{@id}" id="form{@id}" class="validate" action="./" method="post" enctype="multipart/form-data" >
<!-- Вывод разделов формы 0-го уровня -->
<xsl:apply-templates select="form_field_dir" />
<!-- Вывод списка полей формы 0-го уровня -->
<xsl:apply-templates select="form_field" />
<!-- Код подтверждения -->
<xsl:if test="captcha_id != 0">
<div class="form-group mb-3">
<div class="row">
<div class="col-6 caption">
<input type="hidden" name="captcha_id" value="{/form/captcha_id}"/>
<input type="text" name="captcha" size="15" class="form-control required" minlength="4" title="Введите число, которое указано на картинке."/>
<div class="padding-5">&labelCheckNumber1;<sup><font color="red">*</font></sup></div>
</div>
<div class="col-6 field">
<img id="formCaptcha_{/form/@id}_{/form/captcha_id}" src="/captcha.php?id={captcha_id}&amp;height=30&amp;width=100" class="captcha" name="captcha" />
<div class="captcha">
<img src="/images/refresh.png" /> <span class="small" onclick="$('#formCaptcha_{/form/@id}_{/form/captcha_id}').updateCaptcha('{/form/captcha_id}', 30); return false" style="cursor:pointer">&labelCheckNumber2;</span>
</div>
</div>
</div>
</div>
</xsl:if>
<!--div class="margin-bottom-10">
<div class="g-recaptcha" data-sitekey="6LfemXMiAAAAAPtn9tHaYj5z-0yKJq4Tmi3Ph1Cw"></div>
</div-->
<xsl:if test="csrf_token/node() and csrf_token != ''">
<input type="hidden" name="{csrf_field}" value="{csrf_token}" />
</xsl:if>
<div class="form-group">
<input type="hidden" name="{button_name}" value="submit"/>
<button id="submit_{@id}" value="submit" name="{button_name}" type="submit" class="btn btn-black mt-4 w-100"><xsl:value-of select="button_value" /></button>
</div>
</form>
<div class="mt-4">
<div class="form-check">
<input id="checkbox{@id}" class="form-check-input" type="checkbox" name="checkbox" checked="checked" onchange="document.getElementById('submit_{@id}').disabled = !this.checked;"/>
<label for="checkbox{@id}" class="form-check-label small" style="text-align:justify">Я соглашаюсь на обработку своих персональных данных в соответствии с <a href="/private" class="link-border"> Политикой конфиденциальности</a></label>
</div>
</div>
</div>
</div>
</div>
</div>
<SCRIPT>
<xsl:comment>
<xsl:text disable-output-escaping="yes">
    <![CDATA[
    $(function() {
    $("#fileUpload").on('change', function () {
 
     //Get count of selected files
     var countFiles = $(this)[0].files.length;
     var imgPath = $(this)[0].value;
     var extn = imgPath.substring(imgPath.lastIndexOf('.') + 1).toLowerCase();
     var image_holder = $("#image-holder");
     image_holder.empty();
 
     if (extn == "png" || extn == "jpg" || extn == "jpeg" || extn == "webp") {
         if (typeof (FileReader) != "undefined") {
 
             //loop for each file selected for uploaded.
             for (var i = 0; i < countFiles; i++) {
 
                 var reader = new FileReader();
                 reader.onload = function (e) {
                     $("<img />", {
                         "src": e.target.result,
                             "class": "thumb-image"
                     }).appendTo(image_holder);
                 }
 
                 image_holder.show();
                 reader.readAsDataURL($(this)[0].files[i]);
             }
 
         } else {
             alert("Ваш брузер не поддерживает FileReader!");
         }
     } else {
         alert("Выберите файл в формате JPG, JPEG, PNG или WEBP!");
     }
    });
    });
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="form_field_dir">
<!--fieldset class="maillist_fieldset"-->
<!--legend><xsl:value-of select="name" /></legend-->
<!-- Вывод списка полей формы -->
<xsl:apply-templates select="form_field" />
<!-- Вывод разделов формы -->
<xsl:apply-templates select="form_field_dir" />
<!--/fieldset-->
</xsl:template>
<xsl:template match="form_field">
<!-- Не скрытое поле и не надпись -->
<xsl:if test="type != 7 and type != 8">
<div class="form-group mb-3">
<xsl:if test="type = 2">
<xsl:attribute name="class">form-group mb-2 me-4</xsl:attribute>
</xsl:if>
<xsl:variable name="caption">
<xsl:choose>
<xsl:when test="obligatory = 1">
<xsl:value-of select="caption" />*
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="caption" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<!-- Радиокнопки -->
<xsl:when test="type = 3 or type = 9">
<xsl:apply-templates select="list/list_item" />
</xsl:when>
<!-- Checkbox -->
<xsl:when test="type = 4">
<div class="pretty p-default p-pulse">
<input type="checkbox" name="{name}">
<xsl:if test="checked = 1 or value = 1">
<xsl:attribute name="checked">checked</xsl:attribute>
</xsl:if>
</input>
<div class="state p-danger-o">
<label><xsl:value-of select="value" /></label>
</div>
</div>
</xsl:when>
<!-- Textarea -->
<xsl:when test="type = 5">
<textarea class="form-control" name="{name}" cols="{cols}" rows="{rows}" placeholder="{$caption}">
<xsl:if test="obligatory = 1">
<xsl:attribute name="class">form-control required</xsl:attribute>
</xsl:if>
<xsl:value-of select="value" />
</textarea>
</xsl:when>
<!-- Список -->
<xsl:when test="type = 6">
<select name="{name}" class="wide">
<xsl:if test="obligatory = 1">
<xsl:attribute name="class">wide required</xsl:attribute>
<xsl:attribute name="title"><xsl:value-of select="caption" /></xsl:attribute>
</xsl:if>
<option value="">...</option>
<xsl:apply-templates select="list/list_item" />
</select>
</xsl:when>
<!-- Текстовые поля -->
<xsl:otherwise>
<xsl:if test="type = 2">
<label for="fileUpload" class="download-file">
<i class="svg_icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="21px" height="21px" ><path style="fill:#797979" d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm16 336c0 8.822-7.178 16-16 16H48c-8.822 0-16-7.178-16-16V112c0-8.822 7.178-16 16-16h416c8.822 0 16 7.178 16 16v288zM112 232c30.928 0 56-25.072 56-56s-25.072-56-56-56-56 25.072-56 56 25.072 56 56 56zm0-80c13.234 0 24 10.766 24 24s-10.766 24-24 24-24-10.766-24-24 10.766-24 24-24zm207.029 23.029L224 270.059l-31.029-31.029c-9.373-9.373-24.569-9.373-33.941 0l-88 88A23.998 23.998 0 0 0 64 344v28c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-92c0-6.365-2.529-12.47-7.029-16.971l-88-88c-9.373-9.372-24.569-9.372-33.942 0zM416 352H96v-4.686l80-80 48 48 112-112 80 80V352z"/></svg>
</i>
<span class="download-file-text ps-2">Выберите сразу несколько фото</span>
</label>
</xsl:if>
<input class="form-control" type="text" name="{name}" value="{value}" size="{size}" placeholder="{$caption}">
<xsl:choose>
<!-- Поле для ввода пароля -->
<xsl:when test="type = 1">
<xsl:attribute name="type">password</xsl:attribute>
</xsl:when>
<!-- Поле загрузки файла -->
<xsl:when test="type = 2">
<xsl:attribute name="type">file</xsl:attribute>
<xsl:attribute name="multiple">true</xsl:attribute>
<xsl:attribute name="class">photo</xsl:attribute>
<xsl:attribute name="name">files[]</xsl:attribute>
<xsl:attribute name="id">fileUpload</xsl:attribute>
<xsl:attribute name="accept">image/jpg,image/jpeg,image/png,image/webp</xsl:attribute>
<div id="image-holder" class="d-flex flex-wrap"></div>
</xsl:when>
<!-- HTML5: Дата -->
<xsl:when test="type = 10">
<xsl:attribute name="type">date</xsl:attribute>
</xsl:when>
<!-- HTML5: Цвет -->
<xsl:when test="type = 11">
<xsl:attribute name="type">color</xsl:attribute>
</xsl:when>
<!-- HTML5: Месяц -->
<xsl:when test="type = 12">
<xsl:attribute name="type">month</xsl:attribute>
</xsl:when>
<!-- HTML5: Неделя -->
<xsl:when test="type = 13">
<xsl:attribute name="type">week</xsl:attribute>
</xsl:when>
<!-- HTML5: Время -->
<xsl:when test="type = 14">
<xsl:attribute name="type">time</xsl:attribute>
</xsl:when>
<!-- HTML5: Дата-Время -->
<xsl:when test="type = 15">
<xsl:attribute name="type">datetime</xsl:attribute>
</xsl:when>
<!-- HTML5: E-mail -->
<xsl:when test="type = 16">
<xsl:attribute name="type">email</xsl:attribute>
</xsl:when>
<!-- HTML5: Поиск -->
<xsl:when test="type = 17">
<xsl:attribute name="type">search</xsl:attribute>
</xsl:when>
<!-- HTML5: Телефон -->
<xsl:when test="type = 18">
<xsl:attribute name="type">tel</xsl:attribute>
</xsl:when>
<!-- HTML5: URL -->
<xsl:when test="type = 19">
<xsl:attribute name="type">url</xsl:attribute>
</xsl:when>
<!-- Текстовое поле -->
<xsl:otherwise>
<xsl:attribute name="type">text</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="obligatory = 1">
<xsl:attribute name="class">form-control required</xsl:attribute>
</xsl:if>
<!--xsl:if test="@id = 15">
<xsl:attribute name="disabled">disabled</xsl:attribute>
</xsl:if-->
</input>
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:if>
<!-- скрытое поле -->
<xsl:if test="type = 7">
<input type="hidden" name="{name}" value="{value}" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
//
//
//
Код DTD для языка "ru"

<!ENTITY labelModalTitle1 "Благодарим вас за заявку!">
<!ENTITY labelModalTitle2 "Заявка получена.">
<!ENTITY labelSuccessText "Мы свяжемся с вами в ближайшее время">
<!ENTITY labelSuccessText2 "Наш менеджер ответит на все ваши вопросы">

<!ENTITY labelERROR "ОШИБКА!">
<!ENTITY labelTextErrorId0 "Вы неправильно ввели код подтверждения отправки формы!">
<!ENTITY labelTextErrorId1 "Заполните все обязательные поля!">
<!ENTITY labelTextErrorId2 "С момента отправки последней формы прошло слишком мало времени!">

<!ENTITY labelTextError1 "Это поле пустое">
<!ENTITY labelTextError2 "E-mail должен иметь вид name@domain.com">

<!ENTITY labelText1 "Обязательное поле">

<!ENTITY labelCheckNumber1 "Проверочный код">
<!ENTITY labelCheckNumber2 "показать другой код">

Стили CSS

/******************************/

.ask-question {
    padding:20px;
    background-color: #f0f0f0;
    max-width:450px;
    text-align: center;
}
.ask-question > div:not(.last) {
     margin-bottom:15px;   
}

.btn.btn-transparent {

background: transparent;

border: 1px solid #212529;

color: #212529;

/******************************/

Меняем title в макете страницы

Если нужно добавить к title какие-то фразы на определённых страницах и нет возможности использовать SEO фильтры. Например для tag
        <title><?php 
            if (is_object(Core_Page::instance()->object)) {
                $bShop = Core_Page::instance()->object instanceof Shop_Controller_Show;
              if ($bShop){
                   if (Core_Page::instance()->object->tag) {
                   Core_Page::instance()->showTitle();
                   echo ' купить в Москве | интернет-магазин Пневмотех';
                }else{
                    Core_Page::instance()->showTitle();
        }
              }else{
                Core_Page::instance()->showTitle();
                }
              }else{
              Core_Page::instance()->showTitle();
      }
       ?></title>

Ограничиваем поиск только по каталогу товаров

Настройка Типовой динамической страницы для поиска только товаров магазина.

Код Типовой динамической страницы "Поиск"

<?php

if (Core::moduleIsActive('search'))
{
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
$Search_Controller_Show = new Search_Controller_Show($oSite);
$Search_Controller_Show
->limit(Core_Page::instance()->libParams['itemsOnPage'])
->parseUrl()
->len(Core_Page::instance()->libParams['maxlen'])
->query(Core_Array::getGet('text'))
->structure(Core_Page::instance()->structure);
//
// 'module_id' => 3 - здесь указываем id интернет-магазина
//
$Search_Controller_Show->modules(
array(
3 =>array(array('module_id' => 3, 'module_value_type' => 2))
)
);
$Search_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName(Core_Page::instance()->libParams['xsl'])
)
->show();
}
else
{
?>
<h1>Поиск</h1>
<p>Функционал недоступен, приобретите более старшую редакцию.</p>
<p>Модуль &laquo;<a href="http://www.hostcms.ru/hostcms/modules/search/">Поиск по сайту</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;, &laquo;<a
href="http://www.hostcms.ru/hostcms/editions/small-business/">Малый бизнес</a>&raquo; и &laquo;<a
href="http://www.hostcms.ru/hostcms/editions/my-site/">Мой сайт</a>&raquo;.</p>
<?php
}
Class Search_Controller_Show
Доступные методы:
  • query($query) поисковый запрос
  • inner($inner) поиск по внутренним данным, например, Helpdesk. По умолчанию 0 - внешние данные, 1 - внутренние данные
  • modules($modules) массив условий поиска по модулям
  • itemsForbiddenTags(array('description')) массив тегов связанных элементов, запрещенных к передаче в генерируемый XML
  • offset($offset) смещение, с которого выводить информационные элементы, по умолчанию 0
  • limit($limit) количество выводимых элементов
$oSite = Core_Entity::factory('Site', CURRENT_SITE);
$Search_Controller_Show = new Search_Controller_Show($oSite);
$Search_Controller_Show
->limit(Core_Page::instance()->libParams['result_on_page'])
->parseUrl()
->len(Core_Page::instance()->libParams['maxlen'])
->query(Core_Array::getGet('text'));
$Search_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName(Core_Page::instance()->libParams['xsl'])
)
->show();
Массив условий поиска по модулям позволяет ограничить область поиска по модулям и типам индексируемого контента. Ключами массива являются номера модулей, а значениями — массив идентификаторов элементов. Номера модулей:

0 – Структура сайта;
1 – Информационные системы;
2 – Форум;
3 – Интернет-магазин;
4 – HelpDesk.
Пример поиска по информационной системе с номером 5 и 7, а также по магазину с номером 17.
$Search_Controller_Show
->modules(
    array( 1 => array (5, 7), 3 => array (17) )
);

Пример поиска по информационной системе с номером 5 и 7 (с дополнительным условием поиска только по информационным элементам), а также по магазину с номером 17.

$Search_Controller_Show
    ->modules(
     array( 1 => array (5, array('module_id' => 7, 'module_value_type' => 2)), 3 => array (17)) );
При указании массива с дополнительными условиями он может принимать следующие аргументы:

module_id — целое число, ID сущности, например, магазин с кодом 7
module_value_type — целое число или массив, ID типа, например, 1 - группа, 2 - элемент (или товар)
module_value_id — целое число или массив, ID сущности указанного типа (например, ID товара или группы) при поиске только по ним.

РАЗНОЕ

Для установки β-обновления необходимо создать активную константу INSTALL_BETA_UPDATE со значением true.
[x]Поиск по сайту
<form action="/search/" method="GET" class="search">
<input type="text" name="text" class="inp1" value="Поиск по каталогу" onblur="if(this.value=='') this.value='Поиск по каталогу'" onFocus="if(this.value =='Поиск по каталогу' ) this.value=''" size="15" >
<input type="image" title="Поиск" src="/images/search.png" class="inp2" width="47" height="27" alt="Поиск по сайту" />
</form>
<?php
// Если модуль поиска доступен
if (Core::moduleIsActive('search'))
{
?>
<form id="search_mini_form" method="get" action="/search/">
<div class="form-search">
<input id="search" type="text" name="text" placeholder="Поиск">
<i class="fa fa-search" onclick="$(this).closest('form').submit();"></i>
</div>
</form>
<?php
}
?>
 
CSS
.inp1{font-size:.8em; vertical-align:middle; font-weight:400; color:#666; height:25px;width:180px; padding:0 5px; border: 1px solid #fbb91d; /*Firefox*/ -moz-border-radius: 6px 0 0 6px; /*Safari, Chrome*/ -webkit-border-radius: 6px 0 0 6px; /*Konqueror*/ -khtml-border-radius: 6px 0 0 6px; border-radius: 6px 0 0 6px; -moz-box-shadow: inset 0px 0px 8px #6d6b6b;/*FF 3.5+*/-webkit-box-shadow: inset 0px 0px 8px #6d6b6b;/*Saf3-4, Chrome, iOS 4.0.2-4.2, Android 2.3+*/ -khtml-box-shadow: inset 0px 0px 8px #6d6b6b;/*Konqueror*/box-shadow: inset 0px 0px 8px #6d6b6b; behavior: url(/js/PIE.htc);/*Apply PIE*/}
.inp2 {vertical-align:middle; position:relative; margin-left:-5px; margin-top:-1px;z-index:4; border:0!important; padding:0;}
[x]Вывод Формы на страницу
Для обработки формы создать отдельную страницу, на которую будет происходить перенаправление, например /feedback
Заменить:
<!-- Параметр action формы должен быть "./", если обработчик на этой же странице, либо "./form/", если обработчик на другой странице, например ./form/ -->
<form name="form{@id}" id="form{@id}" class="validate" action="./" method="post" enctype="multipart/form-data">
на:
<!-- Параметр action формы должен быть "./", если обработчик на этой же странице, либо "./form/", если обработчик на другой странице, например ./form/ -->
<form name="form{@id}" id="form{@id}" class="validate" action="/feedback" method="post" enctype="multipart/form-data">
<?php

if (Core::moduleIsActive('form'))
{
$Form_Controller_Show = new Form_Controller_Show(Core_Entity::factory('Form', 1));

$Form_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName('ОтобразитьФорму')
)
->show();
}
?>
[x] Назначаем класс для body
<body <? if ($_SERVER['REQUEST_URI']=='/') echo 'class="index"' ?>>


<body <? if ($_SERVER['REQUEST_URI']=='/'){
echo 'class="index pageBody"';
}else{
echo 'class="pageBody"';
}
?>>
[x]Вывод формы авторизации и затем поиск по сайту
<?php
// Если модуль пользователей сайта доступен
if (Core::moduleIsActive('siteuser'))
{?><div id="authorization"><?php
if (is_null(Core_Entity::factory('Siteuser')->getCurrent()))
{
?>
<form method="post" action="/users/">
<div><input type="text" name="login" value="Логин" /></div>
<div><input type="password" name="password" value="Пароль" /></div>
<div style="padding-top:2px;"><input type="image" src="/images/95prozentov/user.png" name="apply" title="Авторизоваться" class="inp2" /></div>
</form>
<?php
}
else
{?>
<form method="get" action="/search/" class="search">
<div><input name="text" type="text" value="Поиск по каталогу" class="inp1" onblur="if(this.value=='') this.value='Поиск по каталогу'" onFocus="if(this.value =='Поиск по каталогу' ) this.value=''" /><input type="image" src="/images/95prozentov/search.png" name="apply" title="Искать" class="inp2" /></div>
</form>
<?php
}
?></div><?php
}
?>
[x] Вставляем название Документа в нужное место макета. Можно использовать, например, для номера телефона
<?php echo htmlspecialchars(Core_Entity::factory('Document', 16)->name); ?>
[x]Выводим текущий год
<?php echo date('Y') ?>
[x]Выводим Московское время
<div class="time">Время МСК: <span class="bold"><?php $datamos = gmdate('H:i', time() + 3*3600); echo $datamos ?></span></div>
[x]Меняем макет для страницы с товаром или инфоэлементом в ТДС
Core_Page::instance()->template(Core_Entity::factory('Template', 54)); // указываем id макета для Товара или Инфоэлемента


if (isset($Shop_Controller_Show->item) && $Shop_Controller_Show->item)
{
Core_Page::instance()->template(
Core_Entity::factory('Template', 8)
);
}
[x]Выводим на страницу (или в метатэги)  название сайта
<?php echo htmlspecialchars(Core_Entity::factory('Site', CURRENT_SITE)->name);?>
[x]Меняем id <body> в зависимости от текущего макета
<?php
switch(Core_Page::instance()->template->id)
{
case '16':
case '17':
{
$body_id = 'page2';
break;
}
default:
{
$body_id = 'page1';
}
}
?>
<body id="<?php echo $body_id?>">
[x]Выводим в XML все группы авторизованного пользователя
Вставляем код в ТДС (Интернет-магазин)
после строки
<?php
$Shop_Controller_Show = Core_Page::instance()->object;
-----------------------------------------------------------------------


// add 08.06.2015 - вывод всех групп пользователя
if (!is_null(Core_Entity::factory('Siteuser')->getCurrent())){
$aSiteuser_Groups = Core_Entity::factory('Siteuser')->getCurrent()->Siteuser_Groups->findAll();
foreach ($aSiteuser_Groups as $oSiteuser_Group)
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('siteuser_groups')
->addEntity(
Core::factory('Core_Xml_Entity')->name('group')->value($oSiteuser_Group->name)
)


);


}
}
// end add 08.06.2015
[x]Меняем ссылку в зависимости от URL, например  для сайтов с языковыми версиями
<a href="/en/<?php
$oURL = $_SERVER['REQUEST_URI'];
$oURL = substr($oURL,4);
if ($oURL == '') echo '';
else echo $oURL;
?>">EN</a>


<a href="/ru/<?php
$oURL = $_SERVER['REQUEST_URI'];
$oURL = substr($oURL,4);
if ($oURL == '') echo '';
else echo $oURL;
?>">RU</a>
 
[x]Вывод случайных изображений на PHP
<?php
$images = array(
'изображение-1.bmp',
'изображение-2.png',
'изображение-3.gif',
'изображение-4.png',
'изображение-5.jpg',
);
$image = $images[array_rand($images)];
$output = "<img src=\"http://сайт.ru/папка, где хранятся изображения/" . $image . "\" alt=\"Перезагрузите браузер для нового случайного изображения\" />";
echo $output;
?>
[x]Редактирование - отправка писем нескольким администраторам магазина
Редактируем файл  /modules/core/mail.php
Несколько адресов указываем в цикле:
$aEmails = array('1@1.ru', '2@2.ru');


foreach ($aEmails as $sEmail)
{
$oCore_Mail = Core_Mail::instance()
->to($sEmail)
->from('test@test.ru')
->subject('test')
->message('text')
->contentType('text/plain')
->header('X-HostCMS-Reason', 'Alert')
->send();
}
[x]Показ нескольких изображений из Допсвойства типа файл
<xsl:for-each select="property_value[tag_name='img'][file !='']">
<xsl:sort select="@id" />
<div>
<a href="{../dir}{file}">
<img class="gallery-img" alt="{file_name}" src="{../dir}{file}"/>
</a>
</div>
</xsl:for-each>

Сессии

Сессии позволяют сохранять пользовательские данные между запросами. Хранение сессий в HostCMS осуществляется в базе данных (по умолчанию) или в Redis (с версии HostCMS 6.8.3, используя php-redis версии 2.6.12+).

Доступ к данным сессии

К данным сессии доступ получается через суперглобальный массив $_SESSION.
$value = $_SESSION['foo'];
Если вы не уверены в наличии требуемого значения в сессии, то используйте Core_Array::getSession(), при отсутствии значения метод вернет NULL
$value = Core_Array::getSession('foo');
То же действие, только с возвратом значения по умолчанию 'default' в случае, если индекса foo в сессии нет
$value = Core_Array::getSession('foo', 'default');

Открытие и закрытие сессии

// Открыть сессиюCore_Session::start();

// Записать в сессию
$_SESSION['foo'] = 'bar';

// Закрыть сессиюCore_Session::close();
Открывать сессию необходимо каждый раз перед там, как записать данные в $_SESSION, дополнительно проверять наличие открытой сессии перед вызовом Core_Session::start() не требуется, проверка содержится внутри метода start().
Проверить, запущена ли сессия:
$bStarted = Core_Session::isStarted();
Проверить, запущена ли сессия и активна:
$bAcive = Core_Session::isAcive();
Получить имя сессии:
$session_name = Core_Session::getName();
Запустить сессию только в случае, если она была ранее запущена в предыдущих сеансах:
if (Core_Session::hasSessionId()){
Core_Session::start();
print_r($_SESSION);}

Времени жизни сессии

При старте сессии, время жизни устанавливается равным времени, указанном в session.gc_maxlifetime, изменить время жизни сессии можно до или уже после запуска сессии методом Core_Session::setMaxLifeTime($maxlifetime, $overwrite = FALSE)
// Время жизни сессии в секундах (1 сутки с момента последней активности)Core_Session::setMaxLifeTime(86400);
Время жизни сессии будет установлено в том случае, если оно больше ранее заданного. Чтобы перезаписать время жизни сессии в любом случае, вторым параметром передайте TRUE.

Конфигурационный файл

Указание способа хранения сессий и опций осуществляется в основном конфигурационном файле modules/core/config/config.php в опции session.
При хранении сессии в базе данных задаются 2 параметра:
  • driver — название драйвера;
  • class — имя класса драйвера (необязательный параметр).
'session' => array(
'driver' => 'database',
'class' => 'Core_Session_Database'
),
Для хранения в Redis требуется больше параметров:
  • driver — название драйвера;
  • class — имя класса драйвера (необязательный параметр);
  • server — адрес сервера, по умолчанию 127.0.0.1;
  • port — порт, по умолчанию 6379;
  • auth —авторизационный пароль, если сервер не требует пароль, то не устанавливайте опцию или укажите NULL;
'session' => array(
'driver' => 'phpredis',
'class' => 'Core_Session_Phpredis',
'server' => '127.0.0.1',
'port' => 6379,
'auth' => 'авторизационный пароль'
),

Скрипт прописывает всем элементам списков Url, если изначально они не были заданы

Скрипт загружается в корень сайта.

Для запуска скрипта нужно быть авторизованным в админ панели.

Адрес скрипта будет таким: https://site.ru/make-urls.php.

В процессе работы страница обновится несколько раз, если элементов списков много (за один прогон — 1000 элементов списков).

В самом конце будет вывод, типа:

done. Processed: {кол-во обработанных элементов}

<?php
header("Content-type: text/html; charset=UTF-8");
// Подключаем основные классы
require_once ('bootstrap.php');
if (!Core_Auth::logged()) {
    header('Location: /');
    exit();
}
$iLimit = 1000;
$iStart = intval(Core_Array::getRequest('total', 0));
$oListItems = Core_Entity::factory('List_Item');
$oListItems->queryBuilder()
    ->limit($iLimit)
    ->offset($iStart)
;
$aListItems = $oListItems->findAll();
foreach ($aListItems as $oListItem) {
    $oListItem->makePath();
    $oListItem->save();
    $iStart++;
}
>
if ($iStart - intval(Core_Array::getRequest('total', 0)) >= $iLimit) {
    header('Refresh:1; url=/' . basename(__FILE__) . '?total=' . $iStart);
    echo 'redirecting...';
}
else {
    echo 'done. Processed: ' . $iStart;
}
exit();
 

ТДС Экспорт в Яндекс Маркет

Настройки ТДС
<?php 
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId')); 
// $oCore_Out_File = new Core_Out_File(); 
// $oCore_Out_File->filePath(CMS_FOLDER . "yandexmarket.xml"); 
$Shop_Controller_YandexMarket = new Shop_Controller_YandexMarket($oShop); 
// $Shop_Controller_YandexMarket->stdOut($oCore_Out_File); 
/* 
class Shop_Controller_YandexMarket_Observer2 
{ 
   static public function onBeforeSelectShopItems($object, $args) 
   { 
      
      $args[0]->queryBuilder() 
      ->where('shop_items.shop_group_id', 'IN', array(711,714));    
   } 
} 
*/ 
Core_Event::attach('Shop_Controller_YandexMarket.onBeforeSelectShopItems', array('Shop_Controller_YandexMarket_Observer2', 'onBeforeSelectShopItems')); 
$Shop_Controller_YandexMarket 
	->token(Core_Array::get(Core_Page::instance()->libParams, 'token', '')) 
        ->checkRest(TRUE) 
       ->outlets(array(5 => 111)) 
        ->model('DBS') 
	->parseUrl() 
	->modifications(TRUE) 
	->groupModifications(TRUE) 
        ->type('vendor.model') 
	 ->additionalImages(array('images')) 
        ->itemsProperties(array(618, 621, 630, 631)) 
        ->checkRest(TRUE) 
	 ->itemsForbiddenProperties(array(7431, 7493)) 
      ->show(); 
exit();

Все доступные методы:

  • itemsProperties(TRUE|FALSE|array()) выводить значения дополнительных свойств товаров, по умолчанию TRUE.
  • itemsForbiddenProperties(array()) исключать значения дополнительных свойств товаров, по умолчанию array().
  • additionalImages(array()) массив tag_name дополнительных свойств для изображений.
  • additionalTagNames(array()) имена тегов, включаемых в основной offer товара, с указанием соответствующих дополнительных свойств, например, array('expiry' => 117)
  • addForbiddenTag('tag-name') добавить тег, запрещенный к передаче в генерируемый YML.
  • addForbiddenTags(array('description', 'vendor')) массив тегов, запрещенных к передаче в генерируемый YML.
  • cdata(array('description')) массив тегов, передаваемых с форматированием в виде блока символьных данных — CDATA, по умолчанию array(). Если длина кода превышает установленные лимиты, будет произведено удаление тегов и сокращение текста до установленных лимитов.
  • removeForbiddenTag(name) удалить тег из списка запрещенных к передаче в генерируемый YML.
  • modifications(TRUE|FALSE) экспортировать модификации, по умолчанию TRUE.
  • media(TRUE|FALSE) выгружать изображения из библиотеки, по умолчанию FALSE.
  • closed(TRUE|FALSE) выгружать закрытые товаров, по умолчанию FALSE.
  • surcharge(200|'20%') дополнительная наценка на все товары, может быть указана в абсолютном значении, либо процентом, по умолчанию 0.
  • rootItems(TRUE|FALSE) экспортировать корневые товары, по умолчанию FALSE.
  • groupModifications(TRUE|FALSE) группировать модификации (атрибут group_id у offer, используется только в категориях Одежда, обувь и аксессуары, Мебель, Косметика, парфюмерия и уход, Детские товары, Аксессуары для портативной электроники), по умолчанию FALSE.
  • recommended(TRUE|FALSE) экспортировать рекомендованные товары, по умолчанию FALSE.
  • checkAvailable(TRUE|FALSE) проверять остаток на складе, по умолчанию TRUE. Если FALSE, то товар будет выгружаться доступным независимо от остатка на складе.
  • checkRest(TRUE|FALSE) не экспортировать товары с нулевым остатком, по умолчанию FALSE. Если TRUE, то товар будет выгружаться только при наличии остатка на складе.
  • deliveryOptions(TRUE|FALSE) условия доставки, по умолчанию TRUE. У самого магазина должно быть указано хотя бы одно условие доставки.
  • model('ADV'|'DBS'|'FBY'|'FBY+'|'FBS') модель размещения на Маркете, влияет на выгружаемые теги, по умолчанию не задана.
  • type('offer'|'vendor.model'|'book'|'audiobook'|'artist.title'|'tour'|'event-ticket') тип товара, по умолчанию 'offer'
  • onStep(3000) количество товаров, выбираемых запросом за 1 шаг, по умолчанию 500
  • stdOut() поток вывода, может использоваться для записи результата в файл. По умолчанию Core_Out_Std
  • sno() система налогообложения (СНО) магазина. По умолчанию OSN — общая система налогообложения (ОСН).
  • delay() временная задержка в микросекундах, используется на виртуальных хостингах с ограничением на ресурсы в единицу времени, по умолчанию 0. значение 10000 - 0,01 секунда.
  • mode('between'|'offset') вариант перебора элементов, по умолчанию 'between'. Если у вас большая разница между идентификаторами товаров или групп, выберите 'offset'.
  • priceMode('item'|'shop') режим формирования цен, по умолчанию 'item'. Если необходимо выгружать товары в валюте магазина, укажите 'shop'.
  • outlets(array()) [Покупка на Яндекс.Маркете] массив соответствия ID склада в системе и ID точки продаж в Яндекс.Маркет.
  • paymentMethod(array('YANDEX' => 17, 'APPLE_PAY' => 18, 'GOOGLE_PAY' => 19, 'CARD_ON_DELIVERY' => 2, 'CASH_ON_DELIVERY' => 1)) [Покупка на Яндекс.Маркете] массив соответствия способов оплаты ('YANDEX', 'APPLE_PAY', 'GOOGLE_PAY', 'CARD_ON_DELIVERY', 'CASH_ON_DELIVERY') и ID платежных систем в системе управления.
  • token(string) [Покупка на Яндекс.Маркете] токен
  • request(string) [Покупка на Яндекс.Маркете] данные запроса, если заданы, то используются вместо присланного запроса
  • marketMode(NULL|'catalog'|'terms') Вы можете использовать общий файл для добавления товаров и для управления условиями размещения в магазинах. Но можно сделать отдельные файлы: в файле с добавлением передавать только общие параметры товаров ->marketMode('catalog'), а в файлах с условиями размещения ->marketMode('terms') — только параметры для размещения в магазинах.
  • utm_source() определяет рекламодателя, например, market
  • utm_medium() определяет рекламный или маркетинговый канал (цена за клик, баннер, рассылка по электронной почте).
  • debug(TRUE|FALSE) фиксировать в логах поступаемые запросы, по умолчанию FALSE.

Убрать индексацию модификаций при выгрузке из 1С

Добавить хук в файл bootstrap.php в корне сайта
Core_Event::attach('Shop_Item_Import_Cml_Controller.onAfterImportShopItem', array('HostCMS_Shop_Item_Modification', 'onAfterImportShopItem'));


static public function onAfterImportShopItem($oShop_Item_Import_Cml_Controller, $args)
    {
        list($oShopItem, $oXmlItem) = $args;


if ($oShopItem->modification_id)
{
if ($oShopItem->yandex_market /*|| $yandex_market*/)
{
$oShopItem->yandex_market = 0;
}


if ($oShopItem->indexing /*|| $indexing*/)
{
$oShopItem->indexing = 0;
}


$oShopItem->save();
}
}
Теперь при обмене с 1С, если была создана модификация, то для неё будет сниматься выгрузка в Я.Маркет и индексация.

Экспорт в YML файл определённых групп товаров

Если нужно отправить в YML файл только товары из определенных групп, меняем стандартный код ТДС (Экспорт в Я.Маркет) на этот:
<?php
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));
// $oCore_Out_File = new Core_Out_File();
// $oCore_Out_File->filePath(CMS_FOLDER . "yandexmarket.xml");
$Shop_Controller_YandexMarket = new Shop_Controller_YandexMarket($oShop);
// $Shop_Controller_YandexMarket->stdOut($oCore_Out_File);
$Shop_Controller_YandexMarket

 ->token(Core_Array::get(Core_Page::instance()->libParams, 'token', ''))
 ->outlets(TRUE)
 ->parseUrl()
 ->model('DBS') 
 ->priceMode('shop')
 ->additionalImages(array('photo'))
 ->groupModifications(FALSE)
 ->modifications(TRUE);

$Shop_Controller_YandexMarket
   ->shopItems()
  ->queryBuilder()
   ->where('shop_items.shop_group_id', 'IN', array(1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465));

   $Shop_Controller_YandexMarket->show();

exit();

Если нужно несколько YML файлов по разным группам товаров, то создаём в параметрах ТДС новую переменную Idgroups. Назовём её "Массив групп каталога". Тогда ТДС будет иметь вид:

<?php
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));
$IDgroups = explode(',' , Core_Array::get(Core_Page::instance()->libParams, 'Idgroups'));

// $oCore_Out_File = new Core_Out_File();
// $oCore_Out_File->filePath(CMS_FOLDER . "yandexmarket.xml");

$Shop_Controller_YandexMarket = new Shop_Controller_YandexMarket($oShop);
// $Shop_Controller_YandexMarket->stdOut($oCore_Out_File);

$Shop_Controller_YandexMarket
->token(Core_Array::get(Core_Page::instance()->libParams, 'token', ''))
->outlets(TRUE)
->parseUrl()
->model('DBS') 
->priceMode('shop')
->additionalImages(array('photo'))
->itemsProperties(array(150, 151, 79)) 
->groupModifications(FALSE)
->modifications(TRUE);

$Shop_Controller_YandexMarket
   ->shopItems()
   ->queryBuilder()
   ->where('shop_items.shop_group_id', 'IN', $IDgroups);

   $Shop_Controller_YandexMarket->show();

exit();

При создании узла структуры для YML файла появится поле, в которое можно вписать группы каталога, для вывода их в экспортном файле.

Экспорт прайс-листа в Excel

Для автоматической генерации прайс-листа в формате Excel необходимо загрузить PHPExcel и распаковать его в корневую директорию.

Обновите код настроек ТДС "Прайс" на следующий:

<?php

$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));

$Shop_Controller_Show = new Shop_Controller_Show($oShop);

$path = Core_Page::instance()->structure->getPath();

$Shop_Controller_Show
	//->pattern(rawurldecode($path) . '({path})(page-{page}/)')
	->pattern(rawurldecode($path) . '({path})({xls})(page-{page}/)')
	->patternExpressions(array(
		'xls' => 'xls\/'
	))
	->addEntity(
		Core::factory('Core_Xml_Entity')
			->name('path')
			->value($path)
	)
	->limit(500)
	->parseUrl();

// Генерация Excel прайса
class HostCMS_Excel extends Core_Servant_Properties
{
	/**
	 * Allowed object properties
	 * @var array
	 */
	protected $_allowedProperties = array(
		'title',
		'filename',
	);

	/**
	 * excelObject
	 * @var object
	 */
	protected $_excelObject = NULL;

	/**
	 * excelSheetObject
	 * @var object
	 */
	protected $_excelSheetObject = NULL;

	/**
	 * excelWriterObject
	 * @var object
	 */
	protected $_excelWriterObject = NULL;

	/**
	 * Shop_Model
	 * @var object
	 */
	protected $_shop = NULL;

	protected $_cell = 2;

	/**
	 * Constructor.
	 */
	public function __construct($objPHPExcel, Shop_Model $oShop)
	{
		parent::__construct();

		$this->_excelObject = $objPHPExcel;

		$this->_shop = $oShop;

		$this->title = 'price';
		$this->filename = 'file';

		// set default font
		$this->_excelObject->getDefaultStyle()->getFont()->setName('Calibri');

		// set default font size
		$this->_excelObject->getDefaultStyle()->getFont()->setSize(10);

		// writer already created the first sheet for us, let's get it
		$this->_excelSheetObject = $this->_excelObject->getActiveSheet();

		// create the writer
		$this->_excelWriterObject = PHPExcel_IOFactory::createWriter($this->_excelObject, "Excel5");

		// autosize the columns
		$this->_excelSheetObject->getColumnDimension('A')->setAutoSize(TRUE);
		$this->_excelSheetObject->getColumnDimension('B')->setAutoSize(TRUE);
		$this->_excelSheetObject->getColumnDimension('C')->setAutoSize(TRUE);
	}

	/**
	 * File output.
	 */
	public function output()
	{
		// rename the sheet
		$this->_excelSheetObject->setTitle($this->title);

		// write header
		$this->header($this->_excelSheetObject);

		$aShop_Groups = $this->fillShopGroup($this->_shop->id, 0);

		foreach ($aShop_Groups as $iShopGroupId => $sShopGroupName)
		{
			$this->_excelSheetObject->getStyle('A' . $this->_cell)->getFont()->setBold(TRUE);

			$this->_excelSheetObject->getCell('A' . $this->_cell)->setValue($sShopGroupName);

			$this->_cell++;

			$this->items(intval($iShopGroupId));
		}

		// Setting the header type
		header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		header('Content-Disposition: attachment;filename="' . $this->filename . '.xls"');
		header('Cache-Control: max-age=0');

		$this->_excelWriterObject->save('php://output');
	}

	/**
	 * Create header row.
	 */
	public function header($oSheet)
	{
		// let's bold and size the header font and write the header
		// as you can see, we can specify a range of cells, like here: cells from A1 to A4
		$oSheet->getStyle('A1:C1')->getFont()->setBold(TRUE)->setSize(12);

		$oSheet->getCell('A1')->setValue('Наименование');
		$oSheet->getCell('B1')->setValue('Артикул');
		$oSheet->getCell('C1')->setValue('Цена');

		return $oSheet;
	}

	/**
	 * Create items row.
	 */
	public function items($iShopGroupId)
	{
		$offset = 0;
		$limit = 100;

		$sCurrency = $this->_shop->Shop_Currency->name;

		$oShop_Group = $this->_shop->Shop_Groups->getById($iShopGroupId);

		$Shop_Item_Controller = new Shop_Item_Controller();

		if (Core::moduleIsActive('siteuser'))
		{
			$oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();

			if ($oSiteuser)
			{
				$Shop_Item_Controller->siteuser($oSiteuser);
			}
		}

		if (!is_null($oShop_Group->id))
		{
			do {
				$oShop_Items = $oShop_Group->Shop_Items;
				$oShop_Items->queryBuilder()
					->where('shop_items.active', '=', 1)
					->offset($offset)
					->limit($limit);

				$aShop_Items = $oShop_Items->findAll(FALSE);

				foreach ($aShop_Items as $oShop_Item)
				{
					// Shortcut
					$iShortcut = $oShop_Item->shortcut_id;

					if ($iShortcut)
					{
						$oShop_Item = $oShop_Item->Shop_Item;
					}

					$aPrice = $Shop_Item_Controller->getPrices($oShop_Item);

					$price = Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
						$oShop_Item->Shop_Currency,
						$oShop_Item->Shop->Shop_Currency) * $aPrice['price_discount'];

					$sPrice = $price . ' ' . $sCurrency;

					$this->_excelSheetObject->getCell('A' . $this->_cell)->setValue($oShop_Item->name);
					$this->_excelSheetObject->getCell('B' . $this->_cell)->setValue($oShop_Item->marking);
					$this->_excelSheetObject->getCell('C' . $this->_cell)->setValue($sPrice);

					$this->_cell++;
				}

				$offset += $limit;
			}
			while (count($aShop_Items));
		}

		return $this;
	}

	/**
	 * Shop groups tree
	 * @var array
	 */
	protected $_aGroupTree = array();

	/**
	 * Build visual representation of group tree
	 * @param int $iShopId shop ID
	 * @param int $iShopGroupParentId parent ID
	 * @param int $aExclude exclude group ID
	 * @param int $iLevel current nesting level
	 * @return array
	 */
	public function fillShopGroup($iShopId, $iShopGroupParentId = 0, $aExclude = array(), $iLevel = 0)
	{
		$iShopId = intval($iShopId);
		$iShopGroupParentId = intval($iShopGroupParentId);
		$iLevel = intval($iLevel);

		if ($iLevel == 0)
		{
			$aTmp = Core_QueryBuilder::select('id', 'parent_id', 'name')
				->from('shop_groups')
				->where('shop_id', '=', $iShopId)
				->where('deleted', '=', 0)
				->where('active', '=', 1)
				->orderBy('sorting')
				->orderBy('name')
				->execute()->asAssoc()->result();

			foreach ($aTmp as $aGroup)
			{
				$this->_aGroupTree[$aGroup['parent_id']][] = $aGroup;
			}
		}

		$aReturn = array();

		if (isset($this->_aGroupTree[$iShopGroupParentId]))
		{
			$countExclude = count($aExclude);
			foreach ($this->_aGroupTree[$iShopGroupParentId] as $childrenGroup)
			{
				if ($countExclude == 0 || !in_array($childrenGroup['id'], $aExclude))
				{
					$aReturn[$childrenGroup['id']] = $childrenGroup['name'];
					$aReturn += $this->fillShopGroup($iShopId, $childrenGroup['id'], $aExclude, $iLevel + 1);
				}
			}
		}

		$iLevel == 0 && $this->_aGroupTree = array();

		return $aReturn;
	}
}
	
if (!empty($Shop_Controller_Show->patternParams['xls']))
{
	require_once(CMS_FOLDER . 'PHPExcel/PHPExcel.php');

	// create new PHPExcel object
	$objPHPExcel = new PHPExcel();

	$HostCMS_Excel = new HostCMS_Excel($objPHPExcel, $oShop);
	$HostCMS_Excel
		->title('Прайс ' . $oShop->name)
		->filename('price')
		->output();
	exit();
}
// /Excel

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

Обновите код ТДС "Прайс" на следующий:

<?php

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

$Shop_Controller_Show
   ->shopItems()
   ->queryBuilder()
   ->clearOrderBy()
   ->leftJoin('shop_groups', 'shop_groups.id', '=', 'shop_items.shop_group_id')
   ->where('shop_items.active', '=', 1)
   ->open()
   ->where('shop_groups.active', '=', 1)
   ->setOr()
   ->where('shop_groups.active', 'IS', NULL)
   ->where('shop_items.modification_id', '=', 0)
   ->close()
   ->clearOrderBy()
   ->orderBy('shop_items.shop_group_id')
   ->orderBy('shop_items.name');

$Shop_Controller_Show
	->shopGroups()
	->queryBuilder()
	->where('shop_groups.active', '=', 1)
	->clearOrderBy()
	->orderBy('shop_groups.id');

$xslName = Core_Array::get(Core_Page::instance()->libParams, 'xsl');

$Shop_Controller_Show
	->xsl(
		Core_Entity::factory('Xsl')->getByName($xslName)
	)
	->groupsMode('all')
	->itemsProperties(TRUE)
	->group(FALSE)
	->show();

Прайс-лист будет доступен по адресу http://ваш_сайт/shop/price/xls/