Теория и терминология.
Немного теории.
Что такое атрибуты и чем они отличаются от опций, Вы можете прочитать в интернете. Информации достаточно, например, здесь или здесь. Если коротко, то это характеристики, которые позволяют систематизировать товары, сравнивать товары, делать поиск или выборки с помощью фильтров.
В OpenCart принята следующая структура атрибутов:
Группа атрибутов
└── Атрибут
Значение атрибута относится к конкретному товару:
Товар
├── Ссылка на атрибут
└── Значение атрибута
Так вот, все, перечисленные выше, задачи выполняются анализируя именно значения атрибутов. Т.е. если Вы добавите атрибут в товар, но не впишите его значение, то анализировать будет нечего.
Любой товар может иметь несколько атрибутов. Любой атрибут может иметь несколько значений. Значение атрибута это, на самом деле, текстовое поле, куда через разделитель можно вписать несколько значений.
Модуль Attribut&co (визуально) приводит структуру атрибутов и значений к удобному виду и представляет эту структуру в виде дерева.
Группа атрибутов
└── Атрибут
└── Значение(список значений) атрибута
Понятие Группа атрибутов используется только для систематизации самих атрибутов. Товары же систематизируются по категориям. Поэтому, кажется логичным, сделать привязку определенного списка атрибутов с их значениями к определенной категории. Идея эта не нова и используется многими модулями, но именно эта идея лежит в основе работы данного модуля.
Категория товаров
└── Атрибут
└── Значение(список значений) атрибута
Термины и определения.
Термин | Описание |
---|---|
Разделитель атрибутов | Точнее было бы название Разделитель значений атрибутов. Повторимся, что у товара может быть несколько атрибутов и несколько значений
атрибутов. Значение записывается в поле типа TEXT в Базе Данных. Чтобы отделить одно значение от другого используется разделитель. Как правило это
"/" или ":" или ";" Современные фильтры, например filterpro, умеют разбирать такие конструкции. |
Группа | Группа Атрибутов используется для систематизации самих Атрибутов. |
Атрибут | Собственно Атрибут или характеристика товара. |
Атрибут категории | Атрибут, поставленный в соответствие какой-либо категории. Атрибут может быть поставлен в сотответствие нескольким категориям. Категория может иметь сопоставление с несколькими Атрибутами. Т.е. когда мы говорим Атрибуты категории, то имеем ввиду список Атрибутов, сопоставленных ("принадлежащих") категории. |
Шаблон | Набор Значений Атрибута через разделитель. Т.е. запись типа Значение1/Значение2/Значение3 |
Значение | Одиночное значение Атрибута, выделенное из Шаблона. Часто Шаблон состоит из единственного Значения |
Дежурный шаблон | Иначе можно назвать - шаблон по умолчанию. Это Шаблон, который хранится "вместе" с Атрибутом, содержит часто используемый набор Значений и может быть автоматически "присвоен" товару в соответствии со способом, заданным в настройках. |
Обозначение деревьев.
№ | Вкладка | Название | Описание |
---|---|---|---|
1 | Атрибуты | Группы атрибутов | Основное дерево, где можно производить все манипуляции с Группами, Атрибутами и Значениями - редактирование, сортировку, поиск, удаление, добавление. |
2 | Дежурные шаблоны | Дежурные шаблоны | Дерево для работы с Дежурными шаблонами. Редактирование, поиск. |
3 | Атрибуты категорий | Категории | Структура категорий, показанная в виде дерева. |
4 | Атрибуты категорий | Атрибуты | Дерево, аналогичное Группы атрибутов, служит для перетаскивания из него выбранного атрибута в нужную категорию с помощью технологии Drag-and-Drop либо копирования с помощью Copy-Paste. Желательно в структуру включать дочерние Дежурные шаблоны, чтобы напомнить, при добавлении Атрибута в категорию, какие Значения добавятся в товар. |
5 | Атрибуты категорий | Атрибуты категорий | Дерево, которое показывает категорию со всеми приписанными ей Атрибутами и их Шаблонами и Значениями. Здесь возможно добавить или удалить атрибуты. |
6 | Товары | Атрибуты товаров | Дерево, аналогичное Группы атрибутов, служит для выбора Атрибута, Шаблона или Значения и фильтрации товаров по выбранному. |
7 | Товары | Товары | Дерево, где отображаются товары для выбранного Атрибута, Шаблона или Значения. Справа от наименования товара, в скобках выводится id товара в БД и модель. Двойной клик по выбранному товару переадресует на карточку товара. |
Любая | Узел | Узел это по сути элемент дерева. Любое дерево состоит из Узлов. Узлы отображаются в виде папок либо других значков. Могут иметь текстовое название, могут быть пустыми. |
Шаблоны и значения.
Чтобы лучше понимать, что такое Значение, стоит напомнить, что это обычный текст, описывающий характеристику (Атрибут)
товара. Значение записывается в поле типа TEXT
в Базе Данных. Записать туда можно все, что угодно, например :
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua..."
.
Конечно, мы в это поле обычно пишем что-то более осмысленное, характеризующее именно наш товар. Более того, мы хотим, чтобы во всех товарах, содержащих это Значение, оно было бы одинаковым и по этому Значению можно было бы найти наши товары, например, с помощью фильтра.
С точки зрения разработчиков Opencart, конструкция Товар->Атрибут->Значение является достаточной, но на практике этого маловато. Часто встречается конструкция Товар->Атрибут->Набор Значений.
Например, я продаю модули для Opencart и хочу показать, некоторые из нх совместимы с версиями 1.5.x
, 2.0.1
, 2.1.x
, а другие еще и с версиями
2.3.x
, 3.0.x
. Я так и напишу в Значения Атрибута Совместимость
соответствующих товаров,
перечислив версии через разделитель - запятую или, допустим, слэш. v1.5.x/2.0.1/2.1.x
и v1.5.x/2.0.1/2.1.x/2.3.x/3.0.x
Opencart никак не отработает такую конструкцию, просто выведет ее целиком в карточке товара. Но умные люди придумали умные фильтры, чтоб расширить возможности структуризации товаров и их поиска по Значениям.
Ниже показано, как обрабатывает Opencart, Attribut&co, filterpro такие наборы Значений. Я их назвал Шаблоны. Не нравится это название? Зайдите в языковый файл и поставьте свое - "Наборы", "Списки" и т.д. Главное понимание, что это такое.
Итак Шаблон это набор Значений Атрибута, записанных через разделитель. Иногда его называют "Множественным значением".
Разделитель атрибутов или Разделитель значений атрибутов придумал не я. Вот как он выглядит в настройках популярных фильтров Mega Filter Pro и filterpro
Необходимо отметить, что Значение уникально для каждого товара. Если в каком-то товаре изменить одну букву в тексте, то остальных товаров это не коснется, даже если до этого Значения совпадали, а у вас появится еще одно Значение. То же самое верно и для Шаблонов.
Дежурный шаблон - значение по умолчанию.
Естественным желанием является то, чтобы при добавлении Атрибута в товар, синхронно добавлялось Значение или набор Значений. Особенно если Значения одни и те же, а операций надо выполнить много.
Эти Значения должны где-то храниться. Для этого и служит Дежурный Шаблон. Именно там храняться Значения, которые будут по умолчанию подставляться в товар, как только вы добавите туда Атрибут.
Для того чтобы подстановка состоялась, надо не забывать про настройки.
Дежурный Шаблон можно изменять многократно для подстановки других Значений в другие товары не затрагивая уже имеющиеся.
Для этого надо использовать настройку Подставлять дежурный только в пустые
.
Дежурный Шаблон можно удалять.
Принцип фильтрации товаров.
Режим совпадений.
Выбрано | Соответствие товаров |
---|---|
Атрибут | Все товары, где есть данный Атрибут. Выборка происходит по id, а не по наименованию, поэтому, если в другой Группе будет Атрибут с таким же наименованием, товары, ему соответствующие, в выборку не попадут. |
Шаблон | Все товары, где есть родительский Атрибут и поле, содержащее характеристики товара точно совпадает с выбранным Шаблоном. |
Значение | Все товары, где есть родительский Атрибут и поле характеристик товара содержит выбранное Значение . |

