Как сделать, чтобы плагин имел раздельные настройки для нескольких магазинах в одной установке?
Добрый день.
Возник вопрос по разработке плагина.
У одного из наших клиентов на одной установке ShopScript находится 4 магазина.
Каким образом лучше организовать устройство плагина, если нам необходимо, чтобы:
- Для каждого магазина плагин имел индивидуальную копию настроек.
- Для каждого магазина плагин мог определять текущий активный магазин при обработке запросов пользователя.
Есть ли best practice и примеры на эту тему?
2 ответа
Что касается того, где хранить настройки, я вижу один хороший вариант и два плохих. Хороший: создайте таблицу в БД, одна строка = один домен со своими настройками. Плохой: отдельный файл-конфиг в wa-config/apps/shop с массивом вида domain => settings array. Очень плохой: хранить как параметры поселения в wa-config/routing.php. Плохие варианты теоретически возможны, но преимуществ по сравнению с БД я не придумал, а граблей можно найти целый лес.
Определить текущий активный домен во фронтэнде несложно:
// Вернёт адрес поселения (например "localhost/wa"), то есть URL до index.php без протокола и без финального слеша
wa()->getRouting()->getDomain()
// Вернёт путь внутри поселения (например "shop/"; если магазин поселен в корень, то пустую строку)
wa()->getRouting()->getRootUrl()
В бэкэнде это всё, конечно, бессмысленно. Но если есть конкретный заказ, можно определить, с какого поселения он был сделан. В параметры заказа (shop_order_params.name='storefront') сохраняется строка вида 'localhost/wa/shop/' (или 'localhost/wa', без слеша на конце, если магазин поселен в корень). Этого должно быть достаточно, чтобы найти нужный набор настроек плагина.
Имейте в виду, что не все заказы оформляются из фронтэнда. Если заказ создал оператор в бэкэнде, то параметра 'storefront' не будет.
Ещё в бэкэнде может пригодиться:
wa()->getRouting()->getByApp('shop')
Вернёт массив такого же формата, как wa-config/routing.php, (домен => список поселений) но только с записями для приложения shop.
Почему бы не хранить в таблице wa_app_settings для вашего плагина сериализованный массив настроек, и в качестве его ключей указывать строку вида domain/route, которая будет использоваться для идентификации витрин при чтении ранее сохранённых настроек из этой таблицы и записи в неё новых настроек.