diff --git a/src/Plugin/Field/FieldWidget/ViewModeSelectorWidgetBase.php b/src/Plugin/Field/FieldWidget/ViewModeSelectorWidgetBase.php index dc78c0a..11ee9a6 100644 --- a/src/Plugin/Field/FieldWidget/ViewModeSelectorWidgetBase.php +++ b/src/Plugin/Field/FieldWidget/ViewModeSelectorWidgetBase.php @@ -1,12 +1,10 @@ -getSettings(); - $entity_type = $field_definition->getTargetEntityTypeId(); - $bundle = $field_definition->getTargetBundle(); - - // Get all view modes for the current bundle. - $view_modes = \Drupal::entityManager()->getViewModeOptionsByBundle($entity_type, $bundle); - - // Reduce options by enabled view modes - foreach (array_keys($view_modes) as $view_mode) { - if(isset($field_settings['view_modes'][$view_mode]['enable']) && $field_settings['view_modes'][$view_mode]['enable']) { - continue; - } - unset($view_modes[$view_mode]); + public function form(FieldItemListInterface $items, array &$form, FormStateInterface $form_state, $get_delta = NULL) { + $field_definition = $items[0]->getFieldDefinition(); + if (empty($this->viewModes)) { + $this->viewModes = view_mode_selector_get_enabled_view_modes($field_definition, $field_definition->getTargetBundle()); } - // Show all view modes in widget when no view modes are enabled. - if (!count($view_modes)) { - $view_modes = \Drupal::entityManager()->getViewModeOptionsByBundle($entity_type, $bundle); - } - - $this->viewModes = $view_modes; + return parent::form($items, $form, $form_state, $get_delta); } + } diff --git a/src/Plugin/views/filter/ListViewModeSelector.php b/src/Plugin/views/filter/ListViewModeSelector.php new file mode 100644 index 0000000..b5e58a2 --- /dev/null +++ b/src/Plugin/views/filter/ListViewModeSelector.php @@ -0,0 +1,29 @@ +valueOptions = view_mode_selector_get_enabled_view_modes($this->getFieldDefinition()); + } + +} diff --git a/view_mode_selector.module b/view_mode_selector.module index e9bbb03..1b37b1a 100644 --- a/view_mode_selector.module +++ b/view_mode_selector.module @@ -1,18 +1,18 @@ getFormObject(); - /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $view_display */ + /** @var $view_display \Drupal\Core\Entity\Entity\EntityViewDisplay **/ $view_display = $form_object->getEntity(); if ($view_display->getMode() == 'view_mode_selector') { drupal_set_message(t('This is a placeholder view mode from the View Mode Selector module. It will be replaced with a selected view mode.', [ - '@view-mode-selector' => Url::fromUri('https://www.drupal.org/project/view_mode_selector')->toUriString(), + '@view-mode-selector' => Url::fromUri('https://www.drupal.org/project/view_mode_selector'), ]), 'status'); drupal_set_message(t('The field settings have been disabled by the View Mode Selector module.', [ - '@view-mode-selector' => Url::fromUri('https://www.drupal.org/project/view_mode_selector')->toUriString(), + '@view-mode-selector' => Url::fromUri('https://www.drupal.org/project/view_mode_selector'), ]), 'warning'); $form['fields']['#disabled'] = TRUE; } } + +/** + * Implements hook_field_views_data(). + */ +function view_mode_selector_field_views_data(FieldStorageConfigInterface $field) { + $data = views_field_default_views_data($field); + + foreach ($data as $table_name => $table_data) { + foreach ($table_data as $field_name => $field_data) { + if (isset($field_data['filter']) && $field_name != 'delta' && $field->getType() == 'view_mode_selector') { + $data[$table_name][$field_name]['filter']['id'] = 'list_view_mode_selector'; + } + } + } + + return $data; +} + +/** + * Get the enabled view modes for a particular view mode selector field. + */ +function view_mode_selector_get_enabled_view_modes(FieldDefinitionInterface $field_definition, $bundle = NULL) { + $field_settings = $field_definition->getSettings(); + $entity_type = $field_definition->getTargetEntityTypeId(); + + if ($bundle) { + $original_view_modes = \Drupal::entityManager()->getViewModeOptionsByBundle($entity_type, $bundle); + } + else { + $original_view_modes = \Drupal::entityManager()->getViewModeOptions($entity_type); + } + + $view_modes = []; + + // Reduce options by enabled view modes. + foreach (array_keys($original_view_modes) as $view_mode) { + if (isset($field_settings['view_modes'][$view_mode]['enable']) && $field_settings['view_modes'][$view_mode]['enable']) { + $view_modes[$view_mode] = $original_view_modes[$view_mode]; + } + } + + // Show all view modes in widget when no view modes are enabled. + if (!count($view_modes)) { + $view_modes = $original_view_modes; + } + + return $view_modes; +}