Estoy usando un navegador de entidades (2.x-dev en Drupal 8) como widget de formulario para el campo base de referencia de entidad de una entidad personalizada. El navegador de la entidad está configurado
- como una pantalla modal,
- con un solo widget,
- y sin pantalla de selección,
- utilizando una vista con el campo de selección masiva del navegador de entidades como widget, y
- para agregar entidades elegidas a la selección actual del campo de referencia.
Seleccionar las entidades está funcionando bien. Pero el campo de referencia de la entidad no tendrá duplicados.
Para facilitar la selección de entidades sin duplicados, me gustaría filtrar las entidades ya elegidas de los resultados de la vista del navegador de entidades. Por lo tanto, los usuarios solo verán entidades no seleccionadas.
Para este propósito, creé un complemento predeterminado de argumentos personalizados de vistas que expone el almacenamiento de selección del navegador de entidades como argumento predeterminado de contexto para la ID de entidad:
<?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;
}
}
El problema que enfrento es que la selección actual dentro del almacenamiento de selección siempre está vacía, sin importar cuántas entidades se hayan seleccionado en el campo de referencia de la entidad, e incluso después de completar la selección modal y volver a abrir el navegador de la entidad.
¿Qué debo hacer para que la selección actual quede expuesta en el almacenamiento de selección del navegador de la entidad?
#default_value
) también debe considerarse como filtro.