Списки выбора с динамическими опциями
Для типов данных выбора (select и multiselect) можно указать класс поставщика динамических опций. Это позволяет формировать список допустимых опций «на лету» вместо использования статического списка. Для типа select также можно определить значение по умолчанию во время выполнения.
Кроме того, можно передать поставщику данных дополнительные статические параметры.
Обратите внимание, что есть два способа указать поставщика опций.
Просто указать имя класса ...

... либо имя сервиса Symfony (с соответствующим префиксом).

Пример определения сервиса в services.yaml:
services:
website.optionsprovider:
class: Website\OptionsProvider
public: true
Требуется реализовать интерфейс Pimcore\Model\DataObject\ClassDefinition\DynamicOptionsProvider\SelectOptionsProviderInterface
Необходимо реализовать следующие методы:
getOptionsдолжен возвращать список допустимых опций в формате, показанном нижеgetDefaultValueдолжен возвращать значение по умолчаниюhasStaticOptionsдолжен возвращать, зависят ли опции от контекста объекта (т. е. разные опции для разных объектов) или нет. Это особенно важно для интерфейса сетки. Если опции зависят от контекста объекта, не будет режима массового присвоения. Фильтрация также будет возможна только через текстовое поле, а не через список опций.
<?php
namespace Website;
use Pimcore\Model\DataObject\ClassDefinition\Data;
use Pimcore\Model\DataObject\ClassDefinition\DynamicOptionsProvider\SelectOptionsProviderInterface;
class OptionsProvider implements SelectOptionsProviderInterface
{
public function getOptions(array $context, Data $fieldDefinition): array
{
$object = isset($context["object"]) ? $context["object"] : null;
$fieldname = "id: " . ($object ? $object->getId() : "unknown") . " - " .$context["fieldname"];
$result = array(
array("key" => $fieldname .' == A', "value" => 2),
array("key" => $fieldname .' == C', "value" => 4),
array("key" => $fieldname .' == F', "value" => 5)
);
return $result;
}
/**
* Возвращает значение, которое задано в поле "Default value"
*/
public function getDefaultValue(array $context, Data $fieldDefinition): ?string
{
if (method_exists($fieldDefinition, 'getDefaultValue')) {
return $fieldDefinition->getDefaultValue();
}
return null;
}
public function hasStaticOptions(array $context, Data $fieldDefinition): bool
{
return true;
}
}
В результате будут сгенерированы следующие опции.

Контекстная информация для класса поставщика
Обратите внимание, что в зависимости от сценария не вся информация может быть доступна. Особенно это касается параметра object — его наличие не гарантировано, потому что поставщик опций также может быть вызван при сохранении класса или при программном вызове $class->getFieldDefinitions().
Вызовы, предназначенные для определения layout, можно отличить от других по параметру purpose — для layout он будет установлен в значение layout.
Параметр purpose может принимать следующие значения:
| Значение | Описание |
|---|---|
| null | неизвестно |
| layout | макет режима редактирования |
| gridconfig | конфигурация сетки (обычно нет необходимости задавать динамические опции) |
| gridview | представление сетки |
Объект (верхний уровень)
| Название | Описание |
|---|---|
| object | сам объект ("object") |
| fieldname | имя поля select (например, dynSelect) |
Локализованные поля
| Название | Описание |
|---|---|
| ownerType | "localizedfield" |
| ownerName | имя локализованного поля ("localizedfields") |
| object | сам объект ("object") |
| fieldname | имя поля select (например, dynSelect) |
Objectbricks
| Название | Описание |
|---|---|
| containerType | "objectbrick" |
| containerKey | тип objectbrick |
| outerFieldname | имя поля объекта, содержащего objectbrick |
| object | сам объект ("object") |
| fieldName | имя поля внутри objectbrick |
Fieldcollections
| Название | Описание |
|---|---|
| containerType | "fieldcollection" |
| containerKey | тип fieldcollection |
| subContainerType | тип вложенного контейнера (например, локализованное поле внутри fieldcollection) |
| outerFieldname | имя поля объекта, содержащего fieldcollection |
| object | сам объект ("object") |
| fieldName | имя поля внутри fieldcollection |
Classification Store
| Название | Описание |
|---|---|
| ownerType | "classificationstore" |
| ownerName | имя поля classificationstore |
| fieldname | имя поля внутри classificationstore |
| groupId | id группы |
| keyId | id ключа |
| keyDefinition | определение поля classificationstore |
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.