SQL запросы заказов ИМ

Отметить все заказы магазина 1 как невыгруженные, чтобы повторно выгрузились в 1С, Мой Склад и т.п.
UPDATE `shop_orders` SET `unloaded` = 0 WHERE `shop_id` = 1;
Увеличить номер заказа в магазине до 1000-го 
ALTER TABLE `shop_orders` AUTO_INCREMENT =1000;

SQL запросы. Как быстро посчитать кол-во товаров

Заходим в модуль "SQL-запросы" и делаем такой запрос:
SELECT COUNT(`id`) AS `count` 
FROM `shop_items` 
WHERE `shop_id` = 1 AND `active` = 1 AND `deleted` = 0
Или так, усложняем, проверяем еще активность и удалена ли группа товара:
SELECT COUNT(`shop_items`.`id`) AS `count` 
FROM `shop_items`
LEFT JOIN `shop_groups` ON `shop_items`.`shop_group_id` = `shop_groups`.`id`
WHERE `shop_items`.`shop_id` = 1 AND `shop_items`.`active` = 1 AND `shop_items`.`deleted` = 0 AND `shop_groups`.`active` = 1 AND `shop_groups`.`deleted` = 0
Для чего мы делаем условия, да для того чтобы посчитать именно в нужном магазине (`shop_id` = 1), т.к. в системе могут быть несколько магазинов или остались старые товары от старого магазина, мы считаем только активные товары (`active` = 1) и не удаленные (`deleted` = 0), после чего будет видно кол-во
Если у Вас в магазине присутствуют модификации и нужно посчитать без них, то исключаем их:
SELECT COUNT(`id`) AS `count`
FROM `shop_items`
WHERE `shop_id` = 1 AND `modification_id` > 0 AND `active` = 1 AND `deleted` = 0
Считаем кол-во товаров у которых есть картинки:
ELECT COUNT(`id`) AS `count`
FROM `shop_items`
WHERE `shop_id` = 1 AND `image_small` != '' AND `active` = 1 AND `deleted` = 0
Считаем кол-во товаров у которых есть цены:
SELECT COUNT(`id`) AS `count`
FROM `shop_items`
WHERE `shop_id` = 1 AND `price` > 0 AND `active` = 1 AND `deleted` = 0
Считаем кол-во товаров у которых нет артикула:
SELECT COUNT(`id`) AS `count`
FROM `shop_items`
WHERE `shop_id` = 1 AND `marking` = '' AND `active` = 1 AND `deleted` = 0

Делаем магазин каталог на Главной странице сайта

Создаем константу INDEX_PAGE_IS_DEFAULT = true
  • Идем в структуру сайта, открываем редактирование узла "Главная", переключаем тип с документа на ТДС, выбираем ТДС Интернет-магазин, указываем id магазина и нужные xsl-шаблоны.
  • Идем в раздел "Интернет-магазины", заходим в редактор нужного магазина и меняем в списке узел структуры, к которому он привязан. 

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

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

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

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

PHP

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

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

XSL

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

УДАЛЕНИЕ И ДОБАВЛЕНИЕ ТОВАРОВ В КРАТКОЙ КОРЗИНЕ

Открываем типовые динамические страницы интернет магазина, далее "Интернет-магазин корзина" и "Настройки страницы"
Находим:
// Добавление товара в корзину
if (Core_Array::getRequest('add')) ...
И выше добавляем:
// Ajax Обновление товара в корзине
if (Core_Array::getRequest('updateCart')) {
    $shop_item_id = intval(Core_Array::getRequest('updateCart'));    
    $count = intval(Core_Array::getRequest('count'));    
    if (($shop_item_id) && ($count)) {    
        $oShop_Cart_Controller = Shop_Cart_Controller::instance();
        $oShop_Cart_Controller
        ->checkStock($bCheckStock)
        ->shop_item_id($shop_item_id)
        ->quantity($count)
        ->update();
    }
}
// Ajax Удаляение товара из корзины
if (Core_Array::getRequest('deleteCart')) {
    $shop_item_id = intval(Core_Array::getRequest('deleteCart'));
    if ($shop_item_id) {
        $oShop_Cart_Controller = Shop_Cart_Controller::instance();
        $oShop_Cart_Controller
        ->shop_item_id($shop_item_id)
        ->delete();
    }
}
Находим:
// Ajax
if (Core_Array::getRequest('_', FALSE) && (Core_Array::getRequest('add') || Core_Array::getRequest('loadCart')))
И заменяем на:
// Ajax
if (Core_Array::getRequest('_', FALSE) && (Core_Array::getRequest('add') || Core_Array::getRequest('loadCart') || Core_Array::getRequest('updateCart') || Core_Array::getRequest('deleteCart')))
Изменения в JS:
Открываем скрипт магазина /templates/template_НОМЕР/script.js 
Находим:
// Функции без создания коллекции
$.extend({
...
И добалвяем в них 3 функции:
updateCart: function(path, shop_item_id, count){
    $.clientRequest({
        path: path + '?updateCart=' + shop_item_id + '&count=' + count,
        callBack: $.updelCallback,
        context: $('.little-cart')
    });
    return false;
    },
deleteCart: function(path, shop_item_id){
    $.clientRequest({
        path: path + '?deleteCart=' + shop_item_id,
        callBack: $.updelCallback,
        context: $('.little-cart')
    });
    return false;
},
updelCallback: function(data, status, jqXHR){
    $.loadingScreen('hide');
    $(this).html(data);
}
Изменения в XSL-шаблоне:
В XSL-шаблон добавляем для товара:
<xsl:variable name="kol" select="../quantity" />
<xsl:variable name="cena" select="format-number(price, '#####0,##', 'my')" />                                
Стоимость: <xsl:value-of select="$cena * $kol"/>    
<br />
Кол-во: <xsl:value-of select="$kol"/>
<br />
<a href="#" onclick="return $.updateCart('{/shop/url}cart/', {@id}, {$kol}+1)">Добавить</a>
<br />
<a href="#" onclick="return $.updateCart('{/shop/url}cart/', {@id}, {$kol}-1)">Убавить</a>
<br />
<a href="#" onclick="return $.deleteCart('{/shop/url}cart/', {@id})">Удалить</a>
Для вывода общей суммы покупок можно добавить:
<p>Сумма: <xsl:value-of select="total_amount"/><xsl:text> </xsl:text><xsl:value-of select="shop_currency/name"/></p>
Получаем 
Добавить, Убавить и Удалить лучше всего доработать и заменить на иконки