Описание
Несколько лет назад я описывал способы реализации каталога с большим количеством атрибутов товара и одним из способов было использование модели 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 (не подходит, когда число атрибутов переваливает за тысячу).
- Модуль Geofield Yandex Maps — ввод и вывод гео-информации на Яндекс.Картах 2.1
- Добавить сторонней контент сущности своё базовое поле (base field)
- Расширить существующий виджет своим функционалом
- Модуль Taxonomy Term Reference Tree Widget — раскрывающийся древовидный виджет для полей Term reference
- Модуль Taxonomy container — виджет для Term reference с группировкой терминов
Комментарии
Для 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 там уже десяток коммитов был
Классно было бы подружить с feeds
Здравствуйте!
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 версию модуля
Здравствуйте!
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 - не помогло
Привет, поправь, пожалуйста, в коде. Нужно добавить accessCheck https://git.drupalcode.org/project/eav_field/-/blob/2.x/src/EavAttribut…
----
$query = $this->storage->getQuery()
->accessCheck(FALSE)
->sort('weight');
$query->pager($this->limit);
@plague https://git.drupalcode.org/project/eav_field/-/blob/2.x/src/EavAttributeListBuilder.php?ref_type=heads#L203
Добавить комментарий