Я использую Entity Browser (2.x-dev в Drupal 8) в качестве виджета формы для поля ссылки на сущность пользовательского объекта. Браузер сущностей настроен
- в качестве модального дисплея,
- с одним виджетом,
- и нет выбора дисплея,
- используя вид с массовой выборкой браузера в качестве виджета, и
- добавить выбранные объекты к текущему выбору ссылочного поля.
Выбор сущностей работает нормально. Но поле ссылки на сущность не должно иметь дубликатов.
Чтобы упростить выбор сущностей без дубликатов, я бы хотел отфильтровать уже выбранные сущности из результатов просмотра браузера сущностей. Таким образом, пользователи будут видеть только невыбранные объекты.
Для этой цели я создал пользовательский плагин arguments_default представлений, который предоставляет хранилище выбора обозревателя сущностей в качестве аргумента контекста по умолчанию для идентификатора сущности:
<?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;
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что текущий выбор в хранилище выбора всегда пуст, независимо от того, сколько объектов было выбрано в поле ссылки на объект, и даже после того, как я завершу модальное выделение и снова открою браузер объекта.
Что мне нужно сделать, чтобы текущий выбор отображался в хранилище выбора браузера сущностей?
#default_value
) тоже должен рассматриваться как фильтр.Ответы:
Entity Browser не передает текущее поле значений по умолчанию в постоянных данных, но его легко добавить.
1) Добавить постоянные данные, используя field_widget_form_alter ()
2) Обновите свой выбор так, чтобы, если пусто, он показывал все:
3) Убедитесь, что у вас выбрано «исключить» и «разрешить несколько».
Кстати, если вы обновитесь до последней версии объекта entity_browser, вам не понадобится ваш собственный плагин. Существует новый плагин представления значений по умолчанию entity_browser_widget_context, который можно настраивать.
Я также добавил проблему в очередь entity_browser, чтобы добавить эту информацию, когда она находится в widget_context.
источник
Я использовал ваш класс аргументов по умолчанию и немного отладил. Это мой подход:
Виджет браузера сущности сохраняет выбранные значения в своем
current
свойстве, которое заполняется, когда форма сущности открывается с существующей сущностью / выбором. Виджет также использует AJAX, когда модальное окно закрывается иcurrent
свойство обновляется соответствующим образом.Таким образом, вы можете получить идентификаторы выбранной сущности, используя что-то вроде следующего в вашей форме / форме:
Другое свойство виджета, доступное в форме, является контекстом виджета используемого браузера сущностей. Вы можете просто добавить текущий выбор в контекст виджета и использовать эту информацию с аргументом по умолчанию для своих представлений (контекст виджета обновляется в хранилище выбора при каждой перезагрузке AJAX виджета / формы):
Затем измените ваш
EntityBrowserSelection::getArgument()
:Благодаря этим изменениям я смог отфильтровать выбранные элементы из моего представления с помощью контекстного фильтра для идентификаторов объектов, выбрав
Надеюсь, поможет!
источник
Я не мог заставить работать фильтр по умолчанию, но у меня был некоторый успех, выполнив следующую страшность:
Это работает. Тем не менее, есть довольно много предположений ... Хорошо, что браузер сущностей позволяет вам выбирать, какое представление.
источник