Обновить

Сервис для выгрузки данных из E-Commerce CMS OpenCart

MySQL *SQL *Разработка под e-commerce *Управление e-commerce *Data Engineering *

Дорогие читатели, позвольте представить вам программный сервис, разработанный для экспорта данных из электронных магазинов созданных на основе 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/

Теги:
Хабы:
Всего голосов 25: ↑1 и ↓24 -23
Просмотры 2.6K
Комментарии Комментарии 8

Минуточку внимания