Оновлення сайту власними SQL-запитами через Elbuz Tunnel

13 хв

Вікно
«Вивантаження даних» → картка шаблону «Elbuz Tunnel» → «Налаштування SQL запитів»
Право доступу
окреме право на вікно «Налаштування SQL запитів»: без нього форма не відкриється, а спроба зберегти поверне «Немає доступу до SQL-запитів тунелю»
Підготувати
налаштований тунель, доступ до бази сайту й знання SQL — запити виконуються у бойовій базі

Маршрут задачі

  1. Додати сайту колонки uuid і заповнити їхРазово, будь-яким клієнтом MySQL
  2. Написати запити опізнанняВкладка «Перед оновленням»
  3. Написати запити оновленняВкладка «Після оновлення»
  4. Написати запити вставки нових записівВкладка «Після оновлення»
  5. Прогнати й прочитати журналЦентр операцій

Коли потрібні власні запити

Тунель оновлює сайт сам: обираєте CMS, натискаєте «Підключити» — і каталог їде в базу сайту. Але буває два випадки, коли готового сценарію не вистачає.

Вашої CMS немає в списку. У виборі рушіїв вісім пунктів, і останній — «MySQL (SQL custom query)». Це режим для саморобного сайту або рідкісної системи: тунель доставить дані в базу вашого сайту, а куди їх покласти далі — опишете ви самі запитами. Обов’язкова умова одна: сайт працює на MySQL і ви маєте доступ до його бази.

CMS у списку є, але оновлення треба доповнити. Типовий сценарій закриває каталог, ціни, залишки й фото. А от переписати ЧПУ наявних товарів, підставити свою формулу ціни, заповнити нестандартне поле, яке ваш програміст колись додав у таблицю сайту, — цього в сценарії немає. Такі доповнення теж пишуть запитами, у тому самому вікні.

Запити виконуються у бойовій базі вашого сайту — без попереднього перегляду, без «скасувати» і без питання «ви впевнені?». Помилковий UPDATE без WHERE зіпсує каталог одразу. Якщо SQL для вас нова тема, замовте налаштування в підтримки Elbuz або залучіть свого розробника.

Як це влаштовано: тимчасові таблиці

Ключ до всього — розуміти, що тунель не пише у ваші таблиці навпростець. Прогін іде у два такти.

Такт перший. Elbuz створює в базі вашого сайту власні тимчасові таблиці з іменами виду etrade_product_temp, etrade_category_temp, etrade_manufacturer_temp і заливає в них те, що ви відзначили до вивантаження. Це повна копія даних Elbuz у зручному для SQL вигляді: один рядок — один товар, категорія, атрибут.

Такт другий. Дані з тимчасових таблиць переносяться у бойові таблиці сайту — oc_product, b_iblock_element, як вони у вас називаються. Саме цей такт і робить драйвер CMS. У режимі «MySQL (SQL custom query)» такого драйвера немає, і другий такт пишете ви.

Звідси й головний принцип роботи: ваші запити з’єднують тимчасову таблицю з бойовою. Майже кожен запит у цій статті має вигляд «взяти etrade_*_temp, знайти відповідний рядок у таблиці сайту, оновити його».

Зв’язок тримається не на числовому id — він у Elbuz і на сайті різний, — а на uuid: символьному ідентифікаторі, який Elbuz присвоює кожному запису назавжди. У тимчасових таблицях є колонка uuid, і завдання підготовки — зробити так, щоб такий самий uuid лежав у таблиці сайту.

Вікно «Налаштування SQL запитів»

Відкривається з картки тунельного шаблону: секція «Додатково», кнопка «Налаштування SQL запитів» з іконкою бази даних. У шаблоні вивантаження всередині три вкладки.

ВкладкаКоли виконується
«Після оновлення»
відкрита першою
Після того, як драйвер CMS переніс дані у бойові таблиці. Основне місце для ваших запитів: тут дані на сайті вже є, і їх можна допрацювати
«Перед оновленням»Після заливання тимчасових таблиць, але до перенесення у бойові. Місце для підготовки: опізнати наявні записи, підправити дані у самих тимчасових таблицях
«Відкрити посилання»Не SQL. Сюди вписують адресу або шлях до PHP-скрипта, який треба смикнути після оновлення, — наприклад скидання кеша сайту

