Дорогие читатели, позвольте представить вам программный сервис, разработанный для экспорта данных из электронных магазинов созданных на основе CMS OpenCart.

Информация для технических специалистов

Как может происходить выгрузка данных из магазина?

  • Использовать модуль или плагин, расширяющий функционал магзина, обратиться к программисту, если функционал модуля не соответствует вашим требованиям

  • Подключиться к базе данных магазина, выполнить подготовленные SQL скрипты и до нужной формы обработать напильником

  • Использовать REST API, и затем обработать результаты с использованием языка программирования, например PHP, Java, Javascript - до нужной формы обработать напильником

Нам необходимо получить данные из магазина в виде сложного набора данных с зависимостями Master-Detail

Первый возможный алгоритм наших действий

  1. Устанавливаем на сайт купленный или написанный самостоятельно модуль REST API

  2. Пишем программу, доводящую до желаемого вида данные, которые мы получаем по REST API

Второй возможный алгоритм наших действий

  1. Пишем на языке 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

Примеры проверенных авторами сервиса инструментов для выгрузки данных

Структура запроса

  • 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

Контакты для обсуждения и ответов на вопросы

С Уважением,

Роман Талуев

https://www.linkedin.com/in/taluyev/

Комментарии (8)


  1. kirillbdev
    21.01.2022 23:07
    +1

    Простите, а как эту статью заапрувили?


    1. Areso
      22.01.2022 16:52

      А её не апрувили. Она не из песочницы. Для полноценных пользователей премодерации для публикации нет.


  1. DenKuzmin
    22.01.2022 17:19

    Не понял. Для чего это нужно? Делает выгрузку товаров в xml, csv через API? Чем лучше обычного модуля экспорта? Зачем оно нужно? Можно как-то "управлять" полями?

    Это бесплатно? В чем фишка-то? Ну сервис и сервис.


    1. taluyev Автор
      22.01.2022 17:38
      -2

      DenKuzmin, спасибо ваш за вопрос.

      Да, сервис делает выгрузку товаров, и не только товаров и их зависимостей, а вообще любую выборку данных, находящихся в базе данных магазина через API. Отличается от "обычного модуля экспорта" возможностью задавать алгоритм выгрузки на языке SQL. Нужно тем пользователям (и программистам), которым гибкости "обычного модуля выгрузки" не хватает, там где удобнее, легче и проще (с точки зрения программиста) использовать SQL. Сервис представляет из себя ETL движок. Как происходит Выгрузка. На первом шаге задается один или более SQL запросов. На втором шаге определяются поля и их типы (строка, число, дата, время). На третьем шаге задаются условия связи наборов данных определенных на первом шаге. Такой подход позволяет облегчить работу программиста. Управлять полями можно программно - запрос с описанием шаблона и его параметров представлен в виде JSON. Почему это на шаг впереди, чем "обычный REST API"? Это следующий шаг после получения данных по REST. Сервис на себя берет функцию ETL, программист определяет "что нужно получить", а не "как обработать результаты, возвращенные через 'обычный' REST". Это не бесплатно. На текущий день пользование сервисом стоит $10 за 500 выгрузок в месяц. Если есть дополнительные вопросы, или что-то не ясно пожалуйста спрашивайте.


  1. AlexeyUral
    22.01.2022 17:19

    Куча плагинов есть. Зачем?


    1. taluyev Автор
      22.01.2022 17:48
      -1

      AlexeyUral,

      Данный сервис отличается от "других плагинов", тем, что позволяет определять свою логику выгрузки с использованием языка запросов SQL. SQL запрос является шаблоном, с возможностью менять части запроса динамически, в зависимости от логики вашей выборки. На базе данного сервиса вы можете создать много вариантов выборок данных, которые соответствуют вашим правилам. Результаты выгрузки данных из вашего магазина или из магазина вашего заказчика может являться входными данными для дальнейших преобразований данных.


      1. AlexeyUral
        22.01.2022 19:07

        И снова этот вопрос, зачем?

        Выгрузить, получить csv и крутить в excelе как угодно.

        Было 2 магазина на opencart 3, 1000+ позиций, не разу и близко к этой "проблеме" не пришел.

        Ну и всегда есть доступ к бд.


        1. taluyev Автор
          22.01.2022 22:22
          -1

          Алексей,

          спасибо за ваш вопрос.

          Да, можно выгрузить набор данных из базы данных используя язык запросов SQL, потом сохранить данные в формате CSV и открыть в Excel с целью последующего анализа.

          Указанные выше операции являются ручными, то есть, чтобы получить новый Excel файл, нужно пподелать эту работу снова. Если нужно сформировать набор данных состоящий из нескольких выборок, то нужно сделать больше работы. Когда необходимо что-то сделать еще с полученными данными или послать данные кому-то или делать задачу на регулярной основе, в голову приходит мысль автоматизировать процесс подготовки данных.

          Идея сервиса автоматизировать и упростить процесс получения данных.

          В ядро сервиса заложена функциональность пост-обработки полученных данных, например очистка описаний товаров от HTML тегов и другое.

          При необходимости предоставлять данные "наружу" можно сделать простейший сайт, использующий ресурсы сервиса выгрузок. Есть идея создать "хранилище моделей выгрузок". В таком случае сайт делать не придется: создали модель и расшарили ееобходимый URL потребителям данных.