====== Построение витрины ====== В данном разделе описана последовательность действий, необходимых для построения витрины и поддержания её в актуальном состоянии. ===== Получение меню ===== В первую очередь вам понадобится дерево-каталог [[ru:terms:category|категорий]], на основании которого можно нарисовать меню. Мы детально проработали и предоставляем всем базовое меню. Оно доступно каждому пользователю. При необходимости мы можем добавить персональные меню для каждого пользователя сервиса. \\ Необходимо совершить следующие действия: * Получить список доступных меню с помощью метода [[ru:content:methods:GetMenus|GetMenus]], и выбрать из них одно, подходящее вам * Получить список доступных языков описания с помощью метода [[ru:content:methods:GetAvaliableLanguages|GetAvaliableLanguages]], и выбрать из них нужный. Полученные здесь языки относятся не только к меню, но и к описаниям товаров/семейств В стандартном сценарии эти действия нужно совершать только один раз, при первом запуске системы. После этого вы можете получить выбранное меню на необходимом языке, с помощью метода [[ru:content:methods:GetMenu|GetMenu]]. Также, мы рекомендуем периодически(например, раз в 10 минут) проверять меню на наличие обновление. Сделать это можно следующим образом: * В результатах вызова метода GetMenu помимо самого меню содержится еще и его актуальная версия. * Раз в заданный период необходимо вызывать метод GetMenu и смотреть - увеличилась ли версия. В случае, если увеличилась - нужно заново сохранить меню. ===== Получение списка доступных продуктов ===== После этого вам необходимо получить список доступных вам продуктов с помощью метода [[ru:b2bv2:methods:getpricechanges|GetPriceChanges]]. Подробно этот процесс описан в разделе [[ru:b2bv2:information:pricesync|синхронизации цен на товары]] ===== Привязка продуктов к категориям ===== Ввиду большого количества похожих товаров в системе MONT было введено такое понятие как "[[ru:terms:family|Семейство]]" - логическая сущность для группировки продуктов. В каждом узле полученного ранее дерева есть поле FamilyGroupIds, содержащее список идентификаторов(ид) семейств, привязанных к этой категории. А у каждого продукта, полученного в предыдущем разделе с помощью [[ru:b2bv2:methods:getpricechanges|GetPriceChanges]], есть поле FamilyGroupId, в котором содержатся идентификатор семейства, к которому относится продукт. Если вы не хотите использовать семейства при построении своей витрины, пользуясь этими данными, вы можете выполнить привязку продуктов напрямую к категориям. ===== Построение актуального меню(алгоритм удаления пустых веток)===== Базовое меню является общим для всех пользователей и основано на полном каталоге всех продуктов. В том числе и архивных. В таком виде оно годится только для создания библиотеки. А для интернет-магазина весь этот архив мало интересен. На витрине должны быть только те категории, в которых есть хотя бы 1 продукт доступный к продаже. К тому же уменьшение числа ветвей в меню сильно ускорит его отрисовку. Предлагаемый ниже алгоритм является одним из вариантов реализации этой задачи: - Находим максимальный уровень вложенности меню по полю Level. - В цикле от нижнего уровня меню к верхнему проверяем каждое семейство узла меню (все Id из поля FamilyGroupIds) на наличие его в списке продуктов: * с признаком не блокирован, * с ценой больше 0, * в нужной валюте. - Если таких продуктов нет, то помечаем сам узел меню “на удаление”. - Если FamilyGroupIds для узла является пустым, то ищем хотя бы одного потомка данного узла, не помеченного “на удаление”. Если таких потомков не найдено, помечаем узел меню “на удаление”. - Удаляем все узлы, помеченные “на удаление”. ===== Список доступных стран ===== Перед тем, как приступить непосредственно к получению описаний, необходимо получить список доступных стран.\\ Бывают случаи, когда одно и то же [[ru:terms:family|семейство]]/[[ru:terms:product|продукт]] имеет разное описание в разных странах, поэтому нам потребуется определиться со страной. Для получения списка возможных стран нужно вызвать метод [[ru:content:GetAvaliableCountries|GetAvaliableCountries]]. Результатом будет список кодов стран. Важно: стоит отметить тот факт, что понятие страны введено для определенных товаров, которые могут иметь в своем описании(к тому же на разных языках) фактичесие различия от страны к стране. Так как таких товаров немного, то наиболее распространенным кодом страны для всех переводов является код DF - Default. Это значит, что для товара, обладающим таким кодом страны все переводы на различные языки будут одинаковы вне зависимости от страны, за исключением отдельного описания товара с кодом страны не равным DF. Например: есть описание товара ABC-1111 на RU языке для DF страны и описание для этого же товара на RU языке для UA страны(отличающееся фактически от DF страны).\\ Все запросы вернуть описание на RU языке для товара ABC-11111 вернут отписание RU-DF.\\ Например для страны KZ и языка RU - вернется описание RU-DF. Однако для страны UA и языка RU вернется описание RU-UA. ===== Получение описания семейств ===== Если при построении витрины вы не планируете пользоваться семействами, то этот раздел вы можете пропустить. Для получения описания одного семейства существует метод [[ru:content:getFamily|GetFamily]], в который нужно передать идентификатор семейства, требуемые язык и страну(их получение было описано в начале раздела). Соответственно, для получения описания всех необходимых семейств, нужно вызвать этот метод для каждого семейства, которое есть в обрезанном от пустых веток меню. ===== Получение описания продуктов ===== Для получения описания одного продукта существует метод [[ru:content:getProduct|GetProduct]], в который нужно передать партномер продукта, требуемые язык и страну(их получение было описано в начале раздела). Соответственно, для получения описания всех необходимых продуктов, нужно вызвать этот метод для каждого доступного вам продукта(их список был получен с помощью метода [[ru:b2bv2:methods:getpricechanges|GetPriceChanges]]) ===== Обновление контента ===== При интеграции с системой необходимо учитывать, что витрина может поменяться в любой момент. В частности, измениться могут: * Структура меню * Описание продукта или семейства * Доступность какого-либо из продуктов(как появление новых продуктов, так и снятие с продаж старых) Потому мы рекомендуем проверять наличие обновлений раз в 10 минут. Рекомендуется производить обновление в 2 этапа - обновление меню и обновление описаний. Обновление меню можно реализовать следующий образом: - Проверка обновления структуры дерева. В результатах вызова метода GetMenu помимо самого меню содержится еще и его актуальная версия. Проверить наличие обновлений можно вызвав этот метод еще раз и сравнив новую версию со старой. Если новая версия больше - значит, что-то было изменено, и меню надо полностью обновить. - Проверка изменения доступности товаров. Как её осуществить, подробно описано в разделе [[ru:b2bv2:information:pricesync|синхронизации цен на товары]] - Если в пунктах 1 или 2 были обнаружены и синхронизированы какие-то изменения, то необходимо заново построить актуальное меню(описано выше) - Если во вновь построенном актуальном меню появились новые семейства или продукты, то необходимо загрузить для них описания. Обновление описаний можно реализовать следующим образом: - Получение списка идентификаторов сущностей(семейств и продуктов), у которых изменились описания. Сделать это можно с помощью метода [[ru:content:methods:getChanges|GetChanges]] - Для каждой изменившейся сущности необходимо заново загрузить их описания.