Создание каталога товаров на сайте

Введение

Компонент каталог позволяет быстро поднять типовой каталог с использованием только MS SQL и верстки Bootstrap. 
Вид каталога:
        
Карточка товара: 
Корзина и заказ: 
             

Возможности каталога

Каталог на демо имеет следующие возможности: 
  • Вложенные категории (без ограничений по вложенности).
  • Фильтры для категорий. Фильтры наследуются от родительских категорий. 
  • Кастомизация вида каталога, элемента каталога и карточки каталога.
  • Человекопонятный URL (ЧПУ). 
  • Вывод тегов выбранных фильтров.
  • Гибкие настройки под SEO - h1, title, keywords, description, микроразметка. Все генерируется через процедуры SQL с учетом всех входящих параметров (выбранная категория, фильтры). 
  • Два вида каталога - плитка и панели. 
  • Адаптивность под мобильные устройства.
  • Мультикорзина. Учет различных поставщиков. Отдельное оформление заказов для разных поставщиков. 
  • Избранное.
  • Кеширование выборки каталога. Возможность настроить длительность кеширования. 
  • Форма заказа с возможностью адаптации под свои потребности.
  • Форма быстрого заказа. 
  • Возможность сортировки по разным параметрам.
  • Возможность менять бизнес-логику выборки через SQL. 
  • Рейтинг товара, количество заказов, отзывы.
  • Страница поставщика, рейтинг поставщика. 
  • Характеристики товаров.
  • Кастомизация при заказе - выбор определенных характеристик.
  • Вывод остатков. 

Адрес демо https://marketplace.web-automation.ru/catalog

Структура каталога

Основная номенклатура хранится в as_cat_products. Товары могут находиться в различных категориях (as_cat_categories). У категории есть свои атрибуты (они представлены на каталоге фильтрами) - as_cat_filters. Фильтры могут быть различных типов - текстовый, галочки, выбор, переключатель, диапазон (as_cat_filterTypes).

У товаров есть атрибуты (as_cat_productAttrs) и они соответствуют атрибутам категории (as_cat_categoryFilters). У каждого товарного предложения поставщика есть набор кастомизируемых атрибутов - майка синяя, красная, XL, S (as_cat_supplierProductAttrs). 

Каждый поставщик (as_cat_suppliers) связан с определенными категориями каталога (as_cat_supplierCategories) и размещает в каталоге свои товары (as_cat_supplierProducts), связанные с единой номенклатурой. Поставщик использует общую номенклатуру и только указывает свои остатки и стоимость для определенной конфигурации атрибутов товара. 

Корзина хранится в ord_carts, а заказы в ord_orders

Построение адресов URL каталога

Построение URL для поиска

Адрес поиска строится следующим образом /catalog/[catName-catID]/[catName-catID]/f/[filterCode-val1,val2...]/[filterCode-val1,val2...]

Блоки с категориями показывают вложенность категорий. 

Параметр /f/ говорит системе, что дальше идет блок фильтров. Значения фильтров указываются через запятую. 

Пример адреса для поиска: 

https://marketplace.web-automation.ru/catalog/spectekhnika-1012/pogruzchiki-1014/f/gruzopod_emnost-до%20300%20кг,до%20400%20кг/sostoyanie-Б-у

https://marketplace.web-automation.ru/catalog/spectekhnika-1012/ekskavatory-1015

Примечание: 

  • Нельзя кардинально поменять роутинг каталога. Движок использует опорные элементы для разбора адреса (/catalog, /p /f, фильтры через запятую).  
  • Нельзя использовать в выводимых значениях  фильтров множественного выбора (например checks) символ "," (она используется как разделитель значений при обработке в процедуре Search). Заменяйте его на "." или другой символ.
  • Если в фильтрах приходят спецсимволы (например, /\*), то они кодируются в URL через "-s{AsciiCode}-". Далее на стороне сервера они восстанавливаются и выводятся в первоначальном виде на странице. Это мера необходима из-за того, что не все спецсимволы можно вставлять в URL. 

Построение URL для карточки товара

