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;
+}