Я использую Entity Browser (2.x-dev в Drupal 8) в качестве виджета формы для поля ссылки на сущность пользовательского объекта. Браузер сущностей настроен
- в качестве модального дисплея,
- с одним виджетом,
- и нет выбора дисплея,
- используя вид с массовой выборкой браузера в качестве виджета, и
- добавить выбранные объекты к текущему выбору ссылочного поля.
Выбор сущностей работает нормально. Но поле ссылки на сущность не должно иметь дубликатов.
Чтобы упростить выбор сущностей без дубликатов, я бы хотел отфильтровать уже выбранные сущности из результатов просмотра браузера сущностей. Таким образом, пользователи будут видеть только невыбранные объекты.
Для этой цели я создал пользовательский плагин arguments_default представлений, который предоставляет хранилище выбора обозревателя сущностей в качестве аргумента контекста по умолчанию для идентификатора сущности:
<?php
namespace Drupal\my_module\Plugin\views\argument_default;
use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface;
use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* The entity browser selection argument default handler.
*
* @ViewsArgumentDefault(
* id = "entity_browser_selection",
* title = @Translation("Entity Browser Selection")
* )
*/
class EntityBrowserSelection extends ArgumentDefaultPluginBase {
/**
* The selection storage.
*
* @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface
*/
protected $selectionStorage;
/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, KeyValueStoreExpirableInterface $selection_storage) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->selectionStorage = $selection_storage;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity_browser.selection_storage')
);
}
/**
* {@inheritdoc}
*/
public function access() {
return $this->view->getDisplay()->pluginId === 'entity_browser';
}
/**
* {@inheritdoc}
*/
public function getArgument() {
$argument = NULL;
$current_request = $this->view->getRequest();
// Check if the widget context is available.
if ($current_request->query->has('uuid')) {
$uuid = $current_request->query->get('uuid');
if ($storage = $this->selectionStorage->get($uuid)) {
if (!empty($storage['selected_entities'])) {
$argument = $storage['selected_entities'];
}
}
}
return $argument;
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что текущий выбор в хранилище выбора всегда пуст, независимо от того, сколько объектов было выбрано в поле ссылки на объект, и даже после того, как я завершу модальное выделение и снова открою браузер объекта.
Что мне нужно сделать, чтобы текущий выбор отображался в хранилище выбора браузера сущностей?
#default_value
) тоже должен рассматриваться как фильтр.