Адрес товара строится следующим образом  /catalog/[сatName-catID]/[catName=catID]/p/[prodName-prodID]

В начале адреса идет иерархия категорий, в которых находится товар. 

Параметр /p/ говорит системе, что это товар. 

После /p/ идет блок с идентификацией товара по prodID.

Примечание: 

  • адрес товара хранится в as_cat_products.url и задается при создании товара.
  • можно убрать из адреса карточки товара элементы категорий, тогда адрес будет короче. В этом случае надо внести изменения в функцию cat_getProductURL и обновить поле URL у всех товаров.

Пример адреса товара: https://marketplace.web-automation.ru/catalog/spectekhnika-1012/pogruzchiki-1014/p/pogruzchik-honda-1155-1155

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

Управление логикой работы каталога осуществляется на странице /catSettings (доступна системному администратору)

На данной странице вы можете: 

  • Управлять категориями, атрибутами, товарами
  • Делать импорт/экспорт через Excel
  • Управлять процедурами для страницы поиска - search, preSearch и  getSeoParameters
  • Управлять процедурами для страницы карточки товара - getItem, getSeoParameters
  • Управлять блоками разметки для страниц поиска и карточки товара
  • Также на этой странице вы можете изменить бизнес-логику работы с корзиной (добавление в корзину, идентификация/создание корзины, получение корзины).

Атрибуты продуктов (фильтры)

Все возможные атрибуты продуктов лежат в as_cat_filters.
Атрибуты назначаются категории в таблице as_cat_categoryFilters, а продукты уже в свою очередь наследуют атрибуты всех родительских категорий.
Тип данных значений атрибута указывается в dataTypeID (строка, целое число, дробное число).
Заполнение атрибутов значениями для конкретного продукта идет в as_cat_productAttrs.

В этой таблице заполняется одна из трех колонок согласно установленному типу атрибута.

Значение Атрибута как выбор значения из списка (справочника)

Если на атрибуте заполнено поле sqlGetValues, значит он имеет конечное число установленных значений, и для каждого продукта будет выбор из списка одного из этих значений.
В sqlGetValues указана хранимая процедура для выбора списка значений атрибута.
Соответственно в БД необходимо создать дополнительные таблицы-справочники по таким атрибутам в виде as_cat_cust_{имяАтрибута} (id, name)
В as_cat_productAttrs тогда будет заполнена колонка intValue - ID записи из таблицы указанной в sqlGetValues.

Атрибуты как фильтры

Атрибуты продуктов должны также быть среди фильтров поиска.
Поле visibleInFilter определяет будет ли введен атрибут в перечень фильтров.

Есть следующие типы фильтров в каталоге:
  • checks - галочки
  • radio - радио-переключатели
  • select - выбор из списка с поиском
  • selectmultiple - множественный выбор из списка с поиском
  • switch - переключатель да-нет
  • text - строка для ввода
  • color - выбор цвета
  • range - выбор диапазона

Поле typeID определяет тип фильтра.
Если вариант отображения - ползунок, то поле defValue необходимо обязательно заполнить по следующему шаблону - {минимум,максимум,шаг}
Для фильтра select необходимо в начале добавить элемент Не выбрано.
Чтобы назначить каждой категории свой набор фильтров, нужно прописать связи в as_cat_categoryFilters

Атрибуты отображаемые на обложке продукта

Если на атрибуте заполнен признак showForProductInList, то этот атрибут будет выводиться сразу на обложке товара в режиме отображения товаров Список

Схема "Связь Продукты - Категории - Атрибуты (фильтры)"

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

При нажатии на соответствующую иконку на продукте, он попадает в корзину к пользователю, в количестве указанном в поле рядом.

Таблица корзин ord_carts. Если пользователь не авторизован, то поле username в ней будет равно null.
В таблице ord_cartItems лежат позиции, которые были добавлены в корзину.

О таблице ord_cartTypes

В ней лежит настройка того, какая корзина работает на каталоге

В поле cartInfoFormat можно задать формат вывода виджета корзины справа сверху на сайте.

