Привет, Хабр! Меня зовут… хотя какая разница. Важно другое: я программист, и у меня есть неприятная особенность — вместо того чтобы нормально отдыхать, я начинаю писать код. Обычно это заканчивается каким-нибудь полурабочим скриптом, который потом пылится на гитхабе. Но в этот раз получилось нечто большее. Возможно, даже полезное.

Всё началось с того, что клиент попросил создать 50 поддоменов для своего интернет-магазина на OpenCart. Ну, знаете, эти мультимагазины: spb.akarius.rumsk.akarius.runsk.akarius.ru и так далее. Вручную создавать каждый — это 50 раз заполнить одну и ту же форму, 50 раз привязать категории, товары, производителей, 50 раз скопировать SEO-урлы. При этом важно не ошибиться в путях к логотипам, не забыть про SSL и прочую ерунду. Я прикинул: если на один магазин тратить 15 минут, то на 50 — больше 12 часов чистой, монотонной, убивающей мозг работы.

И тут я понял: либо я сейчас напишу скрипт, либо уволюсь к чертям. Пальцы сами потянулись к клавиатуре. В итоге родилась программа, которую я скромно назвал DataGrip-style OpenCart Store Generator. Звучит пафосно, но на самом деле это просто генератор SQL-запросов, который берет данные из Excel и дампа существующего магазина, а на выходе дает готовый скрипт для вставки в базу.

Что она умеет?

Представьте: вы открываете программу, загружаете табличку Excel, где в столбик перечислены названия будущих магазинов и их URL. Потом указываете ID магазина-донора (того, с которого нужно скопировать настройки) и загружаете его SQL-дамп. Программа вытаскивает оттуда всё: название, мета-теги, контактные данные, логотипы (и правильно чистит пути, чтобы логотип не искался в несуществующей папке). А еще — она собирает все ID категорий, товаров и производителей из донора и автоматом подставляет их в значения по умолчанию. То есть если у вас в дампе есть категория с ID 12, то для нового магазина в поле «категории» будет красоваться «12».

Но это ещё не всё! Из дампа выдираются связи макетов: какие маршруты (information/sitemap, например) привязаны к каким макетам и к какому магазину. При генерации всё это копируется для новых магазинов. И SEO-урлы — тоже копируются. В общем, программа ведёт себя как заботливая мать: берёт все настройки из одного магазина и раздаёт их новорождённым.

Откуда что берётся?

Главные источники вдохновения (и данных):

  1. Excel-файл — в нём живут переменные данные: названия магазинов, их URL, может быть, собственные email'ы или телефоны. Вы сами решаете, из какой колонки что брать. Можно даже указать колонку с собственными ID магазинов, если очень хочется, но я настоятельно рекомендую довериться AUTO_INCREMENT — природа сама знает лучше.

  2. SQL-дамп существующего магазина — тут хранятся все настройки-константы: мета-теги, контакты, пути к логотипам, а также списки всех категорий, товаров и производителей. Программа парсит дамп, выискивая вставки в таблицы storesettingcategoryproductmanufacturer, а также в layout_route*_to_layout и даже в seo_url. Она не просто читает — она ещё и нормализует: например, если в дампе путь к логотипу указан как /image/catalog/logo.svg, программа превратит его в catalog/logo.svg, потому что OpenCart для подмагазинов требует именно такой формат.

Зачем это всё?

Чтобы не сойти с ума. Серьёзно, когда у тебя 50 магазинов, и в каждом нужно проверить, что логотип отображается, а SEO-урлы работают, мозг начинает плавиться. Автоматизация здесь — не роскошь, а средство выживания. Программа за 10 секунд генерирует SQL-скрипт, который остаётся только выполнить в phpMyAdmin или через консоль. Всё. Иди пей кофе, пока база данных делает своё дело.

Как этим пользоваться? (Инструкция для уставших)

