.../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')