У шаблоні завантаження (коли ви навпаки забираєте дані із сайту) вкладка одна — «SQL запити для отримання даних із сайту». Там пишуть SELECT-и, якими тунель дістає з вашої бази категорії, товари й решту.

Вікно «Налаштування SQL запитів» з трьома вкладками та прикладами запитів UPDATE
1Вкладки «Після оновлення» / «Перед оновленням»
2Розділювач «;;;» в кінці запиту
  1. Вкладки перемикають, коли саме виконується SQL-запит — після або перед оновленням даних.
  2. Розділювач «;;;» позначає кінець одного запиту перед наступним у списку.

Редактор — з підсвіткою синтаксису MariaDB і номерами рядків. Кнопки «Зберегти» немає: через секунду після того, як ви перестали друкувати, текст ідеться на сервер сам, а під полем на п’ять секунд спалахує напис «Збережено:» з часом. Зворотного ходу в цього збереження немає, тому чернетки складних запитів зручніше тримати в окремому файлі.

Запити в полі розділяються не звичайною ;, а ;;; — трьома символами підряд. Один розділювач ставлять у кінці кожного запиту, включно з останнім:

UPDATE oc_product SET price = CEIL(price);;;

Поставите одну крапку з комою — уся пачка поїде на сайт як один запит і не виконається. Так само не працюють коментарі -- і #: переводи рядків до відправки прибираються, і коментар «з’їдає» весь залишок запиту, а той мовчки нічого не робить. Пояснення до запитів пишіть поза полем.

З версії модуля 3.2.0 обидва обмеження зняті: запити можна розділяти звичайною ;, а коментарі працюють як належить. Версію свого модуля покаже кнопка «Перевірити підключення». Поки на хостингу стоїть старіша — пишіть ;;; і без коментарів; цей спосіб правильний і для нових версій теж.

Перед кожною вашою пачкою програма сама виконує службові налаштування сеансу: знімає SQL_MODE, дозволяє великі вибірки, піднімає group_concat_max_len, дає тимчасовим таблицям до 2 ГБ пам’яті й розтягує innodb_lock_wait_timeout до 300 секунд. Дописувати це у своє поле не треба.

Куди у прогоні вбудовуються ваші запити

Порядок кроків видно в журналі прогону, у Центрі операцій. Для сайту на підтримуваній CMS він такий:

  1. дані заливаються у тимчасові таблиці etrade_*_temp;
  2. «Виконуємо SQL запити перед оновленням» — ваша вкладка «Перед оновленням»;
  3. «Оновлення сайту» — драйвер CMS переносить дані у бойові таблиці;
  4. фотографії викачуються з хмари на хостинг;
  5. «Виконуємо SQL запити після оновлення» — ваша вкладка «Після оновлення».

У режимі «MySQL (SQL custom query)» кроку 3 немає взагалі. Прогін виглядає так: залили тимчасові таблиці → виконали «перед оновленням» → викачали фото → виконали «після оновлення». Уся робота з бойовими таблицями сайту — у ваших двох полях.

Назва вкладки збиває з пантелику. На момент, коли виконується «Перед оновленням», тимчасові таблиці вже заповнені — інакше в них не було б чого опізнавати. «Перед» тут означає «перед злиттям із бойовими таблицями».

Сайт, якого немає в списку: підготовка

Один раз, до першого прогону, сайту треба дати колонку uuid — у ній зберігатиметься ідентифікатор запису з Elbuz. Приклад для OpenCart; замініть oc_ на префікс своїх таблиць і додайте ті таблиці, які вам потрібні.

ALTER TABLE oc_category        ADD uuid VARCHAR(36) NOT NULL, ADD INDEX (uuid);;;
ALTER TABLE oc_product         ADD uuid VARCHAR(36) NOT NULL, ADD INDEX (uuid);;;
ALTER TABLE oc_manufacturer    ADD uuid VARCHAR(36) NOT NULL, ADD INDEX (uuid);;;
ALTER TABLE oc_attribute       ADD uuid VARCHAR(36) NOT NULL, ADD INDEX (uuid);;;
ALTER TABLE oc_attribute_group ADD uuid VARCHAR(36) NOT NULL, ADD INDEX (uuid);;;

Далі — заповнити нову колонку для того, що на сайті вже лежить. Якщо каталог на сайті з’явився раніше за Elbuz, найпростіше взяти за uuid власний числовий ідентифікатор сайту:

