J'utilise un navigateur d'entités (2.x-dev dans Drupal 8) comme widget de formulaire pour le champ de base de référence d'entité d'une entité personnalisée. Le navigateur d'entités est configuré
- comme affichage modal,
- avec un seul widget,
- et pas d'affichage de sélection,
- utiliser une vue avec le champ de sélection en masse du navigateur d'entités comme widget, et
- pour ajouter les entités choisies à la sélection actuelle du champ de référence.
La sélection des entités fonctionne correctement. Mais le champ de référence d'entité ne doit pas avoir de doublons.
Afin de faciliter la sélection des entités sans doublons, je voudrais filtrer les entités déjà choisies dans les résultats de la vue du navigateur d'entités. Les utilisateurs ne verront donc que les entités non sélectionnées.
À cette fin, j'ai créé un plug-in de vues personnalisées argument_default qui expose le stockage de sélection du navigateur d'entités comme argument par défaut du contexte pour l'ID d'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;
}
}
Le problème auquel je suis confronté est que la sélection actuelle dans le stockage de sélection est toujours vide, quel que soit le nombre d'entités sélectionnées dans le champ de référence d'entité, et même après avoir terminé la sélection modale et ouvert à nouveau le navigateur d'entités.
Que dois-je faire pour que la sélection actuelle soit exposée dans le stockage de sélection du navigateur d'entité?
#default_value
) doit également être considérée comme un filtre.