Drupal → Модуль EAV Field — хранение большого числа характеристик сущности в одном поле

03.01.2020

Описание

Несколько лет назад я описывал способы реализации каталога с большим количеством атрибутов товара и одним из способов было использование модели 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

Атрибуты (не значения) можно расширять своими полями.

Интеграция с Facets добавляется с помощью стороннего модуля Search API EAV Field (не подходит, когда число атрибутов переваливает за тысячу).

Написанное актуально для
Drupal 8+
Похожие записи

Комментарии

Гость
07.01.2020, 05:05

Для Search API и Feeds - было бы шикарно :)))

Василий Лукасевич
17.01.2020, 14:12

Как бы это ещё подружить с commerce variations?

@Василий Лукасевич, что там дружить?

Василий Лукасевич
17.01.2020, 14:51

Чтобы они работали как commerce attributes

Это два совершенно разных функционала

Гость
07.11.2020, 22:20

что значит Is primary attribute в настройках атрибута ? Я смотрю в 9ке уже есть интеграция с search api но с facet что-то не получается подружить. То атрибуты выводит, то значения по отдельности. Есть может мануал какой-то по настройке именно с связке с фасетами ?

Василий
07.11.2020, 22:21

Чтобы с facet подружить, скорее всего, придётся написать свой процессор

"Is primary attribute" просто поле, по которому форматтер может фильтровать атрибуты. Например можно в тизере вывести только основные атрибуты (primary), а на странице товара все, просто поставив галочку в форматтере.

Ни с search api, ни с фасетами интеграции нет.

Гость
07.11.2020, 23:45

Ни с search api, ни с фасетами интеграции нет.

Странно, а настройки в search api есть для EVA полей и атрибутов . Более того, даже получалось фасеты выводить, но работают они не так как хотелось бы поэтому и спросил про манул

Василий
08.11.2020, 09:51

Потому что в 8/9 search api работает со всеми сущностями

Гость
10.11.2020, 10:33

Странная штука. Создал атрибуты, заполнил их в товаре, теперь нужно удалить значение одного из атрибутов но при сохранении материала это значение не удаляется. Если изменить, меняется, а пустым теперь поле не хочет оставлять. Кэш чистил, включал отключал, в чем проблема может быть ? Друпал 9

Не могу воспроизвести. Попробуйте скачать последнюю версию модуля.

Гость
10.11.2020, 13:25

Для друпал 9 она одна, самая последняя от 6.06 eav_field 2.x-dev.

С 6.06 там уже десяток коммитов был

Павел
28.04.2023, 03:24

Здравствуйте!

Drupal 10 последней версии.
При переходе на страницу /admin/structure/eav/attributes отображается "На сайте произошла непредвиденная ошибка. Пожалуйста, повторите попытку позже.".
В журнале: "Drupal\Core\Entity\Query\QueryException: Entity queries must explicitly set whether the query should be access checked or not. See Drupal\Core\Entity\Query\QueryInterface::accessCheck(). in Drupal\Core\Entity\Query\Sql\Query->prepare() (line 141 of /var/www/[папка сайта]/public_html/core/lib/Drupal/Core/Entity/Query/Sql/Query.php)."
На Drupal 9 все работает замечательно.
Не подскажите в чем может быть дело?

Пожелание. Сделайте, пожалуйста, чтобы машиное имя формировалось автоматически, на основе названия атрибута. Или добавьте кнопку, при нажатии на которую, формировалось машинное имя.

@Павел поставьте dev версию модуля

Дмитрий
07.02.2024, 15:43

Здравствуйте!
Drupal 9 последней версии.
При переходе на страницу /product/1/edit-eav/field_params TypeError: Drupal\Core\Field\WidgetPluginManager::prepareConfiguration(): Argument #2 ($configuration) must be of type array, null given, called in /var/www/html/web/core/lib/Drupal/Core/Field/WidgetPluginManager.php on line 88 in Drupal\Core\Field\WidgetPluginManager->prepareConfiguration() (line 139 of core/lib/Drupal/Core/Field/WidgetPluginManager.php).

Сразу ставил 2.0.3, затем 2.x-dev - не помогло

@plague https://git.drupalcode.org/project/eav_field/-/blob/2.x/src/EavAttributeListBuilder.php?ref_type=heads#L203

Добавить комментарий