Sto usando un Entity Browser (2.x-dev in Drupal 8) come widget di modulo per il campo base di riferimento di entità di un'entità personalizzata. Il browser entità è configurato
- come display modale,
- con widget singolo,
- e nessun display di selezione,
- utilizzando una vista con il campo di selezione in blocco del browser entità come widget e
- per aggiungere le entità scelte alla selezione corrente del campo di riferimento.
La selezione delle entità funziona correttamente. Ma il campo di riferimento dell'entità non deve avere duplicati.
Per facilitare la selezione di entità senza duplicati, vorrei filtrare le entità già scelte dai risultati di visualizzazione del browser delle entità. Quindi gli utenti vedranno solo entità non selezionate.
A tale scopo, ho creato un plug-in viste personalizzate argomento_default che espone la memoria di selezione del browser entità come argomento predefinito del contesto per l'ID entità:
<?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;
}
}
Il problema che devo affrontare è che la selezione corrente all'interno dell'archivio di selezione è sempre vuota, indipendentemente dal numero di entità selezionate nel campo di riferimento dell'entità e anche dopo aver completato la selezione modale e aperto nuovamente il browser entità.
Cosa devo fare per visualizzare la selezione corrente nella memoria di selezione del browser entità?
#default_value
) deve essere considerata anche come filtro.