Перейти к основному содержимому

Списки выбора с динамическими опциями

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

Кроме того, можно передать поставщику данных дополнительные статические параметры.

Обратите внимание, что есть два способа указать поставщика опций.

Просто указать имя класса ...

поле select

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

Пример определения сервиса в 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;
}

}

В результате будут сгенерированы следующие опции.

поле select

Контекстная информация для класса поставщика

Обратите внимание, что в зависимости от сценария не вся информация может быть доступна. Особенно это касается параметра 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
groupIdid группы
keyIdid ключа
keyDefinitionопределение поля classificationstore

Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.