Оформление заказа

Форма с кодом cartOrder, т. е. можно посмотреть её хранимки, и соответственно есть возможность её видоизменить.
В SaveItem прописано создание заказа. Все заказы хранятся в ord_orders, и через таблицу корзины выходят на позиции заказа (они же позиции корзины).


Как сделать, чтобы оформлялся единый заказ?

  • Когда оформленный заказ идёт напрямую к поставщику, то кнопка Оформить заказ будет выставлена напротив каждого производителя в Корзине. В этом случае
  • указываем ord_cartTypes.isSingleOrder = 0
  • и в cartOrder будет передаваться itemID = ’{cartGuid}_{supplierID}’
  • Чтобы сделать единую кнопку Оформить заказ в Корзине, например когда заказ должен уйти на Склад, то есть независимо от того у скольких поставщиков мы выбрали товар, то необходимо
  • указать в ord_cartTypes.isSingleOrder = 1
  • и в cartOrder будет передаваться itemID = ’{cartGuid}_0’

Добавление продуктов в Избранное

Добавить продукт в Избранное может только авторизованный пользователь, нажав на соответствующую иконку на продукте.
Физически запись об избранном продукте добавляется в ord_favorites.

Адрес Избранного https://marketplace.web-automation.ru/favorites

Схема “Связь Корзина - Заказы - Избранное”

Основные Хранимые процедуры каталога

Поиск по каталогу - cat_search

На входе: 

  • @filters ExtendedDictionaryParameter READONLY, - коллекция фильтров с Key, Value 
  • @selectedCatID int, - текущая выбранная категория
  • @sort nvarchar(24), - выбранная сортировка
  • @page int, - текущая страница
  • @username nvarchar(32), - текущий пользователь (если зарегистрирован)
  • @langID int = 0 - язык интерфейса пользователя
  • @parameters ExtendedDictionaryParameter readonly - опционально, содержит langID, falconGuid, url (только часть после /catalog/) и др  параметры в виде Key,Value2

На выходе: 

SELECT 1  Товары

  • ID - ID товара
  • Name - наименование товара
  • ShortDesc - краткое описание 
  • Price - стоимость
  • SupplierCount - сколько поставщиков предлагают товар
  • Url - URL товара 
  • Img - URL картинки товара 

SELECT 2 Настройки вывода 

  • EmptyText - сообщение, что нет товаров
  • OneToOneProduct - если 1, то режим работы без номенклатуры (каждое предложение от 1 поставщика)
  • Title - заголовок страницы h1
  • Text - текст описания к странице 
  • BannerImage - картинка баннера URL
  • BannerText - текст к баннеру 
  • Sort - выбранная сортировка
  • Page - текущая страница 
  • PageSize - размер пагинации
  • Total - сколько всего найдено товаров
  • MetaTitle - тег Title в Head 
  • MetaDescription - метатег Description 
  • MetaKeywords - метатег Keywords
  • HeadSection  - разметка в (например, для счетчиков или микроразметки)
  • BodyBottomSection - разметка перед  
  • CustomMakeup - кастомная разметка основного каталога
  • ListItemMakeup - кастомная разметка элемента в каталоге в виде
  • ListPanelItemMakeup - кастомная разметка элемента в каталоге в виде Panel
  • AttrTemplateMakeup - разметка для вывода атрибута товара в разметке List
  • DefaultView - какой вид грузить по умолчанию? (list,panel)
  • FilterStateEnabled - если 1, то у фильтров будут проставляться доступность/недоступность фильтров и показываться количество товаров. 

SELECT 3 - Атрибуты товара, которые будут выводиться в поиске

  • ProductID - ID товара к которому привязан атрибут
  • AttrID - ID атрибута 
  • AttrCode - код атрибута
  • Title - название атрибута
  • Value - значение (если несколько, то через запятую)
  • TypeCode - тип атрибута
  • DataType - тип данных, которые хранит атрибут
  • Category - категория атрибута
  • CategoryOrd - порядок категории
  • SqlGetValues - хранимая процедура, которая дает возможные варианты для списковых параметров
  • CacheMinutes - как долго минут кешируется список возможных вариантов из хранимой процедуры. Если 0, то не кешируется. 

