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

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

Интеграции с Search API добавляется с помощью стороннего модуля 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 там уже десяток коммитов был

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