Версия: 2.0.0
Дата: 2026-03-23
ФАЗА 0: ПАРАМЕТРЫ ФАЗА 1: СБОРКА ФАЗА 2: ТЕМА ФАЗА 3: КОНТЕНТ
───────────────── ───────────────── ───────────────── ──────────────────
Требования Drupal CMS ideal_theme Демо-данные
Вариант START + Commerce поверх Bootstrap товары, категории
Ниша товаров + модули кастомные шаблоны для тестирования
Дизайн-пресет
Определяем всё ДО первой команды в терминале.
Выбираем стартовый пакет из RECIPES.md:
| Вопрос | Ответ → Вариант |
|---|---|
| Нужен ли магазин? | Нет → ideal_start_free |
| Нужна корзина и заказ? | Да → ideal_start_base |
| Нужна онлайн-оплата и СДЭК? | Да → ideal_start_prof |
| Нужен мультисайт? | Да → ideal_start_corp |
Записать до установки — они нужны при создании Store:
Название: ...
Страна: RU (влияет на форму checkout)
Валюта: RUB
Оплата: ЮKassa / СБП / наличные
Доставка: СДЭК / Почта / Курьер
Нужен ли ideal_feat_* рецепт?
| Ниша | Рецепт |
|---|---|
| Одежда | ideal_feat_fashion |
| Продукты питания | ideal_feat_food |
| Автозапчасти | ideal_feat_auto |
| Мебель | ideal_feat_furniture |
| Цифровые товары | ideal_feat_digital |
| Универсальный магазин | не нужен |
Заполнить css/tokens.css ДО начала разработки:
--color-primary: #1a4f8a; /* ← изменить под бренд */
--color-accent: #e63946; /* ← акцентный цвет */
--font-base: 'Inter', sans-serif;
Результат Фазы 0: список параметров записан → переходим к Фазе 1.
composer create-project drupal/cms ideal-shop
cd ideal-shop
Результат: Drupal CMS с базовыми рецептами
# Магазин
composer require drupal/commerce
# Фильтры
composer require drupal/facets
composer require drupal/search_api
# Функционал
composer require drupal/commerce_wishlist
composer require drupal/commerce_promotion
composer require drupal/fivestar
# Базовая тема
composer require drupal/bootstrap_barrio
# Утилиты
composer require drush/drush
Результат: Все модули загружены
drush site:install --db-url=mysql://...
# Включить модули
drush en commerce commerce_product commerce_cart commerce_checkout
drush en facets search_api search_api_db
drush en bootstrap_barrio
# Применить рецепты Drupal CMS
drush recipe recipes/seo
drush recipe recipes/media
Результат: Рабочий Drupal с магазином
Через Drupal UI или drush:
Результат: Можно добавлять товары
web/themes/custom/ideal_theme/
├── ideal_theme.info.yml
├── ideal_theme.libraries.yml
├── ideal_theme.theme
├── css/
│ ├── tokens.css ← дизайн-токены (цвета, шрифты)
│ └── custom.css ← наши стили поверх Bootstrap
├── js/
│ └── custom.js ← AJAX корзина, фильтры
└── templates/ ← переопределение шаблонов
ideal_theme.info.yml:
name: Ideal Theme
type: theme
base theme: bootstrap_barrio
core_version_requirement: ^11
Результат: Дочерняя тема подключена
css/tokens.css:
:root {
--color-primary: #1a4f8a;
--color-accent: #e63946;
--color-text: #222;
--color-bg: #fff;
--font-base: 'Inter', sans-serif;
--border-radius: 8px;
}
Результат: Единая цветовая система
Переопределяем в templates/:
| Шаблон | Что делаем |
|---|---|
commerce-product--full.html.twig |
Страница товара: галерея, варианты, описание |
commerce-product-variation.html.twig |
Варианты (размер, цвет, объём) |
views-view-unformatted--products.html.twig |
Сетка каталога |
commerce-cart-block.html.twig |
Мини-корзина в шапке |
commerce-checkout-form.html.twig |
Оформление заказа |
Результат: Кастомный вид магазина
Bootstrap Card + наши расширения:
<div class="card h-100 product-card">
<div class="position-relative">
{{ product.image }}
{% if product.discount %}
<span class="badge bg-danger position-absolute top-0 end-0 m-2">
-{{ product.discount }}%
</span>
{% endif %}
</div>
<div class="card-body">
<h5 class="card-title">{{ product.title }}</h5>
<div class="price">
<span class="price-current">{{ product.price }}</span>
{% if product.price_old %}
<span class="price-old text-muted">{{ product.price_old }}</span>
{% endif %}
</div>
</div>
<div class="card-footer">
{{ add_to_cart_button }}
</div>
</div>
Результат: Карточка товара
Facets → Bootstrap Offcanvas на мобильном, sidebar на десктопе.
{# Десктоп: sidebar слева #}
<aside class="col-lg-3 d-none d-lg-block">
{{ facets }}
</aside>
{# Мобильный: кнопка + offcanvas #}
<button class="btn btn-outline-secondary d-lg-none"
data-bs-toggle="offcanvas"
data-bs-target="#filters">
Фильтры
</button>
<div class="offcanvas offcanvas-start" id="filters">
{{ facets }}
</div>
Результат: Фильтры на всех устройствах
Новые компоненты (нет в Bootstrap):
{# Прогресс до бесплатной доставки #}
<div class="delivery-progress">
<div class="progress">
<div class="progress-bar" style="width: {{ percent }}%"></div>
</div>
<p>Ещё {{ remains }} до бесплатной доставки</p>
</div>
Результат: Конверсионные механики
drush default-content:import
# или
drush php-script scripts/import-demo.php
Результат: Заполненный магазин для тестирования
| Тест | Инструмент |
|---|---|
| Добавить в корзину | Playwright |
| Оформить заказ | Playwright |
| Фильтры работают | Playwright |
| Mobile (375px) | Playwright viewport |
| Desktop (1440px) | Playwright viewport |
| Lighthouse > 85 | Lighthouse CI |
| Шаг | Что | Оценка |
|---|---|---|
| 0 | Параметры (вариант, Store, ниша, токены) | 10 мин |
| 1.1 | Drupal CMS (drupal/cms) |
5 мин |
| 1.2 | Composer модули | 3 мин |
| 1.3 | Установка + Commerce | 10 мин |
| 1.4 | Структура магазина | 15 мин |
| 2.1 | Создать ideal_theme (child of bootstrap_barrio) | 5 мин |
| 2.2 | tokens.css | 5 мин |
| 2.3 | Шаблоны Commerce | 30 мин |
| 2.4 | Карточка товара | 15 мин |
| 2.5 | Фильтры | 20 мин |
| 2.6 | Спец-компоненты | 20 мин |
| 3.1 | Демо-данные | 10 мин |
| Итого | ~2 часа |