Настройка модуля Commerce для интернет-магазина на Drupal
Drupal Commerce — это не плагин, а набор модулей, встраивающих e-commerce логику непосредственно в архитектуру Drupal. Товар — это узел (node) с полями, вариант — сущность (entity), заказ — entity со своим workflow. Эта гибкость позволяет строить нестандартные каталоги и процессы оформления, но требует понимания Entity API Drupal и специфики Commerce 2.x.
Commerce 2.x vs Commerce 1.x
Commerce 2.x переписан для Drupal 8+ и несовместим с первой версией. Ключевые отличия:
| Commerce 1.x (D7) | Commerce 2.x (D8/9/10) | |
|---|---|---|
| Архитектура | Rules + Features | Плагины + конфиг YAML |
| Управление состоянием | Rules | State Machine |
| Мультисайт | Сложно | Stores из коробки |
| API | Hook-based | OOP + Events |
Если проект на Drupal 7 — рассматривается или Commerce 1.x (legacy), или миграция на D10.
Базовая установка через Composer
composer require drupal/commerce drupal/commerce_price drupal/commerce_store \
drupal/commerce_product drupal/commerce_order drupal/commerce_cart \
drupal/commerce_checkout drupal/commerce_payment drupal/commerce_tax
drush en commerce commerce_product commerce_cart commerce_checkout \
commerce_payment commerce_tax commerce_order -y
drush cr
Минимальный набор зависимостей устанавливается автоматически через Composer.
Настройка магазина (Store)
Commerce 2.x поддерживает несколько магазинов в одном Drupal-инстансе:
/admin/commerce/config/stores → Add store
Конфигурация магазина:
- Default currency: BYN / RUB / USD (должна совпадать с базовой валютой сайта)
- Countries: список стран для shipping и billing адресов
- Default tax type: если магазин платит НДС, указывается тип налога
- Billing countries: страны, для которых будет рассчитываться налог
Магазин привязан к URL-адресу сайта — это важно при мультисайтовой настройке.
Типы продуктов
Commerce использует concept product/variation: Product — это «карточка товара», Variation — конкретный SKU с ценой и атрибутами.
Создание типа продукта:
/admin/commerce/config/product-types → Add product type
Настройка вариаций:
/admin/commerce/config/product-variation-types → Add variation type
→ Добавляем атрибуты: Цвет (color), Размер (size)
→ Генерировать вариации автоматически: Да
После создания атрибутов Drupal Commerce автоматически генерирует матрицу вариаций на форме редактирования товара.
Программная работа с продуктами:
use Drupal\commerce_product\Entity\Product;
use Drupal\commerce_product\Entity\ProductVariation;
// Создание вариации
$variation = ProductVariation::create([
'type' => 'default',
'sku' => 'CHAIR-BLK-L',
'price' => new Price('1499.00', 'RUB'),
'field_color' => ['target_id' => $colorTermId],
'field_size' => 'L',
'status' => TRUE,
]);
$variation->save();
// Создание продукта с вариацией
$product = Product::create([
'type' => 'default',
'title' => 'Кресло офисное',
'stores' => [$storeId],
'variations' => [$variation],
'status' => TRUE,
]);
$product->save();
Checkout Flow
Commerce 2.x позволяет полностью кастомизировать процесс оформления заказа через конфигурацию Checkout Flows:
/admin/commerce/config/checkout-flows → Manage
Доступные шаги (panes):
-
commerce_checkout_panes.login— авторизация/гость -
commerce_checkout_panes.order_information— адрес доставки -
commerce_checkout_panes.payment_information— данные оплаты -
commerce_checkout_panes.review— подтверждение -
commerce_checkout_panes.completion— страница успеха
Кастомный pane создаётся как плагин:
/**
* @CommerceCheckoutPane(
* id = "custom_gift_note",
* label = @Translation("Gift note"),
* default_step = "order_information",
* )
*/
class GiftNotePane extends CheckoutPaneBase
{
public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form): array
{
$pane_form['gift_note'] = [
'#type' => 'textarea',
'#title' => $this->t('Сообщение получателю'),
'#rows' => 3,
];
return $pane_form;
}
}
Подключение платёжных шлюзов
Commerce 2.x имеет официальные и community-модули для платёжных шлюзов:
# Stripe
composer require drupal/commerce_stripe
drush en commerce_stripe -y
# PayPal
composer require drupal/commerce_paypal
# Для РФ/СНГ — ЮKassa (неофициальный)
composer require drupal/commerce_robokassa
Конфигурация шлюза:
/admin/commerce/config/payment-gateways → Add payment gateway
→ Plugin: Stripe
→ Mode: Live / Test
→ Secret key: sk_live_...
→ Publishable key: pk_live_...
Управление складом
Commerce 2.x не включает инвентаризацию из коробки. Используется модуль:
composer require drupal/commerce_stock
drush en commerce_stock commerce_stock_local -y
После этого на вариации товара появляется поле остатка. Модуль поддерживает несколько локаций (складов):
/admin/commerce/config/stock → Stock service: Local stock
/admin/commerce/config/stock-locations → Add location
Программное управление остатком:
use Drupal\commerce_stock\StockServiceManagerInterface;
$stockService = \Drupal::service('commerce_stock.service_manager')
->getService($productVariation);
// Получить остаток
$level = $stockService->getStockLevel($productVariation, $locations);
// Изменить остаток (поступление)
$stockService->createTransaction(
$productVariation,
$locationId,
[],
100, // количество
new Price('0', 'RUB'),
'RUB',
TRANSACTION_TYPE_IN,
[]
);
Налоги
composer require drupal/commerce_tax
drush en commerce_tax -y
Конфигурация НДС для Беларуси (20%):
/admin/commerce/config/tax-types → Add tax type
→ Display inclusive pricing: Yes
→ Add tax rate: 20%
→ Territories: BY
Commerce Tax автоматически применяет нужную ставку по адресу покупателя.
Отображение каталога
Commerce продукты — обычные Drupal-ноды с дополнительными полями. Views подходит для построения каталога:
/admin/structure/views → Add view → Commerce products
→ Format: Unformatted list / Grid
→ Filter: Product: Status (Published)
→ Filter: Product: Stores → текущий магазин
→ Exposed filter: Product: Price range, Attributes
→ Sort: по дате, цене, релевантности
Для фасетного поиска — модуль search_api + facets + бэкенд Solr или Elasticsearch.
Производительность
Для высоконагруженных каталогов:
# BigPipe — прогрессивная загрузка страниц
composer require drupal/big_pipe
# Кеш для анонимных пользователей
/admin/config/development/performance → Page cache: 300 seconds
# Redis как кеш-бэкенд
composer require drupal/redis
В settings.php:
$settings['cache']['default'] = 'cache.backend.redis';
$settings['redis.connection']['host'] = '127.0.0.1';
Сроки реализации
- Установка + настройка магазина + типы продуктов: 2–3 дня
- Checkout flow с кастомными полями: 2 дня
- Интеграция платёжного шлюза: 1–3 дня (зависит от шлюза и наличия модуля)
- Управление складом через commerce_stock: 1–2 дня
- Каталог с Views + фасетный поиск: 2–4 дня
- Налоги + мультивалютность: 1–2 дня
Базовый рабочий магазин: 1,5–2 недели. Сложный каталог с кастомной бизнес-логикой — 3–5 недель.