UPDATE oc_category     SET uuid = category_id     WHERE uuid = '';;;
UPDATE oc_product      SET uuid = product_id      WHERE uuid = '';;;
UPDATE oc_manufacturer SET uuid = manufacturer_id WHERE uuid = '';;;
UPDATE oc_attribute    SET uuid = attribute_id    WHERE uuid = '';;;

Ці два набори виконують разово — хоч у phpMyAdmin, хоч через вкладку «Перед оновленням» на першому прогоні. Індекс по uuid обов’язковий: без нього кожне з’єднання тимчасової таблиці з бойовою перетворюється на повний перебір, і прогін на десятках тисяч товарів стає нестерпно довгим.

У режимі «MySQL (SQL custom query)» архівація бази сайту не працює: прапорець у картці шаблону стоїть, а копія не знімається, і в журналі не буде рядка «Створено архівну копію БД сайту:». Робіть копію засобами хостингу самі — і саме перед першим прогоном, поки запити ще не перевірені.

Крок 1. Опізнати те, що вже є на сайті

Мета кроку — проставити в тимчасових таблицях два поля: числовий id запису на сайті й прапорець row_exist. Після цього кожен рядок знає, оновлювати його чи створювати заново.

row_exist = 1 означає «такий запис на сайті вже є», row_exist = 0 — «його треба створити». Запити зручно тримати у вкладці «Перед оновленням».

Спершу категорії — знаходимо запис на сайті за uuid, потім батьківську категорію за uuid_parent, і аж тоді ставимо прапорець:

UPDATE etrade_category_temp t, oc_category c
   SET t.category_id = c.category_id WHERE t.uuid = c.uuid;;;
UPDATE etrade_category_temp t, oc_category c
   SET t.parent_id = c.category_id WHERE t.uuid_parent = c.uuid;;;
UPDATE etrade_category_temp SET row_exist = 1 WHERE category_id > 0;;;

Далі товари. Крім власного uuid, їм проставляють категорію й виробника — вони знадобляться при вставці:

UPDATE etrade_product_temp t, oc_product p
   SET t.product_id = p.product_id WHERE t.uuid = p.uuid;;;
UPDATE etrade_product_temp t, oc_category c
   SET t.category_id = c.category_id WHERE t.category_uuid = c.uuid;;;
UPDATE etrade_product_temp t, oc_manufacturer m
   SET t.manufacturer_id = m.manufacturer_id WHERE t.manufacturer_uuid = m.uuid;;;
UPDATE etrade_product_temp SET row_exist = 1 WHERE product_id > 0;;;

І виробники — так само за uuid:

UPDATE etrade_manufacturer_temp t, oc_manufacturer m
   SET t.manufacturer_id = m.manufacturer_id WHERE t.uuid = m.uuid;;;
UPDATE etrade_manufacturer_temp SET row_exist = 1 WHERE manufacturer_id > 0;;;

Той самий підхід — для зв’язок і атрибутів: etrade_product_to_category_temp опізнають за product_uuid і category_uuid, etrade_attribute_temp — за uuid і block_uuid, etrade_product_attribute_temp — за product_uuid і attribute_uuid (власний ідентифікатор рядка там називається row_uuid, а не uuid).

Крок 2. Оновити наявні записи

Усе, що позначене row_exist = 1, оновлюють звичайним UPDATE із з’єднанням по щойно проставленому числовому id. Ці запити вже кладуть у вкладку «Після оновлення».

UPDATE oc_product p, etrade_product_temp t
SET p.date_modified = NOW(),
    p.manufacturer_id = t.manufacturer_id,
    p.model = t.model,
    p.sku = t.mpn,
    p.price = t.price,
    p.quantity = t.quantity,
    p.status = t.status,
    p.weight = t.weight
WHERE t.row_exist = 1 AND t.product_id = p.product_id AND t.type_id = 1;;;

UPDATE oc_product_description d, etrade_product_temp t
SET d.name = t.name, d.description = t.description_full
WHERE t.row_exist = 1 AND t.product_id = d.product_id
  AND t.type_id = 1 AND d.language_id = 1;;;

Умова type_id = 1 тут не випадкова: у etrade_product_temp поряд зі звичайними товарами лежать товари-опції з type_id = 2. Якщо їх не відсікти, кожен варіант поїде на сайт окремою карткою.

Крок 3. Створити нові записи