Режим расхождений.
Выбрано | Соответствие товаров |
---|---|
Атрибут | Все товары, где нет данного Атрибута. |
Шаблон | Все товары, где есть родительский Атрибут и поле, содержащее характеристики товара точно не совпадает с выбранным Шаблоном. |
Значение | Все товары, где есть родительский Атрибут и поле характеристик товара не содержит выбранное Значение . |

В режиме расхождений иконки папок в дереве товаров меняют цвет.
Загрузка узлов.
Медленная загрузка деревьев может свести на нет все усилия по облегчению работы с атрибутами. Поэтому, для дочерних узлов, таких как Шаблоны и Значения
используется, так называемая, ленивая (lazy) загрузка. Эти узлы не загружаются в момент загрузки дерева, а подгружаются по мере обращения к ним, т.е. по запросу. Вот почему при двойном клике на узел
Шаблоны или Значения прежде, чем откроется этот узел, приходится наблюдать индикатор загрузки .
Такая загрузка узлов дает существеный выигрыш при загрузке деревьев и их перезагрузки во время синхронизации, но накладывает особенности на работу фильтра. Т.к. при выполнении поиска фильтру приходится делать обход всего дерева и принудительно открывать все узлы, то поиск, во-первых, происходит медленно, во-вторых, некорректно работает счетчик найденных совпадений. Однако если запустить поиск повторно, то все происходит быстро и считается правильно, т.к. все узлы уже открыты.
Для открытия узлов используются ajax-запросы, каждый из которых вносит задержку до 1 секунды. Испытания на большом количестве атрибутов показали, что часто происходит зависание.
Начиная с версии 2.1.4 появилась возможность управлять режимом загрузки. Либо в настройках, либо через контекстное меню, можно включить или отключить режим ленивой загрузки. Если этот режим отключен, все узлы дерева загружаются полностью. Отпадает необходимость делать обход дерева и догружать узлы, что многократно ускоряет поиск.
Таким образом, если предполагается активное использование поиска, то лучше перезагрузить деревья, отключив ленивую загрузку.
Поскольку загрузка узлов производится с помощью асинхронных ajax запросов, иногда в консоли можно увидеть сообщения типа:
Это означает, что данные ajax запроса не успели загрузиться до начала их использования. Особенно это проявляется на медленных серверах. Ничего страшного, на результаты работы модуля это не влияет.
Мультиязычность и синхронизация.
Поскольку модуль является мультиязычным, то для каждого языка будут создаваться свои деревья. Для удобства к обозначениям деревьев будем прибавлять языковую приставку .ru или .en там, где это необходимо для объяснения. Для сохраниния целостности БД применяется синхронизация между деревьями. Например, при добавлении нового Атрибута в Группы атрибутов.ru, в дерево Группы атрибутов.en синхронно добавится новый Атрибут с названием "New attribute". То же самое касается Групп атрибутов. А вот Шаблоны, Значения и Дежурные шаблоны синхронно не добавляются.
Синхронизация происходит так же при редактировании Групп, Атрибутов, Шаблонов, Значений. Во всех деревьях, где присутствует изменяемый Узел, изменения происходят синхронно и в соответсвии с выбранным языком.