HOSTCMS v.6. Полезные php коды

HOSTCMS v.6. Полезные php коды

Некоторые php коды для вывода данных на странице сайта, которые помогут при вёрстrе сайта на движке HostCMS.

Содержание:

  1. Для структуры сайта
  2. Для интернет-магазина
  3. Для информационных систем
  4. Для Меток
  5. Для комментариев (отзывов)

Чтобы в XML передавались Дополнительные свойства элемента или группы

  ->itemsProperties(TRUE)
  ->groupsProperties(TRUE)

Для структуры сайта

— Вывод меню на основе вложенных узлов структуры

Подходит для многоязычных версий. Выводим подменю структуры с конкретным id.

<?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show (
Core_Entity::factory ('Site', CURRENT_SITE));
$Structure_Controller_Show->xsl (Core_Entity::factory ('Xsl')
->getByName ('ВерхнееМеню')) ->parentId(248)//заменить на свой ID ->menu(1)
->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 ('МагазинГруппыТоваровНаГлавной1')
)
->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 ('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', 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 ('МагазинСписокПроизводителей1'))
->groupsMode ('all')
//->itemsForbiddenTags(array ('text'))
->itemsProperties(TRUE)
->group(0)
->limit(0)
->show();
}
? > 
Показ нескольких товаров из той же категории, что и текущий товар
Добавляем в ТДС магазина перед блоком с ->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>
Самые популярные товары
Добавляем в макет страницы Популярные товары
<?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(); // отображаем список
}
?>
Вывод товаров со специальной ценой 
<?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();
          ?>
— Меняем ID макета для товара
Данный код добавляем в конце кода настроек ТДС интернет-магазина
if (isset($Shop_Controller_Show->item) && $Shop_Controller_Show->item)
{
Core_Page::instance()->template(
Core_Entity::factory('Template', 12)
);
}
— Не выводим товары, которых нет в наличии (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');
Добавить название группы в карточке товара
В ТДС интернет-магазина добавляем
$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)
  );
Добавить название группы товара в Корзину
в ТДС перед:
$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'));
ДЛЯ ЯРЛЫКА ТОВАРА ДОБАВЛЯЕМ В 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);
  }
}
Добавляем Статичный Документ в XML
Код добавляем в ТДС Интернет-магазина
$document = Core_Entity::factory('Document', 19)->Document_Versions->getCurrent()->loadFile(); // создаём переменную, где 19 - ID Документа (пропишите id нужного документа)

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

// Либо более короткий вариант

$Shop_Controller_Show->addEntity(
  Core::factory('Core_Xml_Entity')
      ->name('my_document')->value(
        Core_Entity::factory('Document', 123)->text
      )
);
 Добавление новых узлов в XML
// добавляем ID текущей группы
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 некоторых данных
->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();
В hostCMS 7 версии появились новые методы
  • addAllowedTags('/node/path', array('description')) массив тегов для элементов, указанных в первом аргументе, разрешенных к передаче в генерируемый XML
  • addForbiddenTags('/node/path', array('description')) массив тегов для элементов, указанных в первом аргументе, запрещенных к передаче в генерируемый XML

Для информационных систем

— Ограничение по Дополнительному свойству в Инфосистеме

 <?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'))
->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 ();
? >

Для Меток

Метки магазина
<?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('ОблакоТэговМагазин')
                    )
                ->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())
	);
?>

Для комментариев/Отзывов

Вывод комментариев на странице
<?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
}
?>
Комментарии интернет-магазина
<?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
        }
      ?>

Понравилась статья?
Будем признательны, если поделитесь в соцсетях или мессенджерах, а также присоединитесь к нашей группе Вконтакте. Будет интересно!

Другие статьи по теме:

HOSTCMS v.6. Правильная семантическая микроразметка
HOSTCMS v.6. Правильная семантическая микроразметка

Не будем углубляться в терминологию и описание того, что означает микроразметка, т.к. об этом уже много чего написано и я беру за аксиому, что вы об этом уже знаете, раз читаете данную статью. Задача статьи описать более конкретный случай, а именно - использование микроразметки в XSL шаблонах HostCMS...

Разметка Open Graph для HostCMS v.6
Разметка Open Graph для HostCMS v.6

Для начала узнаем, что такое Open Graph? Open Graph - это протокол, который формирует вид внешней ссылки в социальных сетях. Первоначально этот протокол был разработан для Facebook, однако сейчас используется и в других соцсетях.

Как создать сайт?
Как создать сайт?

Многие начинающие пользователи интернета задают себе данную фразу. Но не у всех выходит добиться желаемого... Всё связано с различными стереотипами, например, о том, что для создания сайта или личной странички в интернете требуются навыки и знание программирования... Прочитайте статью и создайте свой сайт.

Используем готовые шаблоны для сайтов
Используем готовые шаблоны для сайтов

Если вы сами не дизайнер и не можете пользоваться графическими программами или у вас нет средств на то, чтобы заказать разработку дизайна сайта профессиональному веб дизайнеру, или сайт нужен очень срочно, то в этом случае вам помогут готовые шаблоны сайтов.

HOSTCMS v.6. Боковое выпадающее меню на CSS для каталога товаров
HOSTCMS v.6. Боковое выпадающее меню на CSS для каталога товаров

Создадим раздвижное меню для каталога товаров с несколькими уровнями вложенности разделов. Меню будет открыто в основных разделах, лежащих в корневом каталоге. В принципе, вам нужно просто скопировать шаблон, CSS стили и пользоваться этим меню...

9 шагов для создания веб-сайта на HostCMS
9 шагов для создания веб-сайта на HostCMS

Вы можете создать веб-сайт менее чем за 1 час. Вам также не нужно быть техническим мастером.

Неважно, для бизнеса это или для удовольствия. Вам не нужен модный дизайнер или дорогой разработчик. Просто следуйте простым нашим шагам, и вы будете онлайн в кратчайшие сроки.

Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам обеспечивать вас лучшим контентом. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Отключение cookie-файлов может привести к неполадкам в работе сайта. Продолжая пользоваться сайтом без изменения настроек, вы даете согласие на использование ваших cookie-файлов. Это совершенно безопасно!