Ich verwende einen Entitätsbrowser (2.x-dev in Drupal 8) als Formular-Widget für das Entitätsreferenzbasisfeld einer benutzerdefinierten Entität. Der Entitätsbrowser ist konfiguriert
- als modale Anzeige,
- mit einem einzigen Widget,
- und keine Auswahlanzeige,
- Verwenden einer Ansicht mit einem Massenauswahlfeld des Entitätsbrowsers als Widget und
- um ausgewählte Entitäten an die aktuelle Auswahl des Referenzfelds anzuhängen.
Die Auswahl der Entitäten funktioniert einwandfrei. Das Entitätsreferenzfeld darf jedoch keine Duplikate enthalten.
Um die Auswahl von Entitäten ohne Duplikate zu vereinfachen, möchte ich bereits ausgewählte Entitäten aus den Ergebnissen der Entitätsbrowser-Ansicht filtern. Benutzer sehen also nur nicht ausgewählte Entitäten.
Zu diesem Zweck habe ich ein Plugin für benutzerdefinierte Ansichten argument_default erstellt, das den Auswahlspeicher des Entitätsbrowsers als Kontextstandardargument für die Entitäts-ID verfügbar macht:
<?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;
}
}
Das Problem ist, dass die aktuelle Auswahl im Auswahlspeicher immer leer ist, unabhängig davon, wie viele Entitäten im Entitätsreferenzfeld ausgewählt wurden, und selbst nachdem ich die modale Auswahl abgeschlossen und den Entitätsbrowser erneut geöffnet habe.
Was muss ich tun, damit die aktuelle Auswahl im Auswahlspeicher des Entitätsbrowsers angezeigt wird?
#default_value) nach dem Speichern und der erneuten Bearbeitung auch als Filter betrachtet werden.
