diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..38b6dcc --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.gz -text diff diff --git a/config/schema/viewsreference.schema.yml b/config/schema/viewsreference.schema.yml new file mode 100644 index 0000000..3458d52 --- /dev/null +++ b/config/schema/viewsreference.schema.yml @@ -0,0 +1,82 @@ +field.widget.settings.viewsreference_autocomplete: + type: field.widget.settings.entity_reference_autocomplete + label: 'Views reference autocomplete field widget settings' + +field.formatter.settings.viewsreference_formatter: + type: mapping + label: 'Formatter settings' + mapping: + plugin_types: + type: viewsreference.plugin_types + +field.storage_settings.viewsreference: + type: mapping + label: 'Viewsreference field storage settings' + mapping: + target_type: + type: string + label: 'Type of item to reference' + +# @see field.field_settings.entity_reference +field.field_settings.viewsreference: + type: mapping + label: 'Viewsreference field settings' + mapping: + handler: + type: string + label: 'Reference method' + handler_settings: + type: entity_reference_selection.[%parent.handler] + label: 'Entity reference selection plugin settings' + plugin_types: + type: viewsreference.plugin_types + preselect_views: + type: sequence + label: 'Preselect View Options' + sequence: + type: string + enabled_settings: + type: sequence + label: 'Enabled settings' + sequence: + type: viewsreference.enabled_settings.[%key] + +field.value.viewsreference: + type: mapping + label: 'Default value' + mapping: + target_uuid: + type: uuid + display_id: + type: string + label: 'Display Id' + data: + type: string + label: 'Serialized data' + +viewsreference.enabled_settings.argument: + type: string + label: 'Argument settings' + +viewsreference.enabled_settings.limit: + type: integer + label: 'Limit results settings' + +viewsreference.enabled_settings.offset: + type: integer + label: 'Offset results settings' + +viewsreference.enabled_settings.pager: + type: string + label: 'Pagination settings' + +viewsreference.enabled_settings.title: + type: boolean + label: 'Include View Title settings' + +viewsreference.plugin_types: + type: sequence + label: 'View display plugins to allow' + sequence: + label: 'Allowed view display plugin' + type: string diff --git a/src/Plugin/Field/FieldType/ViewsReferenceItem.php b/src/Plugin/Field/FieldType/ViewsReferenceItem.php index 1310574..4d2e880 100644 --- a/src/Plugin/Field/FieldType/ViewsReferenceItem.php +++ b/src/Plugin/Field/FieldType/ViewsReferenceItem.php @@ -140,6 +140,18 @@ class ViewsReferenceItem extends EntityReferenceItem { return $form; } + /** + * {@inheritdoc} + */ + public static function fieldSettingsFormValidate(array $form, FormStateInterface $form_state) { + // Remove unchecked values. so that we have only the checked values in the config. + $keys = ['plugin_types', 'preselect_views', 'enabled_settings']; + foreach ($keys as $key) { + $form_state->setValue(['settings', $key], array_filter($form_state->getValue(['settings', $key], []))); + } + parent::fieldSettingsFormValidate($form, $form_state); + } + /** * {@inheritdoc} */ diff --git a/src/Plugin/ViewsReferenceSetting/ViewsReferencePager.php b/src/Plugin/ViewsReferenceSetting/ViewsReferencePager.php index 48f45e3..feb7ccb 100644 --- a/src/Plugin/ViewsReferenceSetting/ViewsReferencePager.php +++ b/src/Plugin/ViewsReferenceSetting/ViewsReferencePager.php @@ -13,7 +13,7 @@ use Drupal\viewsreference\Plugin\ViewsReferenceSettingInterface; * @ViewsReferenceSetting( * id = "pager", * label = @Translation("Pagination"), - * default_value = 0, + * default_value = "", * ) */ class ViewsReferencePager extends PluginBase implements ViewsReferenceSettingInterface { diff --git a/src/Plugin/ViewsReferenceSetting/ViewsReferenceTitle.php b/src/Plugin/ViewsReferenceSetting/ViewsReferenceTitle.php index d839931..ecafc07 100644 --- a/src/Plugin/ViewsReferenceSetting/ViewsReferenceTitle.php +++ b/src/Plugin/ViewsReferenceSetting/ViewsReferenceTitle.php @@ -13,7 +13,7 @@ use Drupal\viewsreference\Plugin\ViewsReferenceSettingInterface; * @ViewsReferenceSetting( * id = "title", * label = @Translation("Include View Title"), - * default_value = 0, + * default_value = false, * ) */ class ViewsReferenceTitle extends PluginBase implements ViewsReferenceSettingInterface { diff --git a/tests/src/Functional/Update/ViewsReferenceUpdateTest.php b/tests/src/Functional/Update/ViewsReferenceUpdateTest.php index 899bf3a..b0164b5 100644 --- a/tests/src/Functional/Update/ViewsReferenceUpdateTest.php +++ b/tests/src/Functional/Update/ViewsReferenceUpdateTest.php @@ -59,8 +59,8 @@ class ViewsReferenceUpdateTest extends UpdatePathTestBase { $result = $query->execute(); $data = unserialize($result->fetchField(), ['allowed_class' => FALSE]); self::assertTrue(array_key_exists('view_mode', $data) && $data['view_mode'] === 'preview_wide'); - self::assertTrue(array_key_exists('title', $data) && $data['view_mode'] === '1'); - self::assertTrue(array_key_exists('argument', $data) && $data['view_mode'] === 'test'); + self::assertTrue(array_key_exists('title', $data) && $data['title'] === '1'); + self::assertTrue(array_key_exists('argument', $data) && $data['argument'] === 'test'); } } diff --git a/viewsreference.install b/viewsreference.install index 08542b7..1465b33 100644 --- a/viewsreference.install +++ b/viewsreference.install @@ -35,10 +35,13 @@ function viewsreference_update_8102() { function viewsreference_update_8103() { $field_type = 'viewsreference'; $entity_type_manager = \Drupal::entityTypeManager(); + /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager */ $entity_field_manager = \Drupal::service('entity_field.manager'); $entity_field_map = $entity_field_manager->getFieldMapByFieldType($field_type); $database = \Drupal::database(); $entity_def_manager = \Drupal::entityDefinitionUpdateManager(); + /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_manager */ + $entity_display_manager = \Drupal::service('entity_display.repository'); foreach ($entity_field_map as $entity_type_id => $field_map) { $entity_storage = $entity_type_manager->getStorage($entity_type_id); @@ -129,20 +132,43 @@ function viewsreference_update_8103() { } // Update field definition settings to enable the title/argument plugins. - foreach ((array) $field_map['bundles'] as $bundle) { + foreach ((array) $field_map[$field_name]['bundles'] as $bundle) { $bundle_fields = $entity_field_manager->getFieldDefinitions($entity_type_id, $bundle); /** @var \Drupal\core\Field\FieldConfigInterface $field_definition */ $field_definition = $bundle_fields[$field_name]; $settings = $field_definition->getSettings(); + $keys = ['plugin_types', 'preselect_views']; + foreach ($keys as $key) { + if (array_key_exists($key, $settings)) { + // Remove not enabled options for a valid schema. Unchecked option was a integer 0. + // Allows are only strings. + $settings[$key] = is_array($settings[$key]) ? array_filter($settings[$key]) : []; + } + } + $settings['enabled_settings'] = [ 'argument' => 'argument', - 'offset' => 0, - 'limit' => 0, - 'pager' => 0, 'title' => 'title', ]; $field_definition->setSettings($settings); $field_definition->save(); + + // Remove not enabled options for a valid schema. Unchecked option was a integer 0. + // Allows are only strings. + $view_modes = $entity_display_manager->getViewModeOptionsByBundle($entity_type_id, $bundle); + foreach (array_keys($view_modes) as $view_mode) { + $viewDisplay = $entity_display_manager->getViewDisplay($entity_type_id, $bundle, $view_mode); + $renderer = $viewDisplay->getRenderer($field_name); + if ($renderer === NULL) { + continue; + } + + $plugin_types = $renderer->getSetting('plugin_types'); + if (is_array($plugin_types)) { + $renderer->setSetting('plugin_types', array_filter($plugin_types)); + } + $viewDisplay->save(); + } } } }