.../EntityReferenceEntityFormatter.php | 83 ++++++++++++++++++++--
1 file changed, 77 insertions(+), 6 deletions(-)
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
index e685317..393858c 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
@@ -2,6 +2,7 @@
namespace Drupal\Core\Field\Plugin\Field\FieldFormatter;
+use Drupal\Core\Entity\Entity\EntityViewMode;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
@@ -126,6 +127,54 @@ public static function defaultSettings() {
] + parent::defaultSettings();
}
+ protected function getSelectedViewModeName(FormStateInterface $form_state) {
+ return $this->getSetting('view_mode', $form_state);
+ }
+
+ /**
+ * Wrapper around ::getSetting() to reflect current values from Form State.
+ *
+ * @param string $key
+ * The setting name.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ * (optional) The form state object. If absent, this method is equivalent to
+ * parent::getSetting().
+ *
+ * @return mixed|null
+ * The value of the setting, or NULL if absent.
+ */
+ public function getSetting($key, FormStateInterface $form_state = NULL) {
+ if ($form_state) {
+ $field_name = $this->fieldDefinition->getName();
+ $form_state_key = [
+ 'fields',
+ $field_name,
+ 'settings_edit_form',
+ 'settings',
+ $key,
+ ];
+ if ($form_state->hasValue($form_state_key)) {
+ return $form_state->getValue($form_state_key);
+ }
+ }
+
+ return parent::getSetting($key);
+ }
+
+ /**
+ * Ajax callback for view mode selection change.
+ */
+ public static function onViewModeChange(array &$form, FormStateInterface $form_state) {
+ return $form['fields'][$form_state->get('plugin_settings_edit')]['plugin']['settings_edit_form']['settings'];
+ }
+
+ /**
+ * Rebuilds the form on select submit.
+ */
+ public static function rebuildOnSubmit(array &$form, FormStateInterface $form_state) {
+ $form_state->setRebuild(TRUE);
+ }
+
/**
* {@inheritdoc}
*/
@@ -133,6 +182,14 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
$entity_type_id = $this->getFieldSetting('target_type');
$bundle_entity_type_id = $this->entityTypeManager->getDefinition($entity_type_id)->getBundleEntityType();
$bundles = array_keys($this->getFieldSetting('handler_settings')['target_bundles']);
+
+ $currently_selected_view_mode_name = $this->getSelectedViewModeName($form_state);
+ $currently_selected_view_mode = EntityViewMode::load("$entity_type_id.$currently_selected_view_mode_name");
+ // @todo Simplify this in https://www.drupal.org/node/2844203.
+ $currently_selected_view_mode_label = $currently_selected_view_mode ? $currently_selected_view_mode->label() : $this->t('Default');
+
+ $elements['#prefix'] = '
';
+ $elements['#suffix'] = '
';
$description = [
'#theme' => 'item_list',
'#context' => ['list_style' => 'comma-list'],
@@ -141,8 +198,10 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
if (count($bundles) === 1) {
$description['#items'][] = [
'#type' => 'link',
- '#title' => $this->t('Configure view modes'),
- '#url' => Url::fromRoute(sprintf('entity.entity_view_display.%s.default', $entity_type_id), [$bundle_entity_type_id => $bundles[0]]),
+ '#title' => $this->t('Configure %view-mode-label view mode', ['%view-mode-label' => $currently_selected_view_mode_label]),
+ '#url' => $currently_selected_view_mode_name === 'default'
+ ? Url::fromRoute(sprintf('entity.entity_view_display.%s.default', $entity_type_id), [$bundle_entity_type_id => $bundles[0]])
+ : Url::fromRoute(sprintf('entity.entity_view_display.%s.view_mode', $entity_type_id), [$bundle_entity_type_id => $bundles[0], 'view_mode_name' => $currently_selected_view_mode_name]),
'#attributes' => [
'class' => ['use-ajax'],
'data-dialog-type' => 'modal',
@@ -157,8 +216,13 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
for ($i = 0; $i < count($bundles); $i++) {
$description['#items'][] = [
'#type' => 'link',
- '#title' => $this->t('Configure %bundle-label view modes', ['%bundle-label' => $bundle_info[$bundles[$i]]['label']]),
- '#url' => Url::fromRoute(sprintf('entity.entity_view_display.%s.default', $entity_type_id), [$bundle_entity_type_id => $bundles[$i]]),
+ '#prefix' => $i == 0
+ ? $this->t('Configure %view-mode-label view mode for', ['%view-mode-label' => $currently_selected_view_mode_label]) . ' '
+ : '',
+ '#title' => $this->t('%bundle-label %entity-type-label', ['%bundle-label' => $bundle_info[$bundles[$i]]['label'], '%entity-type-label' => 'Media items']),
+ '#url' => $currently_selected_view_mode_name === 'default'
+ ? Url::fromRoute(sprintf('entity.entity_view_display.%s.default', $entity_type_id), [$bundle_entity_type_id => $bundles[$i]])
+ : Url::fromRoute(sprintf('entity.entity_view_display.%s.view_mode', $entity_type_id), [$bundle_entity_type_id => $bundles[$i], 'view_mode_name' => $currently_selected_view_mode_name]),
'#attributes' => [
'class' => ['use-ajax'],
'data-dialog-type' => 'modal',
@@ -171,7 +235,7 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
}
$description['#items'][] = [
'#type' => 'link',
- '#title' => $this->t('Add new view mode'),
+ '#title' => $this->t('add new view mode'),
'#prefix' => Markup::create(t('or') . ' '),
'#url' => Url::fromRoute('entity.entity_view_mode.add_form', ['entity_type_id' => $entity_type_id]),
'#attributes' => [
@@ -186,7 +250,14 @@ public function settingsForm(array $form, FormStateInterface $form_state) {
'#type' => 'select',
'#options' => $this->entityDisplayRepository->getViewModeOptions($entity_type_id),
'#title' => t('View mode'),
- '#default_value' => $this->getSetting('view_mode'),
+ '#default_value' => $currently_selected_view_mode_name,
+ '#ajax' => [
+ 'callback' => [static::class, 'onViewModeChange'],
+ 'wrapper' => 'entity-reference-entity-formatter-settings-ajax',
+ 'method' => 'replace',
+ ],
+ '#submit' => [[static::class, 'rebuildOnSubmit']],
+ '#executes_submit_callback' => TRUE,
'#required' => TRUE,
'#description' => $description + [
'#access' => \Drupal::currentUser()->hasPermission('administer ' . $entity_type_id . ' display')