我正在使用实体浏览器(在Drupal 8中为2.x-dev)作为自定义实体的实体引用基础字段的表单小部件。实体浏览器已配置
- 作为模式显示
- 使用单个小部件,
- 没有选择显示,
- 使用带有实体浏览器批量选择字段的视图作为小部件,以及
- 将所选实体附加到参考字段的当前选择中。
选择实体工作正常。但是实体参考字段不得重复。
为了简化没有重复项的实体的选择,我想从实体浏览器视图结果中过滤已经选择的实体。因此,用户将仅看到未选择的实体。
为此,我创建了一个自定义视图arguments_default插件,该插件将实体浏览器选择存储公开为实体ID的上下文默认参数:
<?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
)视为过滤器。