Те, що лишилося з row_exist = 0, на сайті треба завести. Порядок важливий: спершу створюємо запис, потім одразу читаємо назад його новий числовий id у тимчасову таблицю — інакше наступні запити не знатимуть, до чого прив’язувати опис, фото й зв’язки.

INSERT INTO oc_category (date_added, sort_order, status, uuid)
SELECT NOW(), sort_order, status, uuid
FROM etrade_category_temp WHERE row_exist = 0 GROUP BY uuid;;;

UPDATE etrade_category_temp t, oc_category c
   SET t.category_id = c.category_id
 WHERE t.row_exist = 0 AND t.uuid = c.uuid;;;

INSERT INTO oc_category_description (category_id, description, language_id, meta_description, meta_keyword, name)
SELECT category_id, description_short, 1, meta_description, meta_keyword, name
FROM etrade_category_temp WHERE row_exist = 0;;;

Далі відновлюють ієрархію категорій — батька шукають за uuid_parent, — і тим самим способом заводять виробників і товари. Для фотографій у etrade_image_temp проставляють item_id — за item_uuid і row_type, який каже, чиє це фото: product, category, manufacturer, attribute, attribute_block або article. І вже потім записують імʼя файла в таблицю сайту.

Опізнання → оновлення → вставка → повторне опізнання нових записів → зв’язки. Якщо переставити місцями вставку й опізнання, нові товари на першому прогоні залишаться без опису й фото, а на другому дублюватимуться: uuid у них уже буде, а row_exist ви поставите не туди.

Довідник тимчасових таблиць

Тунель створює в базі сайту понад тридцять таблиць — рівно ті, які потрібні для відзначених вами даних. Ось ті, з якими працюють найчастіше.

ТаблицяЩо в ній
etrade_category_tempКатегорії: назва, описи, SEO-поля, uuid, uuid_parent, рівень вкладеності, порядок
etrade_product_tempТовари: ціни (price, price_rrp, price_old, price_cost), quantity, артикули (sku, mpn, model), штрихкоди, габарити, описи, SEO, статус наявності, type_id
etrade_product_to_category_tempЗв’язка «товар — категорія», з ознакою головної категорії
etrade_manufacturer_tempВиробники: назва, логотип, описи, SEO-поля
etrade_attribute_block_temp
etrade_attribute_temp
etrade_attribute_value_temp
etrade_product_attribute_temp
Блоки атрибутів, самі атрибути, довідник значень і значення, проставлені товарам
etrade_image_temp
etrade_image_seo_temp
Фотографії категорій і товарів та тексти alt/title до них
etrade_store_temp
etrade_warehouse_temp
etrade_product_store_temp
etrade_product_warehouse_temp
Магазини й склади, а також кількість і ціна товару в розрізі магазину або складу
etrade_currency_temp
etrade_language_temp
etrade_measure_temp
Довідники валют із курсами, мов і одиниць вимірювання
etrade_article_temp
etrade_review_temp
etrade_faq_temp
Статті, відгуки та питання-відповіді, якщо ви їх відзначили

Колонки, які є майже скрізь і потрібні в кожному запиті:

КолонкаПризначення
uuidСимвольний ідентифікатор запису в Elbuz — головний ключ зіставлення
row_existВаш прапорець: 1 — запис на сайті знайдено, 0 — треба створити
*_uuidПосилання на інший запис (category_uuid, manufacturer_uuid, product_uuid, item_uuid, language_uuid)
*_idЧисловий ідентифікатор на сайті; спершу порожній, його проставляєте ви на кроці опізнання
*_id_jumperЧисловий ідентифікатор у самому Elbuz. Є тільки у двох таблицях: product_id_jumper — у товарах, category_id_jumper і parent_id_jumper — у категоріях. Зручно, коли на сайті треба зберегти посилання назад у програму
type_idТільки в товарах: 1 — звичайний товар, 2 — товар-опція (варіант)
language_idМова рядка; для багатомовного сайту без неї не обійтися

Крім типових полів, у чотирьох таблицях — товари, категорії, виробники й контрагенти — з’являються ваші власні поля базового каталогу, ті, що ви завели самі. Їхні імена складаються з типу запису й номера поля: product_f451, category_f120, manufacturer_f88. Підглянути потрібне ім’я можна в налаштуваннях сітки базового каталогу. У решті таблиць, зокрема в атрибутах і фотографіях, власних полів немає.

Доповнити оновлення типової CMS