SELECT 4 - Виды сортировок

  • Key - код сортировки
  • Value - название на странице

SELECT 5 - Состояния фильтров. Работают, если установлен FilterStateEnabled = 1. На базе этих данных в фильтрах отображается сколько товаров есть по данному фильтру при текущей конфигурации выбранных фильтров. 

  • FilterCode - код фильтра
  • Value - значение фильтра 
  • Count - количество найденных товаров для данного значения данного фильтра.  

Настройка SEO параметров для поиска - cat_search_getSeoParameters.

На входе: 

  • filters - выбранные фильтры 
  • selectedCatID - текущая категория 
  • langID - выбранный язык
  • username - текущий пользователь
  • title - заголовок h1. Выходной параметр
  • metaTitle - тег title. Выходной параметр
  • metaDescription - метатег Description. Выходной параметр
  • metaKeywords - метатег Keywords. Выходной параметр
  • bannerText - текст при баннере. Выходной параметр
  • bannerImage - картинка баннера. Выходной параметр
  • headSection - разметка в . Выходной параметр
  • bodyBottomSection - разметка перед . Выходной параметр
  • preBreadcrumbs - что поставить вперед в хлебные крошки перед структурой каталога в форме name||url. Выходной параметр

На выходе: 

нет выходных SELECT

Получить детали для карточки товара - cat_getItem

На входе: 

  • itemID - ID товара 
  • langID - выбранный язык
  • username - текущий пользователь
  • parameters ExtendedDictionaryParameter readonly - опционально, содержит langID, falconGuid, url (только часть после /list/{code}/) и др  параметры в виде Key,Value2

На выходе: 

SELECT 1 Настройки вывода 

  • OneToOneProduct - если 1, то включается режим Без номенклатуры
  • AttrTemplateMakeup - кастом разметка для вывода списка атрибутов товара

SELECT 2 Категории товара (иерархия)

  • ID - ID категории
  • Code - код категории
  • Name - название 
  • Level - уровень вложенности от корня
  • Url - URL категории на сайте
  • Icon - Font Awesome иконка

SELECT 3 Атрибуты

  • AttrID  - ID атрибута 
  • Title - название атрибута
  • Value - Значение
  • TypeCode - тип атрибута
  • DataType - тип данных фильтра
  • Category - категория (для группировки вывода атрибутов)
  • CategoryOrd - Порядок категории

SELECT 4 Предложения поставщиков

  • SupplierProductID - ID предложения 
  • Price - стоимость
  • SupplierName - наименование поставщика
  • SupplierLink - ссылка на страницу поставщика

Настройка SEO параметров для карточки товара - cat_getItem_getSeoParameters

На входе: 

  • itemID - ID товара 
  • langID - выбранный язык
  • username - текущий пользователь
  • parameters - дополнительные системные параметры (например, falconGuid)
  • title - заголовок h1. Выходной параметр
  • metaTitle - тег title. Выходной параметр
  • metaDescription - метатег Description. Выходной параметр
  • metaKeywords - метатег Keywords. Выходной параметр
  • headSection - разметка в . Выходной параметр
  • bodyBottomSection - разметка перед . Выходной параметр
  • preBreadcrumbs - что поставить вперед в хлебные крошки перед структурой каталога в форме name||url. Выходной параметр

На выходе: 

нет выходных SELECT

Управлять этими процедурами можно на /catSettings

Панели товаров

На желаемой странице (например, на главной) можно вывести некую выборку продуктов из каталога
(например, новинки или наиболее популярные) в виде специальной панели.

Сниппет:

 <div class="as-cat-panel" data-code="new" data-type="’card|slider’" data-colclass="col-12 col-sm-6 col-md-6"></div>
Указаны тип сниппета, код панели, и часть экрана для расположения.

По коду сниппета создаем соответствующую ХП для настройки отображения панели и выбора продуктов в неё:
CREATE PROCEDURE [dbo].cat_new_panel
   @langID int,
   @username nvarchar(256)
