Estou usando um navegador de entidade (2.x-dev no Drupal 8) como widget de formulário para o campo base de referência de entidade de uma entidade personalizada. O navegador da entidade está configurado
- como uma exibição modal,
- com um único widget,
- e nenhuma exibição de seleção,
- usando uma visualização com o campo de seleção em massa do navegador da entidade como widget e
- anexar entidades escolhidas à seleção atual do campo de referência.
A seleção das entidades está funcionando bem. Mas o campo de referência da entidade não deve ter duplicatas.
Para facilitar a seleção de entidades sem duplicatas, gostaria de filtrar entidades já escolhidas nos resultados da exibição do navegador de entidades. Portanto, os usuários verão apenas entidades não selecionadas.
Para esse fim, criei um plug-in argumento_default de exibições personalizadas que expõe o armazenamento de seleção do navegador da entidade como argumento padrão de contexto para o ID da entidade:
<?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;
}
}
O problema que enfrento é que a seleção atual no armazenamento de seleção está sempre vazia, independentemente de quantas entidades foram selecionadas no campo de referência da entidade, e mesmo depois de concluir a seleção modal e abrir o navegador da entidade novamente.
O que preciso fazer para que a seleção atual seja exposta no armazenamento de seleção do navegador da entidade?
#default_value
) precisa ser considerada também como filtro.