Коли CMS у списку є, опізнання й вставку робить драйвер, а ваші запити лише додають те, чого в сценарії немає. Ось випадки, по які звертаються найчастіше.

Переписати ЧПУ наявних товарів. Для OpenCart адреси прописуються тільки новим записам; щоб оновити наявні, потрібен окремий запит. Для OpenCart 3:

UPDATE oc_seo_url su
INNER JOIN etrade_product_temp e
        ON e.product_id = CAST(SUBSTRING(su.query FROM 12) AS UNSIGNED)
SET su.keyword = e.seo_url
WHERE e.row_exist = 1 AND e.seo_url != '' AND su.query LIKE 'product_id=%';;;

Для категорій у тому самому запиті міняють таблицю-джерело на etrade_category_temp, умову — на category_id=%, а зсув у SUBSTRING — на 13. Для OpenCart 2 замість oc_seo_url використовують oc_url_alias.

Підставити своє значення замість штатного. Наприклад записати в поле «Модель» на сайті внутрішній артикул Elbuz, а в штрихкод — gtin:

UPDATE oc_product p, etrade_product_temp t
SET p.model = t.sku, p.sort_order = t.sort_order, p.upc = t.gtin
WHERE p.product_id = t.product_id;;;

Дотягнути те, що сценарій не переносить. Повний опис і опис-інструкцію в нестандартні колонки, мінімальну кількість для замовлення, округлення ціни вгору:

UPDATE oc_product SET price = CEIL(price);;;
UPDATE etrade_product_temp t, oc_product p
   SET p.minimum = t.order_minimum WHERE t.uuid = p.uuid;;;
UPDATE oc_product SET stock_status_id = 5 WHERE quantity = 0;;;

1C-Bitrix: заповнити властивість товару. Властивості в Бітриксі зберігаються окремими рядками, тому спершу знаходять id властивості за її кодом, потім дописують значення тим елементам, у яких його ще немає, і тільки після цього оновлюють решту. Зв’язка з Elbuz тут іде через b_iblock_element.xml_id, куди тунель кладе uuid.

Перш ніж писати запит, загляньте в «Додаткові параметри» картки шаблону. Для 1C-Bitrix там можна просто вказати, з якого поля базового каталогу брати значення для властивості товару чи для конкретного типу ціни, — включно з множенням на курс валюти. Це те саме завдання без жодного рядка SQL.

Чого цей режим не робить

  • Не читає конфігурацію сайту. Для «MySQL (SQL custom query)» кнопка автоматичного підключення нічого не дізнається: адресу сервера, базу, користувача, пароль і префікс вписують руками.
  • Не створює колонку uuid. Для підтримуваних CMS це робить драйвер, для своєї — ви, запитом ALTER TABLE.
  • Не знімає архівну копію бази сайту. Прапорець є, дії немає.
  • Не перевіряє ваші запити. Ні синтаксису, ні складу: заборонених команд для цього поля немає, DROP TABLE збережеться так само спокійно, як UPDATE. Помилка спливе вже під час прогону, у журналі, а виконані до неї запити залишаться виконаними.
  • Не синхронізує ідентифікатори сам. Для CMS зі списку є окремий крок «Синхронізуємо ID позицій з БД сайту», який зіставляє записи за uuid. У режимі «MySQL (SQL custom query)» цього кроку немає — його замінюють ваші запити опізнання.
  • Не має попереднього перегляду. Кнопка «Перевірити», яка у фідів показує фрагмент для одного товару, у тунелю не працює.

Що робити, коли щось пішло не так