AS
BEGIN

   select 'Новые товары' Title,
          'http://ya.ru' Link,
          'Это нижний HTML под панелью' BottomHtml,
          5 CacheMinutes,
          '' ItemMakeup,
          '' Msg,
          1 Result

   select top 8 '111х' Name,
                '222х' Link,

'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNMNkquBwADcQF5wZiBLwAAAABJRU5ErkJggg==' Img,

                123 Price,
                '444х' [Desc]
   from as_cat_products

END

В ItemMakeup можно вставлять кастомизированную верстку для элемента.

Работает 2 режима - слайдер и панель товаров. Режим задается через data-type для сниппета.

How to по каталогу (catalog)

Как убрать категорию из каталога

Необходимо в панели управления у категории поставить признак Отключено (isDisabled=true).

Как сделать кастомную верстку для каталога

Для этого в SELECT 2 в cat_search указываем CustomMakeup - эта разметка может принимать следующие параметры: 
  • {catalogCats} Вложенные категории
  • {catalogFilters} Колонка фильтров
  • {catalogFilterTags} Теги выбранных фильтров (с возможностью их сбросить)
  • {catalogViewButtons} Кнопки переключения вида
  • {catalogTitle} Заголовок (с выводимым кол-вом)
  • {catalogBanner} Баннер для категории (использует Search.Select2 поля BannerText и BannerImage)
  • {catalogSortPanel} Кнопки сортировки
  • {catalogItems} Элементы каталога
  • {catalogPaging} Пагинация
  • {catalogText} Текст о категории

По дефолту используется такая верстка (если она не указана в CustomMakeup):
<div class="row cat-catalogCont">
   <div class="col-12 col-sm-12 col-md-3 col-lg-2 cat-filtersBlock"> {catalogCats}
   {catalogFilters} </div>
   <div class="col-12 col-sm-12 col-md-9 col-lg-10"> {catalogViewButtons} {catalogTitle}
   {catalogSortPanel} {catalogItems} {catalogPaging} {catalogText} </div>
</div> 

Также можно указать кастомную верстку для элементов каталога  для обоих видов (плитка и панель).
Для этого указываем в SELECT 2 в cat_search параметры ListItemMakeup, PanelItemMakeup:
  • {id} - Идентификатор номенклатуры товара
  • {name} - Наименование товара
  • {url} - URL страницы товара
  • {img} - ссылка на картинку
  • {supplierName} - наименование поставщика
  • {supplierLink} - ссылка на Поставщика
  • {price} - цена товара
  • {shortDesc} - краткое описание товара
  • {supplierCount} - количество поставщиков (если Товар к поставщику не 1 к 1)
  • {supplierProductID} - если Товар и Поставщик 1 к 1, то это ID товара поставщика (для использования в корзине).
  • {attrs} - атрибуты товара, которые помещены ForList=1

По умолчанию {attrs} выводится в 2 колонки. Это можно изменить если указать в SELECT 2 параметр AttrTemplateMakeup с нужной разметкой.По умолчанию он имеет такой вид:
<div class="col-6 col-sm-7 col-md-7 col-lg-3 cat-itemAttrName">
    {title}
</div>
<div class="col-6 col-sm-5 col-md-5 col-lg-9 cat-itemAttrValue">
    {value}
</div>
Аналогично для страницы 1 товара можно изменить дефолтовую разметку для атрибута в SELECT 1 параметр AttrTemplateMakeup в GetItem. По умолчанию: 
<div class="col-md-8 col-sm-7 col-6">{title}</div>
<div class="col-md-4 col-sm-5 col-6">{value}</div>

Примечание: указывается в SELECT 2 в cat_search такую разметку для CustomMakeup и других разметок, чтобы отдельно редактировать HTML блок.
select dbo.as_htmlBlock(''catalogMakeup'', 0) CustomMakeup,
dbo.as_htmlBlock(''catalogListItemMakeup'', 0) ListItemMakeup,
dbo.as_htmlBlock(''catalogPanelItemMakeup'', 0) PanelItemMakeup

