Search by

roilafx / product

Kolya1222

There is no license information available for the latest version (dev-main) of this package.

EAV-атрибуты, варианты товаров, фильтрация каталога и массовый обмен данными (CSV, XLSX, XML, JSON, YML) для Evolution CMS CE.

Package info

github.com/Kolya1222/product

pkg:composer/roilafx/product

Statistics

Installs: 22

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

dev-main 2026-09-16 02:13 UTC

This package is auto-updated.

Last update: 2026-09-16 02:13:43 UTC


README

API-ориентированное решение для создания каталогов товаров с поддержкой вариантов для Evolution CMS CE. Пересборка классических TV под коммерческую составляющую. Включает в себя фильтрацию, импорт, экспорт, UI и CLI. Основная логическая единица - Атрибут, разделённый на общие и вариативные.

Требования: Evolution CMS CE 3.1.30+, PHP 8.1+.

Установка

  1. Установка пакета
    php artisan package:installrequire roilafx/product "*"
  2. Публикация стилей и скриптов
    php artisan vendor:publish --provider="roilafx\Product\ProductServiceProvider"
  3. Выполните миграции:
    php artisan migrate

Общие характеристики и Вариации

Пакет разделяет атрибуты товара на два типа:

  1. Общие характеристики (product_attributes) - атрибуты, принадлежащие самому товару (Бренд, Страна, Артикул). Выводятся отдельным блоком в админ-панели и участвуют в фильтрации наравне с вариантами.
  2. Вариации (product_variants) - торговые предложения (Цвет, Размер). У каждого варианта свой набор значений, которые хранятся в EAV и кэшируются в JSON-поле attrs_json.

Вывод каталога и фильтрация

Для вывода товаров и формы фильтрации на сайте используйте фасад ProductFilter. Рекомендуется метод getCachedFilteredProducts - тяжёлые запросы кэшируются.

<?php

namespace EvolutionCMS\Shop\Controllers;

use roilafx\Product\Facades\ProductFilter;
use roilafx\Product\Helpers\FilterTypeHelper;

class CatalogController extends BaseController
{
    public function process()
    {
        parent::process();

        $catalogId = evo()->documentIdentifier;
        $depth = 3;    // глубина поиска в подкатегориях
        $perPage = 6;  // товаров на страницу

        $activeFilters = request('filters', []);
        $sort = request('sort', 'menuindex:asc');

        // Атрибуты категории и словарь имён для карточек товаров
        $allAttributes = ProductFilter::getAttributesForCatalog($catalogId, $depth);
        $attrNames = $allAttributes->pluck('name', 'code')->all();

        // Состояние фильтров: счётчики значений и диапазоны
        // пересчитываются с учётом активных фильтров
        $filterState = ProductFilter::getFilterState($catalogId, $activeFilters, $depth)
            ->map(fn ($attr) => [
                'code'   => $attr->code,
                'name'   => $attr->name,
                'type'   => FilterTypeHelper::widgetType($attr->field_type), // select | number | text
                'values' => $attr->filterValues, // списочные: [{value, count, available}]
                'min'    => $attr->filterMin,    // числовые: границы диапазона
                'max'    => $attr->filterMax,
            ]);

        // Товары с кэшированием
        $products = ProductFilter::getCachedFilteredProducts(
            $catalogId,
            $activeFilters,
            $perPage,
            $sort,
            request('page', 1),
            $depth
        );

        // Фильтры не сбрасываются при переходе по страницам
        $products->appends(request()->except('page'));
        $products->appends('depth', $depth);

        $this->addViewData([
            'filterState' => $filterState,
            'products'    => $products,
            'attrNames'   => $attrNames,
            'catalogId'   => $catalogId,
            'depth'       => $depth,
        ]);
    }
}

Для AJAX-обновления без перезагрузки те же данные отдают публичные маршруты GET /api/v1/catalogs/{id}/filter и GET /api/v1/catalogs/{id}/filter-state - без авторизации, с теми же параметрами (filters, sort, per_page, page, depth). Формат ответов - 04-api-reference.md

Работа с вариантами товаров (ProductVariantService)

use roilafx\Product\Services\ProductVariantService;

$variantService = app(ProductVariantService::class);

// Создание варианта для товара ID = 15
$variant = $variantService->createVariant(15, [
    'color' => 'Красный',
    'size'  => 'XL',
]);

// Обновление значений варианта
$variantService->updateVariant($variant, [
    'attrs' => ['color' => 'Синий'],
]);

Сервис автоматически проверит, назначены ли эти атрибуты товару, сохранит значения в EAV и обновит attrs_json.

CLI Инструменты

Генерация тестовых данных (10 категорий, 14 атрибутов, 4 пресета, 5000 товаров):

php artisan product:generate-test-data

Принудительный прогрев кэша фильтров для всех категорий каталога:

php artisan product:warm-cache

Импорт и экспорт каталога (csv/xlsx/xml/json/yml, идемпотентный, с отчётом):

php artisan product:import catalog.csv
php artisan product:export csv --parent_id=2

Документация

Файл Содержание
docs/01-installation.md Установка, миграции, публикация ассетов
docs/02-cli-commands.md Консольные команды: импорт, экспорт, тестовые данные, прогрев кэша
docs/03-exchange-schema.md Форматы файлов, канонические колонки, профили, режимы синхронизации
docs/04-api-reference.md HTTP API: атрибуты, категории, варианты, обмен, публичные маршруты фильтра
docs/05-ui-module.md Менеджер-модуль: пресеты, массовое назначение, профили импорта, запуск обмена
docs/06-ui-plugin-tab.md Вкладка в документе товара: поля вариаций, вариации, общие характеристики
docs/07-quick-start.md Быстрый старт: от установки до каталога с фильтром и импортом