xandeadx.ru Блог музицирующего веб-девелопера

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 пока нет и мной не планируется. Если кто-то хочет этим заняться то добро пожаловать в контриб.

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

Комментарии RSS

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

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

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

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

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

Это то понятно

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании