Drupal → Модуль EAV Field — хранение большого числа характеристик сущности в одном поле
Описание
Несколько лет назад я описывал способы реализации каталога с большим количеством атрибутов товара и одним из способов было использование модели EAV, когда все значения атрибутов хранятся в одном составном поле. Есть несколько модулей разной свежести, пытающиеся реализовать это в друпале, но меня ни один не устроил, поэтому родился EAV Field.
Модуль позволяет создавать список атрибутов (характеристик) разного типа (число, строка, список и т.д.), добавляет новый тип поля "EAV attributes" для хранения данных, новый виджет "EAV widget" для ввода данных и новый форматтер "EAV formatter" для вывода данных. Каждая категория товара может содержать свой набор атрибутов, поддерживаются глобальные атрибуты и наследование, когда дочерняя категория будет содержать атрибуты всех родительских категорий плюс свои. У каждого атрибута можно настроить виджет и форматтер для ввода и вывода его значения. Поддерживаются многозначные атрибуты.
Установка
1. composer require drupal/eav_field
2. vendor/bin/drush en eav_field
Использование
Если на сайте есть разбитие товаров (или других сущностей) на категории и у каждой категории будет свой набор атрибутов, то первым делом надо на странице admin/structure/eav/attributes/fields/eav_attribute.eav_attribute.category
указать словарь с категориями и сохранить настройки:
Дальше идём на страницу admin/structure/eav/attributes
и создаём нужные атрибуты, указывая название, тип, категорию, виджет и форматтер:
Если не указать категорию, то атрибут будет глобальным, т.е. доступен во всех категориях.
Третьим шагом идём в управление полями сущности и добавляем ей поле типа EAV attributes:
Из формы это поле можно убрать, потому что редактирование значений атрибутов будет доступно в отдельном табе:
На этом собственно всё.
Архитектура модуля максимально drupal way. Поле "EAV attributes" это reference на сущности типа "EAV value". Сущность "EAV value" состоит из reference на атрибут и по полю на каждый тип (строка, длинная строка, логическое, целое число, decimal, float и reference). В базе это выглядит так:
eav_attribute eav_attribute_field_data eav_attribute__category eav_value eav_value__boolean_value eav_value__decimal_value eav_value__entity_reference_value eav_value__integer_value eav_value__list_integer_value eav_value__list_string_value eav_value__string_long_value eav_value__string_value
Атрибуты (не значения) можно расширять своими полями.
Интеграции с Search API добавляется с помощью стороннего модуля Search API EAV Field.
Комментарии
Для Search API и Feeds - было бы шикарно :)))
Как бы это ещё подружить с commerce variations?
@Василий Лукасевич, что там дружить?
Чтобы они работали как commerce attributes
Это два совершенно разных функционала
Это то понятно
что значит Is primary attribute в настройках атрибута ? Я смотрю в 9ке уже есть интеграция с search api но с facet что-то не получается подружить. То атрибуты выводит, то значения по отдельности. Есть может мануал какой-то по настройке именно с связке с фасетами ?
Чтобы с facet подружить, скорее всего, придётся написать свой процессор
"Is primary attribute" просто поле, по которому форматтер может фильтровать атрибуты. Например можно в тизере вывести только основные атрибуты (primary), а на странице товара все, просто поставив галочку в форматтере.
Ни с search api, ни с фасетами интеграции нет.
Странно, а настройки в search api есть для EVA полей и атрибутов . Более того, даже получалось фасеты выводить, но работают они не так как хотелось бы поэтому и спросил про манул
Потому что в 8/9 search api работает со всеми сущностями
Странная штука. Создал атрибуты, заполнил их в товаре, теперь нужно удалить значение одного из атрибутов но при сохранении материала это значение не удаляется. Если изменить, меняется, а пустым теперь поле не хочет оставлять. Кэш чистил, включал отключал, в чем проблема может быть ? Друпал 9
Не могу воспроизвести. Попробуйте скачать последнюю версию модуля.
Для друпал 9 она одна, самая последняя от 6.06 eav_field 2.x-dev.
С 6.06 там уже десяток коммитов был
Оставить комментарий