В GetItem:
select dbo.as_htmlBlock('catalogItemMakeup', @langID) CustomMakeup

Как кастомизировать страницу товара

Используем для этого кастомизированную верстку в параметре CustomMakeup в процедуре cat_GetItem

Параметры:

  • {id} - id товара
  • {name} - наименование товара
  • {images} - картинки (галерея с возможностью показа увеличенной картинки)
  • {price} - цена товара
  • {offers} - предложения поставщиков по данному товару с возможностью добавить в корзину
  • {attrs} - таблица атрибутов товаров
  • {shortDesc} - краткое описание товара
  • {attr-code1} - передача дополнительных отдельных атрибутов для отдельной вставки в верстке

По умолчанию верстка имеет следующий вид:

<div class="row">
   <div class="col-12 col-md-12 col-lg-5"> {images} </div>
   <div class="col-12 col-md-12 col-lg-7"> {price} {name} {offers} {attrs}
         <div class="cat-shortDesc my-4"> {shortDesc} </div>
   </div>
</div>

Как сделать так, чтобы каталог работал по номенклатуре 1 к 1 с товаром поставщика

По умолчанию каталог работает как единая номенклатура. Для каждой позиции показываются предложения поставщиков на странице позиции (товара).
При этом кнопки Добавить товар нет на странице поиска товаров, и цены указаны как "От…".

Чтобы сделать представление 1 к 1 для позиций и предложений поставщиков (т.е. каждая позиция - это 1 предложение поставщика),
необходимо прописать в Процедурах Search и GetItem параметр настройки OneToOneProduct=1

Как скрыть цены в каталоге

Для этого в запросе укажите 0 для цен.

Как установить вид, который по умолчанию открывается в каталоге

По умолчанию ставится вид Плитка.
Укажите list или panel в DefaultView в SELECT 2 (процедура cat-search)

Как управлять внешним видом и расположением элементов каталога

Вывод элемента атрибута вы можете настроить через SQL (т.е. что выводится).
Расположение элемента вы можете задать через стили с position:absolute относительно элемента в каталоге.

Как сделать так, чтобы фильтрация происходила сразу при изменении одиночных элементов фильтра

Для body в Getlayout необходимо добавить класс instantCatalogFilter.

Как добавить микроразметку, стили или скрипты в каталог.

Используйте параметры headSection, bodyBottomSection в SELECT 2 в cat_search и аналогичные параметры в  cat_getItem.
Вы можете туда вставлять коды OpenGraph и JSON LD описание страниц.

Как настроить кеширование в каталоге

Для этого установите в WebConfig в разделе AppSettings параметр catalogCacheMinutes. Данный параметр указывает сколько минут будет кешироваться результат выдачи в каталоге
(кешируются все запросы по каталогу).

<add key="catalogCacheMinutes" value="60"></add>

Где хранятся картинки товаров

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

Страница каталога падает, если выбрать 20+ фильтров

Это происходит из-за того, что система имеет ограничение по количеству символов в URL.
Для решения этой проблемы необходимо увеличить количество возможных символов в URL в web.config в разделе

<httpruntime maxurllength="1024" relaxedurltofilesystemmapping="true"></httpruntime>

Подробнее: https://stackoverflow.com/questions/8245843/how-do-i-increase-the-maxurllength-property-in-the-config-in-asp-net-mvc-3

Falcon Space - функциальная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space

SQL-инструмент для создания личных кабинетов на сайте

Суть подхода и история создания Falcon Space

Платформа Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки

Это быстрое внесение изменений

по ходу эксплуатации программы

Это современный интерфейс

полная адаптация под мобильные устройства

Веб-приложения на MS SQL. Партнерская программа для разработчиков и веб-студий

Вы можете разрабатывать самостоятельно или сотрудничать с нами в плане веб-разработки на платформе Falcon Space, используя только SQL и HTML.
Смотреть примеры с кодом SQL
Документация по платформе

Google поиск по нашей документации