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.Antworten:
Der Entitätsbrowser übergibt derzeit kein aktuelles Standardwertelementfeld in persistenten Daten, aber es ist einfach, es hinzuzufügen.
1) Fügen Sie persistente Daten mit field_widget_form_alter () hinzu
2) Aktualisieren Sie Ihre Auswahl so, dass, wenn leer, alle angezeigt werden:
3) Stellen Sie sicher, dass bei Ihrer Auswahl die Option "Ausschließen" und "Mehrere zulassen" aktiviert ist.
Übrigens, wenn Sie auf die neueste Entwicklungsversion von entity_browser aktualisieren, benötigen Sie Ihr benutzerdefiniertes Plugin nicht. Es gibt ein neues Plugin für Standardwertansichten von entity_browser_widget_context , das konfiguriert werden kann.
Ich habe der Entity_Browser-Warteschlange auch ein Problem hinzugefügt , um diese Informationen im Widget-Kontext hinzuzufügen.
quelle
Ich habe Ihre Standardargumentklasse verwendet und ein wenig debuggt. Das ist mein Ansatz:
Das Entitätsbrowser-Widget speichert ausgewählte Werte in seiner
current
Eigenschaft, die gefüllt wird, wenn das Entitätsformular mit einer vorhandenen Entität / Auswahl geöffnet wird. Das Widget verwendet AJAX auch, wenn das Modal geschlossen wird und diecurrent
Eigenschaft entsprechend aktualisiert wird.So können Sie die ausgewählten Entitäts-IDs mithilfe der folgenden Angaben in Ihrem Entitätsformular / Ihrer Formularänderung abrufen:
Eine weitere im Formular verfügbare Widget-Eigenschaft ist der Widget-Kontext des verwendeten Entitätsbrowsers. Sie können einfach die aktuelle Auswahl zum Widget-Kontext hinzufügen und diese Informationen mit dem Standardargument Ihrer Ansichten verwenden (der Widget-Kontext wird bei jedem AJAX-Neuladen des Widgets / Formulars im Auswahlspeicher aktualisiert):
Dann ändern Sie Ihre
EntityBrowserSelection::getArgument()
:Mit diesen Änderungen konnte ich ausgewählte Elemente aus meiner Ansicht mit einem Kontextfilter für die Entitäts-IDs filtern und auswählen
Ich hoffe es hilft!
quelle
Ich konnte den Standardfilter nicht zum Laufen bringen, aber ich hatte einige Erfolge mit der folgenden Unheimlichkeit:
Das funktioniert. Es werden jedoch einige Annahmen getroffen ... Gut, dass Sie mit dem Entity-Browser auswählen können, welche Ansicht Sie verwenden möchten.
quelle