СимптомЩо зробити
У журналі «Error! Need mode LOAD DATA LOCAL INFILE! Variable local_infile: OFF»Дані приїздять на сайт CSV-файлом, і модуль заливає їх у тимчасову таблицю командою LOAD DATA LOCAL INFILE — а на вашому хостингу вона заборонена. У php.ini поставте mysqli.allow_local_infile = On, у my.cnf додайте local-infile=ON у секції [mysqld] і [mysql], перезапустіть MySQL. Перевірка: SHOW VARIABLES LIKE 'local_infile'
«mysqli_query(): LOAD DATA LOCAL INFILE forbidden»Те саме, але вимкнено на боці PHP: параметр mysqli.allow_local_infile у php.ini закоментований крапкою з комою — розкоментуйте й поставте On
Прогін падає на згадці про zipНа хостингу немає розширення PHP zip. Поставте його (php-zip, для Bitrix VM — php-pecl-zip) і перезапустіть веб-сервер. Які розширення є, показує кнопка «Перевірити підключення»
Запит виконався, а на сайті нічого не змінилосяНайчастіше — пропущений ;;; у попередньому запиті: пачка склеїлася в один рядок. Друга причина — запит стоїть у вкладці «Перед оновленням», а дані, які він чіпає, з’являються на сайті пізніше
Товари дублюються з кожним прогономНе проставився row_exist: або колонки uuid немає в таблиці сайту, або вона порожня у старих записів, або запит опізнання стоїть після запиту вставки
Прогін іде годинамиНемає індексу по uuid у таблицях сайту. Кожне з’єднання перетворюється на повний перебір
Кожен варіант товару став окремою карткоюУ запити оновлення й вставки не додано AND t.type_id = 1 — разом зі звичайними товарами поїхали товари-опції
«Query sql_query is empty» Запити їдуть на сайт одним POST-параметром, і він приїхав порожнім. Майже завжди винен Suhosin — захисне розширення PHP на хостингу сайту: воно обрізає надто довгі значення POST. Підніміть suhosin.post.max_value_length (а заодно suhosin.request.max_value_length) у налаштуваннях PHP сайту. Якщо доступу до них немає, тимчасово зменште обсяг одного прогону — звузьте перелік категорій, — але це обхід, а не рішення

Часті запитання

Чому запити розділяються трьома крапками з комою, а не однією?

Тому що весь текст їде на сайт однією посилкою, і модуль тунелю має розрізати його на окремі запити. Довгий час він робив це найпростішим способом — різав по ;;;, бо звичайна ; трапляється й усередині значень («ко;ло»), і в коментарях, і розріз ішов би посеред запиту. З версії модуля 3.2.0 розбір став розумнішим: він розрізняє лапки й коментарі, тому достатньо звичайної ;. Старий ;;; при цьому працює як і працював — саме ним розділені всі запити, які формує сама програма, і змішувати обидва види в одному полі можна.

Де мені взяти список полів тимчасової таблиці?

Найпростіше — подивитися саму таблицю в базі сайту одразу після прогону командою SHOW COLUMNS FROM etrade_product_temp. Склад полів залежить від того, що відзначено у вивантаженні, і в нього входять ваші власні поля базового каталогу з іменами виду product_f451.

Чи видаляються тимчасові таблиці після прогону?

Залежить від режиму. Для CMS зі списку останнім кроком прогону йде «Видаляємо тимчасові таблиці та файли», і таблиці зникають. А ось у режимі «MySQL (SQL custom query)» вони навмисно залишаються в базі сайту: ваші запити можуть виконуватися й після прогону, та й розбирати помилки зручніше, коли видно, що саме приїхало з Elbuz. Наступний прогін кожну таблицю все одно перестворює заново, тому даних із минулого разу там не накопичується.

Мої запити виконуються в базі Elbuz чи в базі сайту?

У базі вашого сайту. Elbuz лише передає текст модулю тунелю, а виконує його вже модуль, з тими правами, які має користувач бази, вказаний у налаштуваннях підключення. Тому таблиці в запитах пишуть із префіксом сайту (oc_product), а не з префіксом Elbuz.

Чи можна відкотити помилковий запит?

Ні. Запити виконуються у бойовій базі без транзакції, і скасування в інтерфейсі немає. Єдиний шлях назад — архівна копія бази сайту. Для підтримуваних CMS її знімає сам тунель, для режиму «MySQL (SQL custom query)» копію треба робити засобами хостингу самостійно.

Навіщо потрібні поля product_id_jumper і category_id_jumper?

У них лежать числові ідентифікатори записів у самому Elbuz. Вони потрібні, коли на сайті хочеться зберегти посилання назад у програму — наприклад записати ідентифікатор Elbuz у поле «Модель», щоб потім зіставляти замовлення. Для звичайного оновлення каталогу вони не потрібні: зіставлення тримається на uuid.

Я поставив CMS зі списку. Чи можу я все одно дописати свої запити?

Так, і це найчастіший спосіб застосування вікна. Драйвер зробить свою частину, а ваші запити з вкладки «Після оновлення» виконаються наприкінці — коли дані на сайті вже оновлені. Переписувати весь сценарій для цього не потрібно.

Суміжні теми

Чи була стаття корисною?