Про модель EAV (Entity–attribute–value) можно подробно почитать в Википедии. Не буду на этом останавливаться. Если вкратце, то это вертикальная модель (таблицы с небольшим количеством столбцов). На данный момент для Друпал 7 есть несколько модулей, которые позволяют применить такой подход на практике. Например, Field collection, Multifield, Double field. Единственное, что мне не нравится в них, это сложность интеграции с SearchApi + FacetApi.
Итак, много было мыслишек и идей, и вот наконец-то они начали воплощаться в жизнь. Хочу показать миру свою идею, для применения EAV модели на Друпал 7. Прелесть работы EAVfield поля заключается в том, что есть возможность из админки настроить индексацию атрибутов. Минусов и ограничений тоже много, но это же только начало разработки :-)
Теперь подробнее. Если заглянуть под капот, то все данные в этом поле хранятся в двух колонках с типом "целое число". Отсюда первое ограничение на данный момент: мы можем хранить в этом поле только три типа информации - целое значение, флаг (да/нет) или значение из списка (аналогично полю taxonomy_term_reference).
После установки модуля, первым делом нужно создать список доступных атрибутов. Я не стал использовать taxonomy, а создал свой "велосипед" механизм.
Если у атрибута будет выставлен тип "Список", то появится возможность добавить возможные варианты (Очень похоже на словарь с терминами таксономии). Группы применяются для условного разделения атрибутов. Например, у товара будет два поля - Основные параметры и Дополнительные параметры. Тогда логичнее разделить атрибуты на две группы: first и second к примеру. Но это совсем не обязательно. У каждого атрибута есть вес и машинное имя. Вес как обычно используется для сортировки при выводе списка, а машинное имя в планах хочу использовать для нормального именования полей для поискового индекса.
После настройки атрибутов можно добавлять EAVfield к ноде. У поля есть только одна дополнительная настройка - группа для ограничения атрибутов:
И не забудьте выставить количество значений поля - "Неограничено".
Для ввода значений есть два виджета:
- Просто два текстовых поля для ввода id атрибута и значения (применял его при разработке, думаю, он никому не понадобится)
- Full widget - основной виджет с ajax загрузкой возможных значений для списков
Можно заполнять данные о товарах...
В результате в БД данные будут храниться в таком виде:
Первая часть работы завершена. Теперь можно приступить к настройке индекса Search Api. Как создавать сервер и индекс товаров погуглите, я лишь покажу, что может EAVfield.
В настройках индекса на вкладке "Фильтры" есть возможность включить новый фильтр - "EAV field index":
И теперь в настройках фильтра можно добавлять атрибуты для индексации:
Для каждого атрибута можно нужно указывать Название, Имя поля из которого будет загружаться значение и тип самого значения. Можно проиндексировать числовое значение (у элемента списка это будет ID), или уже обработанное значение. Тогда элемент списка будет представлен текстовым значением.
После настройки индексации атрибутов на вкладке "Поля" можно будет включить данные атрибуты с текущий индекс.
В результате таблица индекса будет примерно такой:
Когда данные проиндексированы, дальше Search Api и Facet Api уже сделают свою работу....
P.S. Идеальный вариант, который я хочу получить - для списков хранить в индексе числовой значение, а в фильтрах выводить текстовое представление. Но пока хитрый Search Api ставит мне палки в колеса... И это странно, ведь такой функционал у него заложен в коробке (при работе с сущностями он так и делает)
Ближайшие планы:
- поддержка multi-value значений
- индексировать ID, но в фильтре выводить Название
- добавить новые типы данных (float и текст)
- исправление багов
У кого есть желание и возможность потестить работу - милости просим :-)
Комментарии
Добавить комментарий