Хранилище классификации
Обзор
Хранилище классификации (classification store) похоже на тип данных «ключ/значение».
Этот тип позволяет добавлять произвольное количество пар ключ/значение к объектам с ограничением, что каждый ключ может быть добавлен к конкретному объекту только один раз.
Основные особенности:
- Можно иметь несколько хранилищ с полностью изолированными наборами функций.
- Поддерживается наследование.
- Объект может содержать более одного поля типа Classification Store.
- Поддерживается локализация (опционально; настраивается в определении класса).
- Введено понятие языка запасного варианта (fallback).
- Поддерживаются все простые типы данных (textarea, date и т. п.). Хранилище можно расширять собственными типами данных.
- Используется встроенный механизм определения полей и редактирования данных (валидация и пр.).
- Ключи можно организовывать по группам.
- Ключ может принадлежать нескольким группам.
- Отдельные ключи не добавляются напрямую в объект — добавляются соответствующие группы.
- Допустимые группы можно ограничивать в определении класса.
Конфигурация хранилищ классификации
Перед использованием нужно определить по крайней мере одно хранилище классификации (store) с коллекциями (collections), группами (groups) и ключами (keys).
Определение ключа
- В административной панели перейдите в раздел Classification Store (в меню Objects):

- При необходимости создайте новое хранилище (store)
- Добавьте ключ (key)
- Выберите тип

- Нажмите кнопку конфигурации справа для детальной настройки
- Примечание: не все настройки будут учитываться (например,
indexed)

Определение групп и назначение ключей
- Используйте редактор групп для определения и организации ключей по группам
- Можно задать порядок сортировки
- Группы/ключи с меньшим значением сортировки отображаются первыми
- Ключ может принадлежать нескольким группам
- Имя группы не обязательно должно быть уникальным
- Используйте сетку справа для управления ключами, принадлежащими к выбранной группе
- Настройте порядок сортировки для редактора объектов, чтобы ключи с меньшими значениями отображались первыми
- Можно указать, какие ключи обязательны в рамках группы

Определение коллекций
- Группы при желании можно объединять в коллекции.
- Коллекция — просто контейнер, позволяющий добавлять несколько групп сразу, за ней не стоит дополнительной логики.

Определение класса
- Локализацию можно включить, по умолчанию доступен только язык по умолчанию (
default) - Допустимые группы можно ограничить, указав список id групп через запятую
- В классе можно иметь несколько полей Classification Store
- Настройте порядок групп для редактора объектов: группы с меньшими значениями сортировки отображаются первыми.
- Опционально можно выбрать: показывать все ключи или только непустые.
- Опционально можно отключить добавление/удаление групп в редакторе объекта (в этом случае добавление/удаление возможно только через API).
- Опционально можно задать ограничение на количество используемых групп.
Редактор объекта
- Группы можно добавлять и удалять кнопками add/remove.
- Ключи отображаются в указанном порядке сортировки; при равенстве порядка ключи сортируются по дате создания.

Наследование
В отличие от локализованных полей, fallback и унаследованные значения разрешаются в «горизонтальном» порядке.
Если значение не найдено на текущем уровне, просматривается родительский уровень в том же порядке языков.
Есть понятие default language (язык по умолчанию), который выступает как псевдо‑язык — крайняя резервная опция.
Пример: допустим, fallback для немецкого — английский. Запрашивая значение на немецком для объекта на уровне 3, если значение на том языке не найдено, система будет подниматься по дереву наследования до тех пор, пока не найдёт значение либо на том же языке на уровне выше, либо в языке по умолчанию.

