Saya menggunakan Browser Entity (2.x-dev di Drupal 8) sebagai widget bentuk untuk bidang basis referensi entitas entitas kustom. Browser entitas dikonfigurasi
- sebagai tampilan modal,
- dengan satu widget,
- dan tidak ada tampilan pilihan,
- menggunakan tampilan dengan bidang pilih massal peramban entitas sebagai widget, dan
- untuk menambahkan entitas yang dipilih ke pemilihan bidang referensi saat ini.
Memilih entitas berfungsi dengan baik. Tetapi bidang referensi entitas tidak boleh memiliki duplikat.
Untuk mempermudah pemilihan entitas tanpa duplikat, saya ingin memfilter entitas yang sudah dipilih dari hasil tampilan browser entitas. Jadi pengguna akan melihat entitas yang tidak dipilih saja.
Untuk tujuan ini, saya membuat plugin custom views argument_default yang memperlihatkan penyimpanan pemilihan browser entitas sebagai argumen default konteks untuk ID entitas:
<?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;
}
}
Masalah yang saya hadapi, adalah bahwa pemilihan saat ini dalam penyimpanan pemilihan selalu kosong, tidak peduli berapa banyak entitas yang telah dipilih di bidang referensi entitas, dan bahkan setelah saya menyelesaikan pemilihan modal dan membuka browser entitas lagi.
Apa yang harus saya lakukan untuk membuka seleksi saat ini di penyimpanan pilihan browser entitas?
#default_value
) perlu dipertimbangkan juga sebagai filter.Jawaban:
Entity Browser saat ini tidak meneruskan bidang item nilai default saat ini dalam data yang persisten, tetapi mudah untuk menambahkannya.
1) Tambahkan data persisten menggunakan field_widget_form_alter ()
2) Perbarui pilihan Anda sehingga jika kosong itu menunjukkan semua:
3) Pastikan Anda telah "mengecualikan" dan "mengizinkan beberapa" dicentang pada pilihan Anda.
Omong-omong, jika Anda memperbarui ke rilis dev terbaru dari entity_browser, Anda tidak memerlukan plugin khusus Anda. Ada plugin views nilai entitas entitas_browser_widget_context baru yang dapat dikonfigurasi.
Saya juga menambahkan masalah ke antrian entitas_browser untuk menambahkan informasi ini ketika di widget_context.
sumber
Saya menggunakan kelas argumen default Anda dan sedikit berselisih. Ini pendekatan saya:
Widget peramban entitas menyimpan nilai yang dipilih di
current
propertinya, yang diisi, ketika formulir entitas dibuka dengan entitas / pilihan yang ada. Widget juga menggunakan AJAX ketika modal ditutup dancurrent
properti diperbarui sesuai.Jadi Anda bisa mendapatkan ID entitas yang dipilih menggunakan sesuatu seperti yang berikut di formulir entitas Anda / ubah form:
Properti widget lain yang tersedia dalam formulir adalah konteks widget dari browser entitas yang digunakan. Anda cukup menambahkan pilihan saat ini ke konteks widget dan menggunakan informasi ini dengan argumen default tampilan Anda (konteks widget diperbarui dalam penyimpanan pilihan pada setiap isi ulang AJAX dari widget / form):
Kemudian ubah
EntityBrowserSelection::getArgument()
:Dengan perubahan ini saya dapat memfilter item yang dipilih dari tampilan saya dengan filter kontekstual untuk ID entitas, memilih
Semoga ini bisa membantu!
sumber
Saya tidak bisa mendapatkan filter default untuk bekerja tetapi saya berhasil melakukan menakutkan berikut:
Ini berhasil. Namun, ada beberapa asumsi yang dibuat ... Browser entitas yang bagus memungkinkan Anda untuk memilih tampilan mana.
sumber