HOSTCMS v.6
ИНТЕРНЕТ-МАГАЗИН
PHP КОДЫ вывода данных
->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)
{
$oShop_Group = Core_Entity::factory('Shop_Group', $Shop_Controller_Show->group);
Core_Page::instance()->title($oShop_Group->seo_title != ''
? $oShop_Group->seo_title
: $oShop_Group->name);
Core_Page::instance()->description($oShop_Group->seo_description != ''
? $oShop_Group->seo_description
: $oShop_Group->name);
Core_Page::instance()->keywords($oShop_Group->seo_keywords != ''
? $oShop_Group->seo_keywords
: $oShop_Group->name);
}
if ($Shop_Controller_Show->item)
{
$oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item);
Core_Page::instance()->title($oShop_Item->seo_title != ''
? $oShop_Item->seo_title
: $oShop_Item->name);
Core_Page::instance()->description($oShop_Item->seo_description != ''
? $oShop_Item->seo_description
: $oShop_Item->name);
Core_Page::instance()->keywords($oShop_Item->seo_keywords != ''
? $oShop_Item->seo_keywords
: $oShop_Item->name);
}
Core_Page::instance()->object = $Shop_Controller_Show;
Добавление новых узлов в XML
if (is_object(Core_Page::instance()->object) && get_class(Core_Page::instance()->object) == 'Shop_Controller_Show')
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('current_group_id')
->value(intval(Core_Page::instance()->object->group))
);
}
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('ТекущаяГруппа')
->value($Shop_Controller_Show->group)
);
Добавляем Статичный Документ в XML
Код добавляем в ТДС Интернет-магазина
вариант 1
Создаем в параметрах ТДС переменную document_id со следующими данными
Название параметра - Документ для гарантии
Название переменной - document_id
Тип - SQL запрос
SQL-запрос
SELECT * FROM documents WHERE site_id = {SITE_ID}
Поле заголовка - name
Поле значания - id
Далее в код ТДС вставляем следующий код
// для загрузки документа гарантии
$iDocumentID = intval(Core_Array::get(Core_Page::instance()->libParams, 'document_id'));
$oDocument = Core_Entity::factory('Document')->find($iDocumentID);
if ($Shop_Controller_Show->item)
{
if (!is_null($oDocument) && $oDocument->id){
ob_start();
$oDocument->Document_Versions->getCurrent()->execute();
$Shop_Controller_Show->addEntity(Core::factory('Core_Xml_Entity')->name('page_content')->value(ob_get_clean()));
}
}
вариант 2
// для ajax загрузки статичного документа
$document = Core_Entity::factory('Document', 19)->Document_Versions->getCurrent()->loadFile(); // 19 Заменить на ID Документа
if ($Shop_Controller_Show->item)
{
$Shop_Controller_Show
// добавляем собственный тег для вывода документа
->addEntity(Core::factory('Core_Xml_Entity')
->name('document')
->value($document));
}
вариант 3
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('my_document')->value(
Core_Entity::factory('Document', 123)->text
)
);
ДЛЯ ЯРЛЫКА ДОБАВЛЯЕМ В XML ID РОДИТЕЛЬСКОЙ ГРУППЫ
*Добавляем в самом начале кода настроек ТДС показа интернет-магазина
Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Observer', 'onBeforeGetXml'));
class Shop_Item_Observer
{
static public function onBeforeGetXml($object, $args)
{
$object->addXmlTag('parent_group_id', $object->shop_group_id);
}
}
Добавить название группы товара в Корзину
в ТДС. Перед:
$Shop_Cart_Controller_Show
->couponText(
Core_Str::stripTags(Core_Array::get(Core_Array::get($_SESSION, 'hostcmsOrder', array()), 'coupon_text'))
)
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
)
->show();
добавить:
class Shop_Item_Cart_Observer
{
static public function onBeforeGetXml($object, $args)
{
if (is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Shop_Cart_Controller_Show')
{
$oShop_Group = Core_Entity::factory('Shop_Group', intval($object->shop_group_id));
if (!is_null($oShop_Group))
{
// Добавить новый тег, содержащий имя группы товара
$object->addXmlTag('shop_group_name', $oShop_Group->name);
}
}
}
}
// Add shop_item observer
Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Cart_Observer', 'onBeforeGetXml'));
Этот хук добавит в каждый shop_item в корзине новый тег shop_group_name. В котором будет название группы товара. После такой вывод:
<xsl:value-of disable-output-escaping="yes" select="shop_item/shop_group_name"/>
Добавить название группы в карточке товара
В ТДС добавляем
$oShop_Group = Core_Entity::factory('Shop_Group', intval($Shop_Controller_Show->group));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('shop_group_name')
->value($oShop_Group->name)
);
Показ товаров только с ценой (больше 0)
// Показываем только с положительной ценой
$Shop_Controller_Show
->shopItems()
->queryBuilder()
->where('shop_items.price', '>', 0);
Не выводим товары, которых нет в наличии (0 на всех складах)
$Shop_Controller_Show
->shopItems()
->queryBuilder()
->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
->having('SUM(shop_warehouse_items.count)', '>', 0)
->groupBy('shop_items.id');
Выводить товары с сортировкой по цене и показом в конце списка товаров, которых нет в наличии на складе.
$Shop_Controller_Show
->shopItems()
->queryBuilder()
->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id')
->clearOrderBy()
->orderBy('SIGN(shop_warehouse_items.count)', 'DESC')
->orderBy('shop_items.price','ASC');
Меняем ID макета для товара
if (isset($Shop_Controller_Show->item) && $Shop_Controller_Show->item)
{
Core_Page::instance()->template(
Core_Entity::factory('Template', 12)
);
}
Core_Page::instance()->template(Core_Entity::factory('Template', 54)); // указываем id макета для Товара или ИнфоэлементаВывод неактивных товаров
Показ товаров в клиентском разделе происходит в типовой динамической странице «Интернет-магазин» с использованием контроллераShop_Controller_Show, при этом по умолчанию отображаются только активные товары.
Опция, регулирующая вид отображаемых товаров, называется itemsActivity() и может иметь 3 значения:
'active' — только активные (по умолчанию);
'inactive' — только неактивные;
'all' — все.
$Shop_Controller_Show
->itemsActivity('all')
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
)
...
->show();Динамическая подгрузка контента на страницу (ajax-подгрузка)
<xsl:if test="not(/shop/ajax/node())">
<SCRIPT type="text/javascript">
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
$(function() {
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() >= $(document).height() - 100) {
$('div.products-grid-ajax a.load-more-items')
.click()
.prop('onclick', null)
.off('click');
}
});
});
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
</xsl:if>
<!-- Выводим товары магазина -->
<div class="row products-grid">
<xsl:apply-templates select="shop_item" />
</div>
<!-- Выводим товары магазина -->
<div class="row products-grid products-grid-ajax">
<xsl:apply-templates select="shop_item" />
<xsl:if test="count(/shop/shop_item) = /shop/limit">
<div class="col-xs-12">
<a class="btn btn-primary full-width margin-top-30 load-more-items" onclick="$(this).find('i').addClass('fa-spin'); $.showShopItems('{.//shop_group[@id=$group]/url}page-{/shop/page + 2}/')">
<i class="fa fa-refresh"></i>
Показать еще
</a>
</div>
</xsl:if>
</div>
$(function() {
$.extend({
showShopItems: function(path){
jQuery.ajax({
url: path,
type: 'POST',
data: { 'ajaxLoadItems': true },
dataType: 'json',
success: function(answer){
var jDiv = $('<div>').html(answer),
jDivItems = $('div.products-grid-ajax');
jDivItems.find('a.load-more-items').remove();
jDivItems.append(
jDiv.find('div.products-grid-ajax').children()
);
// Pagination
$('.pagination').after(jDiv.find('.pagination')).remove();
}
});
}
});
});
$Shop_Controller_Show
->limit($limit)
->parseUrl();
// Ajax upload items
if (!is_null(Core_Array::getRequest('ajaxLoadItems')))
{
$xslName = Core_Array::get(Core_Page::instance()->libParams, 'shopXsl');
ob_start();
$Shop_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
);
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('ajax')
->value(1)
);
$Shop_Controller_Show->show();
Core::showJson(ob_get_clean());
}
Добавление цен в других валютах в карточке товара
Обработчик размещаем в коде типовой динамической страницы.
// Если идет показ товара
if ($Shop_Controller_Show->item){
class Shop_Item_Observer_Prices
{
static public function onBeforeGetXml($object, $args)
{
$oPrices = Core::factory('Core_Xml_Entity')
->name('prices');
$oShop = $object->Shop;
$aShop_Currencies = Core_Entity::factory('Shop_Currency')->findAll();
foreach ($aShop_Currencies as $oShop_Currency)
{
$fCurrencyCoefficient = $object->shop_currency_id > 0 && $oShop_Currency->id > 0
? Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency(
$object->Shop_Currency, $oShop_Currency
)
: 0;
// Prices
$oShop_Item_Controller = new Shop_Item_Controller();
if (Core::moduleIsActive('siteuser'))
{
$oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();
$oSiteuser && $oShop_Item_Controller->siteuser($oSiteuser);
}
//$oShop_Item_Controller->count($this->_cartQuantity);
$aPrices = $oShop_Item_Controller->getPrices($object);
$oPrices->addEntity(
Core::factory('Core_Xml_Entity')
->name('price')
->addEntity(
Core::factory('Core_Xml_Entity')
->name('value')
->value(
Shop_Controller::instance()->round($aPrices['price_discount'] * $fCurrencyCoefficient)
)
)
->addEntity(
$oShop_Currency
)
);
}
$object->addEntity($oPrices);
}
}
Core_Event::attach('shop_item.onBeforeGetXml', array('Shop_Item_Observer_Prices', 'onBeforeGetXml'));}Добавляем в Личный кабинет показ заказанных товаров
Код ТДС "Пользователи сайта"
<?php
if (!Core::moduleIsActive('siteuser'))
{
?>
<h1>Пользователи сайта</h1>
<p>Функционал недоступен, приобретите более старшую редакцию.</p>
<p>Модуль «<a href="http://www.hostcms.ru/hostcms/modules/users/">Пользователи сайта</a>» доступен в редакциях «<a href="http://www.hostcms.ru/hostcms/editions/corporation/">Корпорация</a>» и «<a href="http://www.hostcms.ru/hostcms/editions/business/">Бизнес</a>».</p>
<?php
return ;
}
$Siteuser_Controller_Show = Core_Page::instance()->object;
$xslUserAuthorization = Core_Array::get(Core_Page::instance()->libParams, 'userAuthorizationXsl');
$oSiteuser = $Siteuser_Controller_Show->getEntity();
if ($oSiteuser->id)
{
if (Core::moduleIsActive('shop'))
{
/* Последние заказы пользователя */
$oShop_Orders = Core_Entity::factory('Shop_Order');
$oShop_Orders
->queryBuilder()
->leftJoin('shops', 'shop_orders.shop_id', '=', 'shops.id')
->where('shop_orders.siteuser_id', '=', $oSiteuser->id)
->where('shops.site_id', '=', CURRENT_SITE)
->limit(6)
->clearOrderBy()
->orderBy('shop_orders.id', 'DESC');
$aShop_Orders = $oShop_Orders->findAll(FALSE);
foreach ($aShop_Orders as $oShop_Order)
{
$sum = $oShop_Order->sum();
$aShop_Order_Items = $oShop_Order->Shop_Order_Items->findAll(FALSE);
foreach ($aShop_Order_Items as $oShop_Order_Item)
{
$oShop_Order->addEntity(
$oShop_Order_Item->clearEntities()
);
}
$oShop_Order
->showXmlOrderStatus(TRUE)
->showXmlDelivery(FALSE);
//Currency
$oShop_Currency = Core_Entity::factory('Shop_Currency', $oShop_Order->shop_currency_id);
if (!is_null($oShop_Currency))
{
$oShop_Order->addEntity(
$oShop_Currency
);
}
$Siteuser_Controller_Show->addEntity(
$oShop_Order
->addEntity(
Core::factory('Core_Xml_Entity')
->name('sum')
->value($sum)
)
);
}
}
if (Core::moduleIsActive('maillist'))
{
/* Почтовые рассылки */
$aMaillists = $oSiteuser->getAllowedMaillists();
if (count($aMaillists))
{
$Siteuser_Controller_Show->addEntity(
$oMaillistEntity = Core::factory('Core_Xml_Entity')
->name('maillists')
);
foreach ($aMaillists as $oMaillist)
{
$oMaillist_Siteuser = $oSiteuser->Maillist_Siteusers->getByMaillist($oMaillist->id);
$oMaillistEntity->addEntity(
$oMaillist->clearEntities()
);
if (!is_null($oMaillist_Siteuser))
{
$oMaillist->addEntity(
$oMaillist_Siteuser->clearEntities()
);
}
}
}
}
if (Core::moduleIsActive('helpdesk'))
{
$aHelpdesks = Core_Entity::factory('Site', CURRENT_SITE)->Helpdesks->findAll(FALSE);
if (count($aHelpdesks))
{
$Siteuser_Controller_Show->addEntity(
$oTicketEntity = Core::factory('Core_Xml_Entity')
->name('helpdesk_tickets')
);
$oHelpdesk = $aHelpdesks[0];
$oHelpdesk_Tickets = $oHelpdesk->Helpdesk_Tickets;
$oHelpdesk_Tickets
->queryBuilder()
->where('helpdesk_tickets.siteuser_id', '=', $oSiteuser->id)
->limit(5)
->clearOrderBy()
->orderBy('helpdesk_tickets.id', 'DESC');
$aHelpdesk_Tickets = $oHelpdesk_Tickets->findAll(FALSE);
foreach ($aHelpdesk_Tickets as $oHelpdesk_Ticket)
{
$oTicketEntity->addEntity(
$oHelpdesk_Ticket->clearEntities()
->showXmlSiteuser(FALSE)
);
$oHelpdesk_Messages = $oHelpdesk_Ticket->Helpdesk_Messages;
$oHelpdesk_Messages
->queryBuilder()
->clearOrderBy()
->orderBy('helpdesk_messages.id', 'ASC')
->limit(1);
$aHelpdesk_Messages = $oHelpdesk_Messages->findAll(FALSE);
if (count($aHelpdesk_Messages))
{
$oHelpdesk_Message = $aHelpdesk_Messages[0];
$oHelpdesk_Ticket->addEntity(
Core::factory('Core_Xml_Entity')
->name('helpdesk_ticket_subject')
->value($oHelpdesk_Message->subject)
);
}
}
}
}
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Личная информация')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('registration/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/info.png')
)
);
if (Core::moduleIsActive('maillist'))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Почтовые рассылки')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('maillist/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/maillist.png')
)
);
}
if (Core::moduleIsActive('helpdesk'))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Служба техподдержки')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('helpdesk/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/helpdesk.png')
)
);
}
if (Core::moduleIsActive('shop'))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Мои заказы')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('order/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/order.png')
)
);
if (Core::moduleIsActive('siteuser'))
{
$oAffiliate_Plans = Core_Entity::factory('Site', CURRENT_SITE)->Affiliate_Plans;
$aSiteuserGroupId = array();
$oSiteuser_Groups = $oSiteuser->Siteuser_Groups->findAll();
foreach ($oSiteuser_Groups as $oSiteuser_Group)
{
$aSiteuserGroupId[] = $oSiteuser_Group->id;
}
if (count($aSiteuserGroupId))
{
$oAffiliate_Plans->queryBuilder()
->where('siteuser_group_id', 'IN', $aSiteuserGroupId);
$aAffiliate_Plans = $oAffiliate_Plans->findAll();
if (count($aAffiliate_Plans))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Партнерские программы')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('affiliats/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/partner.png')
)
);
}
}
}
}
if (Core::moduleIsActive('siteuser'))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Лицевой счет')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('account/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/account.png')
)
);
}
if (Core::moduleIsActive('shop'))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Мои объявления')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('my_advertisement/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/bulletin-board.png')
)
);
}
if (Core::moduleIsActive('message'))
{
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Мои сообщения')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('my_messages/')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/message.png')
)
);
}
$Siteuser_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('item')
->addEntity(
Core::factory('Core_Xml_Entity')->name('name')->value('Выход')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('path')->value('?action=exit')
)
->addEntity(
Core::factory('Core_Xml_Entity')->name('image')->value('/images/user/exit.png')
)
);
}
$Siteuser_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName($xslUserAuthorization)
)
->showGroups(true)
->show();
// Добавляем заказы Пользователя
if ($oSiteuser->id)
{
$oShop = Core_Entity::factory('Shop', 1);
$Shop_Order_Controller_Show = new Shop_Order_Controller_Show($oShop);
$Shop_Order_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName('СписокЗаказовВЛичномКабинетеNewVersion')
)
->limit(15)
->parseUrl()
->itemsProperties(TRUE)
->show();
}
XSL "СписокЗаказовВЛичномКабинетеNewVersion"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="no" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
<xsl:template match="/">
<xsl:apply-templates select="shop"/>
</xsl:template>
<!-- Шаблон для списка заказов -->
<xsl:template match="shop">
<div class="lk-my-slider">
<p><span>Сделайте наш сервис еще лучше </span> <br />Оставьте отзывы о купленных вами товарах</p>
<div class="row">
<div class="lk-my-slider__main">
<!-- Не показываем доставки и купоны -->
<xsl:apply-templates select="shop_order/shop_order_item[shop_item_id !=0 and type !=1]"/>
<div class="clearfix"></div>
</div>
</div>
</div>
</xsl:template>
<!-- Шаблон для элементов заказа -->
<xsl:template match="shop_order/shop_order_item">
<div class="col-xs-6 col-sm-4 col-md-3 col-lg-13 margin-top-20">
<div class="product-card">
<div class="product-card__img">
<xsl:if test="shop_item/image_small !=''"><a href="{shop_item/url}"><img src="{shop_item/dir}{shop_item/image_small}" alt="" class="shop_img"/></a></xsl:if>
</div>
<!-- /.proguct-card__img -->
<div class="product-card__descr">
<a href="{shop_item/url}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
</div>
<!-- /.product-card__descr -->
</div>
</div>
</xsl:template>
<xsl:template match="shop_currency/code">
<xsl:param name="value" />
<xsl:variable name="spaced" select="format-number($value, '# ###', 'my')" />
<xsl:choose>
<xsl:when test=". = 'USD'">$<xsl:value-of select="$spaced"/></xsl:when>
<xsl:when test=". = 'EUR'">€<xsl:value-of select="$spaced"/></xsl:when>
<xsl:when test=". = 'GBP'">£<xsl:value-of select="$spaced"/></xsl:when>
<xsl:when test=". = 'RUR'"><xsl:value-of select="$spaced"/> <i class="fa fa-ruble"></i></xsl:when>
<xsl:when test=". = 'AUD'">AU$<xsl:value-of select="$spaced"/></xsl:when>
<xsl:when test=". = 'CNY'"><xsl:value-of select="$spaced"/>元</xsl:when>
<xsl:when test=". = 'JPY'"><xsl:value-of select="$spaced"/>¥</xsl:when>
<xsl:when test=". = 'KRW'"><xsl:value-of select="$spaced"/>₩</xsl:when>
<xsl:when test=". = 'PHP'"><xsl:value-of select="$spaced"/>₱</xsl:when>
<xsl:when test=". = 'THB'"><xsl:value-of select="$spaced"/>฿</xsl:when>
<xsl:when test=". = 'BRL'">R$<xsl:value-of select="$spaced"/></xsl:when>
<xsl:when test=". = 'INR'"><xsl:value-of select="$spaced"/><i class="fa fa-inr"></i></xsl:when>
<xsl:when test=". = 'TRY'"><xsl:value-of select="$spaced"/><i class="fa fa-try"></i></xsl:when>
<xsl:when test=". = 'ILS'"><xsl:value-of select="$spaced"/><i class="fa fa-ils"></i></xsl:when>
<xsl:otherwise><xsl:value-of select="$spaced"/> <xsl:value-of select="." /></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Добавляем Инфосистему в код Интернет-магазина
PHP
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');
->xsl(Core_Entity::factory('Xsl')->getByName('БаннерыВИнтернетМагазине')) // Здесь указываем Xsl шаблон для Инфосистемы
->groupsMode('none')
->itemsForbiddenTags([
'text',
'description',
'seo_description',
'seo_keywords',
'seo_title',
])
->group(false)
->itemsPropertiesList(false)
->itemsProperties(true)
->limit(1)
// ->votes(TRUE)
->cache(false)
->show();
}
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('banners')
->value(ob_get_clean())
);
// END ADD
ДОБАВЛЯЕМ ПРОВЕРКУ НА СРОК РАЗМЕЩЕНИЯ ОБЪЯВЛЕНИЯ В ДОСКАХ ОБЪЯВЛЕНИЙ
Дописываем в ТДС "Доска объявлений"
// СРОК РАЗМЕЩЕНИЯ ОБЪЯВЛЕНИЯ
$iTime = Core_Array::getPost('property_136', 0);
$aTimes = array(1013 => 1, 1015 => 3, 1016 => 6, 1017 => 9);
$iTimeMonth = isset($aTimes[$iTime]) ? $aTimes[$iTime] : 1;
$oShop_Item->end_datetime = date('Y-m-d H:i:s', time() + $iTimeMonth * 30 * 24 * 60 * 60);
//~ END
property_136 - ID дополнительного свойства "Срок размещения"
1013 => 1, 1015 => 3, 1016 => 6, 1017 => 9 - ID элементов списка "Срок размещения" (соответственно 1, 3, 6 и 9 месяцев)
КОМПЛЕКТЫ ТОВАРОВ
-- // Добавление товара в корзину
/**
* Комплекты
* Начало >>
*/
$aAssoc = Core_Array::getRequest('addassoc');
if (count($aAssoc))
{
foreach($aAssoc as $assoc)
{
$oShop_Cart_Controller = Shop_Cart_Controller::instance();
$oShop_Cart_Controller
->shop_item_id($assoc)
->quantity(1)
->add();
}
}
/**
* << Конец
*/
/**
* Обработчик решения set-of-goods
*/
var lastCheck="";$(document).ready(function(){function t(){total=parseInt($("#mainprice").data("price")),$("select.associated option").each(function(){$(this).prop("selected")&&$(this).data("price")&&(total+=parseInt($(this).data("price")))}),$("input.associated").each(function(){$(this).prop("checked")&&(total+=parseInt($(this).data("price")))}),totalStr="",totalStr+=total,total=totalStr.replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1 "),$("#bz_price").val(total),$("#mainprice").html(total)}$("input[type='radio'].associated").click(function(){lastCheck=lastCheck==this?($(this).prop("checked",!$(this).prop("checked")),""):this}),$("input.associated").click(function(){t()}),$("select.associated").change(function(){t()}),$("input[type=radio].associated:checked").click(),t(),$("select.associated option:selected").click(),t(),jQuery.extend({kaddIntoCart:function(t,a,e,c){c=c||0;var i="";return $(".associated"+a).each(function(){$(this).prop("checked")&&$.clientRequest({path:t,data:{add:$(this).data("item"),count:1},callBack:function(){},context:$("#little_cart")})}),$("select.associated option").each(function(){$(this).prop("selected")&&(i+="&addassoc[]="+$(this).data("item"))}),c?$.bootstrapAddIntoCart(t,a+i,e):$.addIntoCart(t,a+i,e),!1}})});
var lastCheck = "";
$(document).ready(function() {
function t() {
total = parseInt($("#mainprice").data("price")), $("select.associated option").each(function() {
$(this).prop("selected") && $(this).data("price") && (total += parseInt($(this).data("price")))
}), $("input.associated").each(function() {
$(this).prop("checked") && (total += parseInt($(this).data("price")))
}), totalStr = "", totalStr += total, total = totalStr.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1 "), $("#bz_price").val(total), $("#mainprice").html(total)
}
$("input[type='radio'].associated").click(function() {
lastCheck = lastCheck == this ? ($(this).prop("checked", !$(this).prop("checked")), "") : this
}), $("input.associated").click(function() {
t()
}), $("select.associated").change(function() {
t()
}), $("input[type=radio].associated:checked").click(), t(), $("select.associated option:selected").click(), t(), jQuery.extend({
kaddIntoCart: function(t, a, e, c) {
c = c || 0;
var i = "";
return $(".associated" + a).each(function() {
$(this).prop("checked") && $.clientRequest({
path: t,
data: {
add: $(this).data("item"),
count: 1
},
callBack: function() {},
context: $("#little_cart")
})
}), $("select.associated option").each(function() {
$(this).prop("selected") && (i += "&addassoc[]=" + $(this).data("item"))
}), c ? $.bootstrapAddIntoCart(t, a + i, e) : $.addIntoCart(t, a + i, e), !1
}
})
});
<!--
*
* Комплекты
* Начало >>
-->
<xsl:if test="count(associated/shop_item) > 0">
<div class="associated-block gifts-list clearfix">
<p class="h5 text-center red bold"><i class="fa fa-gift"></i> Выберите подарок: </p>
<div class="slider-similar-wrapper">
<div id="gifts" class="slick-slider">
<xsl:apply-templates select="associated/shop_item" mode="assoc"><xsl:sort select="sorting" data-type="number"/></xsl:apply-templates>
</div>
</div>
<span class="hr"></span>
</div>
</xsl:if>
<!--
* << Конец
-->
МАКЕТ "ВЕРСИЯ ДЛЯ ПЕЧАТИ" С АВТОМАТИЧЕСКОЙ ОТПРАВКОЙ НА ПЕЧАТЬ
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<title><?php Core_Page::instance()->showTitle()?></title>
<meta name="description" content="<?php Core_Page::instance()->showDescription()?>"></meta>
<meta name="keywords" content="<?php Core_Page::instance()->showKeywords()?>"></meta>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta content="text/html; charset=<?php echo SITE_CODING?>" http-equiv="Content-Type"></meta>
<?php Core_Page::instance()->showCss()?>
<!-- jQuery -->
<script type="text/javascript" src="/hostcmsfiles/jquery/jquery.js"></script>
</head>
<body>
<?php Core_Page::instance()->execute()?>
<script type="text/javascript">
$(document).ready(function() {
window.print();
});
</script>
</body>
</html> Меняем название кнопки при добавлении товара в корзину
Идём в Основной макет сайта, во вкладку Javascript, находим фрагмент кода добавления товара в корзину:
// Функции без создания коллекции
$.extend({
...
bootstrapAddIntoCart: function(path, shop_item_id, count){
...
});
Возможно, у вас используется другая функция добавления товара в корзину:
// Функции без создания коллекции
$.extend({
...
AddIntoCart: function(path, shop_item_id, count){
...
});
Добавляем в эту функцию (которая у вас используется), перед закрывающей фигурной скобкой, следующий код:
$('#incart_'+ shop_item_id).removeClass('hidden');
$('#cart_'+ shop_item_id).addClass('hidden');
return false;
Далее находим фрагмент кода:
// Функции без создания коллекции
$.extend({
...
deleteLittleCart: function(path, shop_item_id){
...
},
и добавлем сюда следующий код, перед закрыывающей фигурной скобкой:
$('#incart_'+ shop_item_id).addClass('hidden');
$('#cart_'+ shop_item_id).removeClass('hidden');
Если вы используете библиотеку Bootstrap 5 и выше, то замените hidden на d-none.
Далее идём в XSL-шаблон вывода карточек товара. Это может быть XSL-шаблон МагазинКаталогТоваров, либо отдельный шаблон для карточек и заменяем кнопку "В корзину" на следующие:
<a href="{/shop/url}cart/" id="incart_{@id}" class="incart hidden">
<xsl:if test="@id = /shop/items_in_cart//shop_item/@id">
<xsl:attribute name="class">incart</xsl:attribute>
</xsl:if>
<span class="icon"><i class="fa fa-shopping-cart"></i></span> <span class="button_caption">Оформить заказ</span>
</a>
<a onclick="return $.bootstrapAddIntoCart('{/shop/url}cart/', {@id}, 1)" data-itemId="{@id}" id="cart_{@id}">
<xsl:if test="@id = /shop/items_in_cart//shop_item/@id">
<xsl:attribute name="class">hidden</xsl:attribute>
</xsl:if>
<span class="icon"><i class="fa fa-shopping-basket"></i></span> <span class="button_caption">В корзину</span>
</a>
Из кода видно, что делается проверка на наличие товара в корзине и если товар в корзине, то меняется класс у кнопок. Одна скрывается, другая показывается.
Класс hidden можно заменить на d-none, если вы используете библиотеку Bootstrap 5 версии и выше. Чтобы проверка работала, в ТДС "Интернет Магазин" должно быть прописано:
->cart(TRUE)
Теперь у вас, при добавлении товара в корзину, вместо кнопки "В корзину" будет показываться кнопка "Оформить заказ" с ссылкой на корзину

Обновление курса валют
В стандартную поставку входит два источника получения курсов валют:
- сайт ЦБ РФ (официальные курсы валют);
- сайт www.floatrates.com (актуальные биржевые курсы).
Для обновления курсов валют с сайта ЦБ РФ выберите в меню Обновить курсы валют, затем в подменю выберите источник данных о курсах.
Автоматическое обновление курсов валют через планировщик
В модуле Планировщик добавьте задачу обновления курсов валют, указав Идентификатор сущности название драйвера (cbrf или floatrates):

Автоматическое обновление курсов валют через отдельный вызов файла
Добавьте в cron вызов файла обновления валют cron/update_currency.php, не забудьте указать полный путь к файлу на сервере.
Источники курсов валют
Информация о доступных источниках валют размещается в конфигурационном файле modules/shop/currency/config/config.php
<?php
return array(
'cbrf' => array(
'driver' => 'cbrf',
'name' => 'ЦБ РФ'
),
'floatrates' => array(
'driver' => 'floatrates',
'name' => 'Exchange Rates for USD'
)
);
Файлы драйверов для загрузки курсов валют размещены в modules/shop/currency/driver/
PHP . Файл update_currency.php
Округление цен в магазине
Централизованно округлить цены можно установкой формата округления для Shop_Controller. В файл bootstrap.php, в корне, добавьте для округления до десятых:
Shop_Controller::instance()->floatFormat("%.1f");
До целых:
Shop_Controller::instance()->floatFormat("%.0f");
Округление до тысяч, сотен, десятков
Чтобы цена товара в интернет-магазине не была отпугивающей, иногда нужно округлить её до целых десятков. Округление осуществляется с помощью хука на событие
Shop_Item_Controller.onAfterCalculatePrice, вносимого в bootstrap.php
class Shop_Price_Observer
{
static public function round($price)
{
/*
-3 — до тысяч
-2 — до сотен
-1 — до десятков
*/
return round($price, -3);
}
static public function onAfterCalculatePrice($object, $args)
{
$aPrice = $object->getAPrice();
$aPrice['price_discount'] = self::round($aPrice['price_discount']);
$object->setAPrice($aPrice);
}
}
Core_Event::attach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Price_Observer', 'onAfterCalculatePrice'));
Подменяем Url адрес финальной страницы при оформлении заказа
Добавляем в обработчики платёжных систем следующий код:
echo '<script/>window.history.replaceState(null, null, "https://site.ru/checkout/")</script>';
При завершении заказа адрес страницы заменится с https://site.ru/shop/cart/ на https://site.ru/checkout/
ПОКАЗАТЬ ВСЕ ТОВАРЫ
$Shop_Controller_Show
->limit($oShop->items_on_page)
->parseUrl();
$items_on_page = Core_Array::getGet('items_on_page',false);
$items_on_page = ($items_on_page)?$items_on_page:$oShop->items_on_page;
$Shop_Controller_Show
->limit($items_on_page)
->parseUrl();
<xsl:choose>
<xsl:when test="total > 0 and limit > 0">
<xsl:variable name="count_pages" select="ceiling(total div limit)"/>
<xsl:variable name="visible_pages" select="5"/>
<xsl:variable name="real_visible_pages"><xsl:choose>
<xsl:when test="$count_pages < $visible_pages"><xsl:value-of select="$count_pages"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$visible_pages"/></xsl:otherwise>
</xsl:choose></xsl:variable>
<!-- Считаем количество выводимых ссылок перед текущим элементом -->
<xsl:variable name="pre_count_page"><xsl:choose>
<xsl:when test="page - (floor($real_visible_pages div 2)) < 0">
<xsl:value-of select="page"/>
</xsl:when>
<xsl:when test="($count_pages - page - 1) < floor($real_visible_pages div 2)">
<xsl:value-of select="$real_visible_pages - ($count_pages - page - 1) - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="round($real_visible_pages div 2) = $real_visible_pages div 2">
<xsl:value-of select="floor($real_visible_pages div 2) - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="floor($real_visible_pages div 2)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose></xsl:variable>
<!-- Считаем количество выводимых ссылок после текущего элемента -->
<xsl:variable name="post_count_page"><xsl:choose>
<xsl:when test="0 > page - (floor($real_visible_pages div 2) - 1)">
<xsl:value-of select="$real_visible_pages - page - 1"/>
</xsl:when>
<xsl:when test="($count_pages - page - 1) < floor($real_visible_pages div 2)">
<xsl:value-of select="$real_visible_pages - $pre_count_page - 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$real_visible_pages - $pre_count_page - 1"/>
</xsl:otherwise>
</xsl:choose></xsl:variable>
<xsl:variable name="i"><xsl:choose>
<xsl:when test="page + 1 = $count_pages"><xsl:value-of select="page - $real_visible_pages + 1"/></xsl:when>
<xsl:when test="page - $pre_count_page > 0"><xsl:value-of select="page - $pre_count_page"/></xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose></xsl:variable>
<p>
<xsl:call-template name="for">
<xsl:with-param name="limit" select="limit"/>
<xsl:with-param name="page" select="page"/>
<xsl:with-param name="items_count" select="total"/>
<xsl:with-param name="i" select="$i"/>
<xsl:with-param name="post_count_page" select="$post_count_page"/>
<xsl:with-param name="pre_count_page" select="$pre_count_page"/>
<xsl:with-param name="visible_pages" select="$real_visible_pages"/>
</xsl:call-template>
<!-- Кнопка показа всех товаров и возврата к пагинации-->
<xsl:choose>
<xsl:when test="limit > 30">
<a href="./?items_on_page=30" class="button" style="margin-top:-1px;">Показать по 30 товаров</a>
</xsl:when>
<xsl:otherwise>
<a href="./?items_on_page=999" class="button" style="margin-top:-1px;">Показать все товары</a>
</xsl:otherwise>
</xsl:choose>
</p>
<div style="clear: both"></div>
</xsl:when>
<xsl:otherwise>
<h2>К сожалению, таких товаров сейчас нет</h2>
</xsl:otherwise>
</xsl:choose>
Сообщение при добавлении товара в корзину
1. Код кнопки, которая добавляет товар в корзину:
<button type="button" class="btn" data-item-id="{@id}" onclick="return $.bootstrapAddIntoCart('/shop/cart/', $(this).data('item-id'), 1)" tabindex="0">
<span>
<i class="fa fa-shopping-bag"></i>
</span>
<span>В корзину</span>
</button>
2. Размещаем в макете код модального окна, которое будет показываться при добавлении товара в корзину:
<div class="modal fade" id="modalCart" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header"><button class="close" type="button" data-dismiss="modal"></button>
<h6 class="modal-title" id="myModalLabel">Товар добавлен в корзину</h6>
</div>
<div class="modal-body text-center">
<a class="close-reveal-modal btn btn-secondary" data-dismiss="modal">Продолжить покупки</a>
<a href="/shop/cart/" class="btn btn-primary" >Перейти в корзину</a>
</div>
</div>
</div>
</div>

3. В макете шаблона во вкладке Javascript дорабатываем скрипт. Находим блок:
// Функции без создания коллекции
$.extend({
...
bootstrapAddIntoCartCallback: function(data, status, jqXHR)
{
$.loadingScreen('hide');
$(this).html(data);
},
...
и добавляем код, который активизирует модальное окно с сообщением. Получится так:
// Функции без создания коллекции
$.extend({
...
bootstrapAddIntoCartCallback: function(data, status, jqXHR)
{
$.loadingScreen('hide');
$(this).html(data);
$("body").append(data.html); // Перемещаем модальное окно по DOM в конец body
$("#modalCart").modal("show"); // активируем модальное окно
},
...
Сортировка товаров со скидкой
2. Открываем вкладку Код страницы.
3. После строки
$Shop_Controller_Show->addCacheSignature('sorting=' . $sorting);
if(intval(Core_Array::getGet('filter')) && intval(Core_Array::getGet('is_sale'))) {
$current_date = date('Y-m-d H:i:s');
$Shop_Controller_Show->shopItems()
->queryBuilder()
->join('shop_item_discounts', 'shop_items.id', '=', 'shop_item_discounts.shop_item_id')
->join('shop_discounts', 'shop_item_discounts.shop_discount_id', '=', 'shop_discounts.id', array(
array('AND (' => array('shop_discounts.end_datetime', '>=', $current_date)),
array('OR' => array('shop_discounts.end_datetime', '=', '0000-00-00 00:00:00')),
array('AND' => array('shop_discounts.start_datetime', '<=', $current_date)),
array(')' => NULL)
));
}
https: //site.ru /shop /?filter=1&is_sale=1Ссылка на предыдущий и следующий товар в интернет-магазине
// добавляем окружающие элементы
// Если мы находимся на странице товара
if ($Shop_Controller_Show->item) {
$oShop_Item = Core_Entity::factory('Shop_Item', $Shop_Controller_Show->item);
// Текущий элемент
$cur_elem = $Shop_Controller_Show->item;
// Текущая группа
$cur_group = $oShop_Item->shop_group_id;
// SELECT * FROM shop_items WHERE shop_items.id < $cur_elem ORDER BY shop_items.id DESC LIMIT 1
$oCore_QueryBuilder_Select = Core_QueryBuilder::select()
->select('shop_items.path','shop_items.name')
->from('shop_items')
->open()
->where('shop_items.id', '<', $cur_elem)
->setAnd()
->where('shop_items.shop_group_id', '=', $cur_group)
->setAnd()
->where('shop_items.deleted', '=', '0')
->close()
->clearOrderBy()
->orderBy('id', 'DESC')
->limit(1);
$prev = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
$prev = $prev['path'];
$prev_name = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
$prev_name = $prev_name['name'];
// SELECT * FROM shop_items WHERE shop_items.id > $cur_elem ORDER BY shop_items.id LIMIT 1
$oCore_QueryBuilder_Select = Core_QueryBuilder::select()
->select('shop_items.path','shop_items.name')
->from('shop_items')
->open()
->where('shop_items.id', '>', $cur_elem)
->setAnd()
->where('shop_items.shop_group_id', '=', $cur_group)
->setAnd()
->where('shop_items.deleted', '=', '0')
->close()
->clearOrderBy()
->orderBy('id')
->limit(1);
$next = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
$next = $next ['path'];
$next_name = $oCore_QueryBuilder_Select->execute()->asAssoc()->current();
$next_name = $next_name['name'];
$Shop_Controller_Show
->addEntity(Core::factory('Core_Xml_Entity')
->name('neighboring_items')
->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item')->value($prev))
->addEntity(Core::factory('Core_Xml_Entity')->name('prev_item_name')->value($prev_name))
->addEntity(Core::factory('Core_Xml_Entity')->name('next_item')->value($next))
->addEntity(Core::factory('Core_Xml_Entity')->name('next_item_name')->value($next_name))
);
}
// добавляем окружающие элементы
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="/shop/group"/>
добавляем:
<!-- окружающие элементы -->
<xsl:variable name="path">
<xsl:choose>
<xsl:when test="/shop//shop_group[@id=$group]/node()"><xsl:value-of select="/shop//shop_group[@id=$group]/url"/></xsl:when>
<xsl:otherwise><xsl:value-of select="/shop/url"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="link_path" select="/shop//shop_group[@id=$group]/url"/>
<xsl:variable name="prev_item" select="/shop/neighboring_items/prev_item"/>
<xsl:variable name="next_item" select="/shop/neighboring_items/next_item"/>
<xsl:variable name="prev_item_name" select="/shop/neighboring_items/prev_item_name"/>
<xsl:variable name="next_item_name" select="/shop/neighboring_items/next_item_name"/>
<div class="navigator">
<xsl:choose>
<xsl:when test="$prev_item != ''">
<a href="{$link_path}{$prev_item}/">< Предыдущий товар (<xsl:value-of select="$prev_item_name" />)</a>
</xsl:when>
<xsl:otherwise>
<span class="previous">< Предыдущий товар</span>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$next_item != ''">
<a href="{$link_path}{$next_item}/">(<xsl:value-of select="$next_item_name" />) Следующий товар ></a>
</xsl:when>
<xsl:otherwise>
<span class="next">Следующий товар ></span>
</xsl:otherwise>
</xsl:choose>
</div>
<!-- /окружающие элементы -->
СТРАНИЦА КОНТАКТЫ С МИКРОРАЗМЕТКОЙ
<div class="vcard">
<div class="fn org">ООО "Фирма"</div>
<div class="adr">
<span class="type">Адрес:</span>
<span class="locality">г. Москва</span>,
<span class="street-address">ул. Королева, д. 122,</span>,
<span class="country-name">Россия</span>,
<span class="postal-code">100105</span>
</div>
<div class="tel">
<span class="type">Телефон:</span>
<span class="value">+7 (727) 231-01-01</span>
</div>
<div>
<span class="type">E-mail:</span>
<span class="email">info@site.qrg</span>
</div>
</div>
<div class="vcard clearfix">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="h6 fn org">ООО <span>БАХЧА</div>
<p>ИНН 5001571097017</p>
<p>ОГРН 116500410522292</p>
<p>Расчётный счёт 4070281050075000020204</p>
<p>В АО "РайффайзенБанке" Корр.счёт 3010181020000460000700</p>
<p> БИК 044525700</p>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
<div class="h6"><i class="fa fa-phone padding-right-10"></i> Телефон:</div>
<div><span class="tel">+7 (928) 000-0000</span></div>
<div>ежедневно с 9:00 до 21:00</div>
<div class="h6"><i class="fa fa-envelope-o padding-right-10"></i>Электронная почта:</div>
<div><span class="email">info@site.ru</span></div>
</div>
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
<div class="h6"><i class="fa fa-globe padding-right-10"></i> Наш адрес:</div>
<div class="adr"><span class="postal-code">143912</span>, <span class="locality">г. Бахчисарай</span>, <span class="street-address">ул. Флёрова, д. 4А</span></div>
<p class="padding-top-40">Перед визитом настоятельно просим Вас связаться с нами по телефону.</p>
</div>
</div>
<div itemscope itemtype="http://schema.org/Organization">
<span itemprop="name">Название организации</span>
Контакты:
<div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
Адрес:
<span itemprop="streetAddress">Лубянка, 4</span>
<span itemprop="postalCode"> 001122</span>
<span itemprop="addressLocality">Москва</span>,
</div>
Телефон:<span itemprop="telephone">+7 495 000–00–00</span>,
Факс:<span itemprop="faxNumber">+7 495 000–00–00</span>,
Электронная почта: <span itemprop="email">email@organizacii.ru</span></div>Текущая дата в Каталоге товаров
В XSL шаблон к xsl:stylesheet добавляем новые атрибуты xmlns:date="http://exslt.org/dates-and-times" и extension-element-prefixes="date", должно получится:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms"
xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date">
Далее например можно записать в переменную текущую дату и вычислить разницу с другой датой с помощью date:difference(string, string).
Чтобы код работал, в настройках магазина меняем формат даты на %Y-%m-%d
в ТДС записываем текущую дату
$oCurrent_date = date('dmY'); // именно в этом формате
$Shop_Controller_Show
->addEntity(Core::factory('Core_Xml_Entity')->name('сurrent_date')->value($oCurrent_date)); // теперь в XML есть сurrent_date
Теперь, если дата создания товара меньше 30 дней, выводим слово НОВИНКА
<xsl:variable name="current_date" select="/shop/current_date"/>
<xsl:variable name="difference_date" select="date:difference($current_date,datetime)" />
<xsl:variable name="difference_date_cut" select="substring-before(substring-after($difference_date, 'P'), 'D')" />
<xsl:if test="number($difference_date_cut) < 30"> <!-- 30 количество дней -->
<div class="ribbon-wrapper-new">
<div class="ribbon-round-new bg-color3">НОВИНКА</div>
</div>
</xsl:if>
Товары со скидками
SELECT id, name FROM shops WHERE site_id = {SITE_ID} AND deleted = 0

PHP
->itemsProperties(FALSE)
->itemsPropertiesList(FALSE)
->group(FALSE)
->xsl($sXslItemName)
->tags(FALSE)
->viewed(FALSE)
->show();
Core_Entity::factory('Shop', $iShopId)
);
'page' => '\d+',
);
$Core_Router_Route = new Core_Router_Route($sPattern, $aPatternExpressions);
$matches = $Core_Router_Route->applyPattern(Core::$url['path']);
if (isset($matches['page']) && is_numeric($matches['page']))
{
if ($matches['page'] > 1)
{
$page = $matches['page'] - 1;
}
}
Core::factory('Core_Xml_Entity')->name('current_sale_page')->value($page)
);
$ShopControllerShow->limit($ShopControllerShow->getEntity()->items_on_page);
$ShopControllerShow->limit(9999);
->shopItems()
->queryBuilder()
->join('shop_item_discounts', 'shop_item_discounts.shop_item_id', '=', 'shop_items.id')
->join('shop_discounts', 'shop_discounts.id', '=', 'shop_item_discounts.shop_discount_id')
->where('shop_discounts.active', '=', 1)
->where('shop_discounts.start_datetime', '<', Core_Date::timestamp2sql(time()))
->where('shop_discounts.end_datetime', '>', Core_Date::timestamp2sql(time()))
->where('shop_discounts.deleted', '=', 0)
->where('shop_items.modification_id', '=', 0)
->groupBy('shop_items.id')
->clearOrderBy()
->orderBy('RAND()')
// ->where('shortcut_id', '=', 0) проверить
->group(FALSE)
->groupsMode('none')
->favorite(FALSE);
XSL
Увеличить время хранения избранных товаров
Core_Session::setMaxLifeTime(86400 * 30);
// Избранное
if (Core_Array::getRequest('favorite'))
{
$shop_item_id = intval(Core_Array::getRequest('favorite'));
if (Core_Entity::factory('Shop_Item', $shop_item_id)->shop_id == $oShop->id)
{
Core_Session::start();
if (isset($_SESSION['hostcmsFavorite'][$oShop->id]) && in_array($shop_item_id, $_SESSION['hostcmsFavorite'][$oShop->id]))
{
unset($_SESSION['hostcmsFavorite'][$oShop->id][
array_search($shop_item_id, $_SESSION['hostcmsFavorite'][$oShop->id])
]);
}
else
{
$_SESSION['hostcmsFavorite'][$oShop->id][] = $shop_item_id;
}
}