Дорогие читатели, позвольте представить вам программный сервис, разработанный для экспорта данных из электронных магазинов созданных на основе CMS OpenCart.
Информация для технических специалистов
Как может происходить выгрузка данных из магазина?
Использовать модуль или плагин, расширяющий функционал магзина, обратиться к программисту, если функционал модуля не соответствует вашим требованиям
Подключиться к базе данных магазина, выполнить подготовленные SQL скрипты и до нужной формы обработать напильником
Использовать REST API, и затем обработать результаты с использованием языка программирования, например PHP, Java, Javascript - до нужной формы обработать напильником
Нам необходимо получить данные из магазина в виде сложного набора данных с зависимостями Master-Detail
Первый возможный алгоритм наших действий
Устанавливаем на сайт купленный или написанный самостоятельно модуль REST API
Пишем программу, доводящую до желаемого вида данные, которые мы получаем по REST API
Второй возможный алгоритм наших действий
Пишем на языке PHP программу, осуществляющую выборку данных из БД магазина возвращающую данные в нужном формате
Третий возможный алгоритм наших действий
Определим список предусловий:
Мы не хотим разбираться во внутренностях OpenCart
Мы не хотим разбираться в различии кода для разных версий OpenCart
Мы не хотим беспокоиться о программных дефектах (багах), в различных версий Opencart
Мы хотим определять логику выгрузки декларативно, а не императивно - мы хотим указать машине, что мы хотим получить, а не объяснять как нужно обработать данные из магазина на OpenCart
Мы хотим иметь поддержку
К описанию алгоритма выгрузки мы хотим относиться как к офисному документу, а не как к программе
Алгоритм должен быть в дальнейшем настраиваемый, расширяемый с помощью условий
Мы хотим переиспользовать то, что мы сделали - это не должно быть конечной точкой в логической цепочке нашего алгоритма. Возможно мы создадим веб сайт, у которого будет соответствующий URL, также с параметрами - фильтрами, указывающими как выгружать данные "тем другим" пользователям или программным сервисам. Мы хотим, чтобы нашу настраиваемую логику могли использовать другие, не имея к ней доступа.
Именно эти идеи явились базой для написания представляемого вам программного сервиса.
Для кого создан данный сервис
Владельцы магазинов
Специалисты работающие в сфере аназиза данных
Маркетологи
Программисты
Преимущества данного сервиса
Гибкая настройка конфигурации выгрузки данных
Выгрузка данные в различных форматах
Возможность создавать программные продукты на основе данного сервиса
Поддержка со стороны квалифицированных инженеров-программистов.
Поддерживаемые форматы выгрузки
JSON (современный формат обмена данными)
XML (проверенный временем формат обмена данными)
CSV, (csv файлы поддерживаются Microsoft Excel и другими программными продуктами)
Microsoft Excel, (поддержка данного формата сейчас находится в разработке)
Домашняя страница сервиса
Сервис выгрузки данных доступен на сайте "Rapid API"
https://rapidapi.com/quasarbyte-quasarbyte-default/api/opencart4/
Необходимое расширение для OpenCart расположено на "GitHub"
https://github.com/QuasarByte/opencart-api
Доступные ендпоинты для выгрузки данных
Выгрузка данных на основе заданных конфигураций
pipeline/selectTables/selectTablesAsJson
pipeline/selectTables/selectTablesAsXml
pipeline/selectTables/selectTablesAsCsv
Выгрузка категорий товаров
categories/findHierarchy
categories/findAllCategories
categories/descriptions/findAllCategoryDescriptions
categories/descriptions/findAllCategoryDescriptionsAsPlainText
Примеры проверенных авторами сервиса инструментов для выгрузки данных
Языки программирования, например: PHP, Javascript, Java, итд
Структура запроса
URL
Заголовки
Тело
Составные части тела запроса
Тело запроса описывает модель данных выгрузки. Выгрузка состоит из набора независимых или связанных дочерних наборов данных, в зависимости от требований.
Описание шаблона
Тело параметризуемого шаблона SQL запроса
Описание полей набора данных
Описание условия связи с другими наборами данных
Описание параметров шаблона
Описание параметров
Константные параметры
SQL параметры
Параметры в формате RSQL
Параметры сортировки
Параметры пейджирования
Пример тела запроса
{
"tablesTemplate": {
"tableTemplates": [
{
"name": "products",
"fields": [
{
"name": "product_id",
"fieldType": "LONG"
}
],
"childTableTemplates": [
{
"name": "productDescriptions",
"fields": [
{
"name": "product_id",
"fieldType": "LONG"
},
{
"name": "language_id",
"fieldType": "LONG"
}
],
"childTableTemplates": [],
"parentTableJoinCondition": {
"joinTemplateName": "productDescriptionsToProduct",
"joinFields": [
{
"parentField": {
"name": "product_id",
"fieldType": "LONG"
},
"field": {
"name": "product_id",
"fieldType": "LONG"
}
}
]
},
"sql": {
"sql": "SELECT pd.product_id,\n pd.language_id,\n pd.name,\n pd.description,\n pd.tag,\n pd.meta_title,\n pd.meta_description,\n pd.meta_keyword\nFROM {dbPrefix}product_description pd JOIN {dbPrefix}product p ON p.product_id = pd.product_id {andProductTemplate} {rsqlWhereProductTemplate}\nORDER BY pd.product_id, pd.language_id\n",
"parameterTypes": null,
"selectColumnsTemplates": null,
"constantTemplates": [
{
"name": "dbPrefix"
}
],
"dependentOnSqlParameterTemplates": null,
"dependentOnTemplateTemplates": [
{
"name": "andProductTemplate",
"sql": "AND",
"action": "ENABLE",
"condition": "ANY",
"subCondition": "NOT_EMPTY",
"templateNames": [
"rsqlWhereProductTemplate"
]
}
],
"rsqlTemplates": [
{
"name": "rsqlWhereProductTemplate",
"fieldList": [
{
"field": {
"name": "product_id",
"fieldType": "LONG"
},
"alias": null,
"expression": null
}
]
}
],
"orderByTemplates": null,
"offsetTemplate": null,
"limitTemplate": null
}
}
],
"parentTableJoinCondition": null,
"sql": {
"sql": "SELECT product_id, model, sku, upc, ean, jan, isbn, mpn, location, quantity,\n stock_status_id, image, manufacturer_id, shipping, price, points, tax_class_id,\n date_available, weight, weight_class_id, length, width, height, length_class_id,\n subtract, minimum, sort_order, status, viewed, date_added, date_modified\nFROM {dbPrefix}product\n{whereProductTemplate} {rsqlWhereProductTemplate}\nORDER BY product_id\n",
"parameterTypes": null,
"selectColumnsTemplates": null,
"constantTemplates": [
{
"name": "dbPrefix"
}
],
"dependentOnSqlParameterTemplates": null,
"dependentOnTemplateTemplates": [
{
"name": "whereProductTemplate",
"sql": "WHERE",
"action": "ENABLE",
"condition": "ANY",
"subCondition": "NOT_EMPTY",
"templateNames": [
"rsqlWhereProductTemplate"
]
}
],
"rsqlTemplates": [
{
"name": "rsqlWhereProductTemplate",
"fieldList": [
{
"field": {
"name": "product_id",
"fieldType": "LONG"
},
"alias": null,
"expression": null
}
]
}
],
"orderByTemplates": null,
"offsetTemplate": null,
"limitTemplate": null
}
}
]
},
"selectClosureParameters": {
"products": {
"columns": null,
"constantValues": {
"dbPrefix": "mcoc_"
},
"parameterList": null,
"rSqlMap": null,
"orderByList": null,
"page": null
},
"productDescriptions": {
"columns": null,
"constantValues": {
"dbPrefix": "mcoc_"
},
"parameterList": null,
"rSqlMap": null,
"orderByList": null,
"page": null
}
}
}
Структура ответа
Пример ответа в JSON формате
{
"products": [
{
"product_id": 50,
"productDescriptions": [
{
"product_id": 50,
"language_id": 1
},
{
"product_id": 50,
"language_id": 2
}
]
},
{
"product_id": 51,
"productDescriptions": [
{
"product_id": 51,
"language_id": 1
},
{
"product_id": 51,
"language_id": 2
}
]
}
]
}
Пример ответа в XML формате
<products>
<productsRow product_id="50">
<productDescriptions>
<productDescriptionsRow language_id="1" product_id="50"/>
<productDescriptionsRow language_id="2" product_id="50"/>
</productDescriptions>
</productsRow>
<productsRow product_id="51">
<productDescriptions>
<productDescriptionsRow language_id="1" product_id="51"/>
<productDescriptionsRow language_id="2" product_id="51"/>
</productDescriptions>
</productsRow>
</products>
Пример ответа в CSV формате
product_id
28
parentRowNumber,product_id,language_id
1,28,1
Контакты для обсуждения и ответов на вопросы
Группа в Telegram: https://t.me/OpenCart_API_Russian_Language
https://rapidapi.com/quasarbyte-quasarbyte-default/api/opencart4/discussions
Email: hello@quasarbyte.com
С Уважением,
Роман Талуев
Комментарии (8)
DenKuzmin
22.01.2022 17:19Не понял. Для чего это нужно? Делает выгрузку товаров в xml, csv через API? Чем лучше обычного модуля экспорта? Зачем оно нужно? Можно как-то "управлять" полями?
Это бесплатно? В чем фишка-то? Ну сервис и сервис.
taluyev Автор
22.01.2022 17:38-2DenKuzmin, спасибо ваш за вопрос.
Да, сервис делает выгрузку товаров, и не только товаров и их зависимостей, а вообще любую выборку данных, находящихся в базе данных магазина через API. Отличается от "обычного модуля экспорта" возможностью задавать алгоритм выгрузки на языке SQL. Нужно тем пользователям (и программистам), которым гибкости "обычного модуля выгрузки" не хватает, там где удобнее, легче и проще (с точки зрения программиста) использовать SQL. Сервис представляет из себя ETL движок. Как происходит Выгрузка. На первом шаге задается один или более SQL запросов. На втором шаге определяются поля и их типы (строка, число, дата, время). На третьем шаге задаются условия связи наборов данных определенных на первом шаге. Такой подход позволяет облегчить работу программиста. Управлять полями можно программно - запрос с описанием шаблона и его параметров представлен в виде JSON. Почему это на шаг впереди, чем "обычный REST API"? Это следующий шаг после получения данных по REST. Сервис на себя берет функцию ETL, программист определяет "что нужно получить", а не "как обработать результаты, возвращенные через 'обычный' REST". Это не бесплатно. На текущий день пользование сервисом стоит $10 за 500 выгрузок в месяц. Если есть дополнительные вопросы, или что-то не ясно пожалуйста спрашивайте.
AlexeyUral
22.01.2022 17:19Куча плагинов есть. Зачем?
taluyev Автор
22.01.2022 17:48-1Данный сервис отличается от "других плагинов", тем, что позволяет определять свою логику выгрузки с использованием языка запросов SQL. SQL запрос является шаблоном, с возможностью менять части запроса динамически, в зависимости от логики вашей выборки. На базе данного сервиса вы можете создать много вариантов выборок данных, которые соответствуют вашим правилам. Результаты выгрузки данных из вашего магазина или из магазина вашего заказчика может являться входными данными для дальнейших преобразований данных.
AlexeyUral
22.01.2022 19:07И снова этот вопрос, зачем?
Выгрузить, получить csv и крутить в excelе как угодно.
Было 2 магазина на opencart 3, 1000+ позиций, не разу и близко к этой "проблеме" не пришел.
Ну и всегда есть доступ к бд.
taluyev Автор
22.01.2022 22:22-1Алексей,
спасибо за ваш вопрос.
Да, можно выгрузить набор данных из базы данных используя язык запросов SQL, потом сохранить данные в формате CSV и открыть в Excel с целью последующего анализа.
Указанные выше операции являются ручными, то есть, чтобы получить новый Excel файл, нужно пподелать эту работу снова. Если нужно сформировать набор данных состоящий из нескольких выборок, то нужно сделать больше работы. Когда необходимо что-то сделать еще с полученными данными или послать данные кому-то или делать задачу на регулярной основе, в голову приходит мысль автоматизировать процесс подготовки данных.
Идея сервиса автоматизировать и упростить процесс получения данных.
В ядро сервиса заложена функциональность пост-обработки полученных данных, например очистка описаний товаров от HTML тегов и другое.
При необходимости предоставлять данные "наружу" можно сделать простейший сайт, использующий ресурсы сервиса выгрузок. Есть идея создать "хранилище моделей выгрузок". В таком случае сайт делать не придется: создали модель и расшарили ееобходимый URL потребителям данных.
kirillbdev
Простите, а как эту статью заапрувили?
Areso
А её не апрувили. Она не из песочницы. Для полноценных пользователей премодерации для публикации нет.