Я постарался сделать интерфейс максимально дружелюбным, хотя, как программист, я знаю, что «дружелюбный интерфейс» для нас — это когда есть кнопки и они не падают с ошибками. Итак, по шагам:

  1. Запускаете программу. Перед вами три вкладки: «Excel & Settings», «Mapping» и «SQL Output». Не пугайтесь, мы пойдём по порядку.

  2. На вкладке Excel & Settings нажимаете «Обзор…» и выбираете свой Excel- или CSV-файл с данными. Программа покажет табличку с предпросмотром. Если данные нужно отсортировать — выбираете колонку и порядок, жмёте «Применить сортировку». Удобно, когда в Excel всё вперемешку.

  3. Вводите префикс таблиц (обычно oc_), а в поле «Шаблон store_id» — ID магазина-донора (например, 1). Нажимаете «Загрузить SQL дамп» и указываете путь к файлу с дампом. Программа немного подумает и выдаст сообщение, сколько настроек и ID она нашла.

  4. Переходите на вкладку Mapping. Здесь вы увидите таблицу со всеми параметрами, которые можно настроить. Для каждого параметра можно выбрать:

    • Колонку в Excel — если значение нужно брать из файла.

    • Значение по умолчанию — если колонки нет, но значение важно.

    • Источник — Excel, Default (значение по умолчанию), Template (из дампа) или Skip (пропустить).
      Программа сама подскажет, что она нашла в дампе, в колонке «Значение в шаблоне». Например, если в дампе был config_logo с путём, вы это увидите. Можно ничего не менять, если вас устраивает, что категории подставятся из дампа, а название магазина — из Excel.

  5. Возвращаетесь на вкладку Excel & Settings, указываете начальную строку (если нужно пропустить шапку таблицы) и диапазон строк (например, 1-5,7,9-12). Если оставить пустым, обработаются все строки от начальной до конца.

  6. Жмёте «Сгенерировать SQL». Программа начнёт колдовать, показывая прогресс: «Генерация... 5/50». В это время можно заварить чай или просто смотреть, как бегают циферки.

  7. Когда всё готово, откроется вкладка SQL Output с готовым скриптом. Там будут вставки в oc_store, затем SET @store_id = LAST_INSERT_ID();, потом настройки в oc_setting, привязки категорий, товаров, производителей, копирование SEO-урлов и, наконец, копирование маршрутов макетов. Всё в обратных кавычках, всё красиво.

  8. Нажимаете «Сохранить SQL в файл» и сохраняете скрипт. Потом заходите в phpMyAdmin или любимую консоль и выполняете его. Готово! У вас 50 новых магазинов с правильными настройками, категориями и SEO.

А что с логотипами и протоколами?

Я же говорил, программа заботливая. Если в Excel URL написан как nalchik.akarius.ru (без протокола и слеша), она добавит https:// и / на конце. Если путь к логотипу начинается с /image/, она отрежет лишнее, потому что в OpenCart для подмагазинов логотипы должны быть относительно папки image, а не с абсолютным путём. Мелочь, а приятно.

Кому это нужно?

  • Владельцам сетей магазинов на OpenCart.

  • Фрилансерам, которым надоело делать однотипные задачи.

  • Тем, кто хочет сэкономить время и нервы.

  • Любопытным программистам, которые любят смотреть, как из хаоса рождается порядок.

Послесловие

Я писал эту программу в перерывах между купанием в море и поеданием местных фруктов. Код, конечно, не идеален — где-то можно оптимизировать, где-то добавить проверок. Но главное: она работает и уже спасла меня от нескольких дней тоски. Если вам пригодится — пользуйтесь. Если найдёте баги — не стесняйтесь, пишите, я что-нибудь придумаю. А если вы тоже в отпуске и читаете это — закройте ноутбук и идите отдыхать. Программирование подождёт.

Осталось решить с common/home и sity менеджером и можно выдохнуть

Ваш покорный слуга,
Кодер-отпускник

ссылка на гитхаб https://github.com/ybbarovilias-rgb/opencart/blob/e3d0e977fba7f437d8264555093b5a1509ea1a00/генератор магазинов Opencart.py