Использование Classification Store через PHP API
// Установка значения, group id = 1, key id = 2, language = de
// значение имеет тип "quantity value", где 1 - идентификатор единицы измерения в этом примере
$heightValue = new \Pimcore\Model\DataObject\Data\QuantityValue(13, 1);
$object->getClassificationStore2()->setLocalizedKeyValue(1, 2, $heightValue, "de");
// 1 = group id
$object->getClassificationStore2()->setActiveGroups([1 => true]);
// предоставьте дополнительную информацию о том, к какой коллекции принадлежит группа
// группа 1 принадлежит коллекции с идентификатором 2
$object->getClassificationStore2()->setGroupCollectionMapping(1, 2);
// извлеките сопоставление
// это вернет 2 => коллекцию с идентификатором 2
$object->getClassificationStore2()->getGroupCollectionMapping(1);
// Получение значения, group id = 1, key id id = 2, language = de
$value = $object->getClassificationStore2()->getLocalizedKeyValue(1, 2, "de");
// получите список активных групп
$store = $object->getClassificationStore2();
$groups = $store->getActiveGroups();
// получить все значения в виде ассоциативного массива [groupId][keyid][language] => значение
$allValues = $store->getItems();
Получение данных групп и ключей
Метод ClassificationStore::getGroups() возвращает массив объектов Group. Соответственно, метод Group::getKeys() возвращает массив объектов Key для этой группы.
/** @var \Pimcore\Model\DataObject\Classificationstore $classificationStore */
$classificationStore = $dataObject->get<YOUR_CLASSIFICATION_FIELD>();
foreach ($classificationStore->getGroups() as $group) {
var_dump($group->getConfiguration()->getName());
foreach ($group->getKeys() as $key) {
$keyConfiguration = $key->getConfiguration();
$value = $key->getValue();
if ($value instanceof \Pimcore\Model\DataObject\Data\QuantityValue) {
$value = (string)$value;
}
var_dump([
$keyConfiguration->getId(),
$keyConfiguration->getType(),
$keyConfiguration->getName(),
$keyConfiguration->getTitle(),
$value,
($key->getFieldDefinition() instanceof QuantityValue),
]);
}
}
Метод Key::getValue() поддерживает аргументы language, ignoreFallbackLanguage и ignoreDefaultLanguage.
/** @var \Pimcore\Model\DataObject\Classificationstore\Key $key */
$key->getValue('en_GB', true, true);
Добавление новых элементов в хранилище классификации с помощью кода
// Ключ
// прежде всего, определите тип данных, который в этом примере является quantity value
$definition = new \Pimcore\Model\DataObject\ClassDefinition\Data\QuantityValue();
$definition->setName("height");
$definition->setTitle("Height");
$keyConfig = new \Pimcore\Model\DataObject\Classificationstore\KeyConfig();
$keyConfig->setStoreId($storeId);
$keyConfig->setName($name);
$keyConfig->setDescription($description);
$keyConfig->setEnabled(true);
$keyConfig->setType($definition->getFieldtype());
$keyConfig->setDefinition(json_encode($definition)); // The definition is used in object editor to render fields
$keyConfig->save();
// Группа
$groupConfig = new \Pimcore\Model\DataObject\Classificationstore\GroupConfig();
$groupConfig->setStoreId($storeId);
$groupConfig->setName($name);
$groupConfig->setDescription($description);
$groupConfig->save();
// Коллекция
$collectionConfig = new \Pimcore\Model\DataObject\Classificationstore\CollectionConfig();
$collectionConfig->setStoreId($storeId);
$collectionConfig->setName($name);
$collectionConfig->setDescription($description);
$collectionConfig->save();
// Добавление ключа в группу
$keyRel = new \Pimcore\Model\DataObject\Classificationstore\KeyGroupRelation();
$keyRel->setGroupId($groupConfig->getId());
$keyRel->setKeyId($keyConfig->getId());
$keyRel->save();
// Добавление группы в коллекцию
$groupRel = new \Pimcore\Model\DataObject\Classificationstore\CollectionGroupRelation();
$groupRel->setGroupId($groupConfig->getId());
$groupRel->setColId($collectionConfig->getId());
$groupRel->save();
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.