diff --git a/config/install/diff.plugins.yml b/config/install/diff.plugins.yml index 16e53b3..e69de29 100644 --- a/config/install/diff.plugins.yml +++ b/config/install/diff.plugins.yml @@ -1,7 +0,0 @@ -fields: - node: - body: - type: core_field_diff_builder - settings: - show_header: 1 - markdown: drupal_html_to_text diff --git a/diff.services.yml b/diff.services.yml index 55bd570..c3cff31 100755 --- a/diff.services.yml +++ b/diff.services.yml @@ -21,3 +21,6 @@ services: parent: system.breadcrumb.default tags: - { name: breadcrumb_builder, priority: 1000 } + + diff.diff_fields: + class: Drupal\diff\DiffFields diff --git a/src/DiffEntityParser.php b/src/DiffEntityParser.php index cdfa36c..3dece0f 100644 --- a/src/DiffEntityParser.php +++ b/src/DiffEntityParser.php @@ -77,14 +77,45 @@ class DiffEntityParser { $entity = $entity->getTranslation($langcode); } $entity_type_id = $entity->getEntityTypeId(); + + $diff_plugin_definitions = $this->diffBuilderManager->getDefinitions(); + $plugins = []; + foreach ($diff_plugin_definitions as $plugin_definition) { + if (isset($plugin_definition['field_types'])) { + // Iterate through all the field types this plugin supports + // and for every such field type add the id of the plugin. + foreach ($plugin_definition['field_types'] as $id) { + $plugins[$id][] = $plugin_definition['id']; + } + } + } + // Loop through entity fields and transform every FieldItemList object // into an array of strings according to field type specific settings. foreach ($entity as $field_items) { - $field_type = $field_items->getFieldDefinition()->getName(); - $plugin_config = $this->pluginsConfig->get('fields.' . $entity_type_id . '.' . $field_type); + $field_name = $field_items->getFieldDefinition()->getName(); + + $show_diff = \Drupal::service('diff.diff_fields')->showDiff($field_items->getFieldDefinition()->getFieldStorageDefinition()); + if (!$show_diff) { + continue; + } + + $plugin_config = $this->pluginsConfig->get('fields.' . $entity_type_id . '.' . $field_name); // @todo if there is no plugin settings override, pick the first. + $plugin_options = []; + if (isset($plugins[$field_items->getFieldDefinition()->getType()])) { + foreach ($plugins[$field_items->getFieldDefinition()->getType()] as $id) { + $plugin_options[$id] = $diff_plugin_definitions[$id]['label']; + } + } $plugin = NULL; + + if (!$plugin_config) { + $default_plugin['type'] = array_keys($plugin_options)[0]; + $plugin = $this->diffBuilderManager->createInstance($default_plugin['type'], []); + } + if ($plugin_config && $plugin_config['type'] != 'hidden') { $plugin = $this->diffBuilderManager->createInstance($plugin_config['type'], $plugin_config['settings']); } diff --git a/src/DiffFields.php b/src/DiffFields.php new file mode 100644 index 0000000..292a7d6 --- /dev/null +++ b/src/DiffFields.php @@ -0,0 +1,28 @@ +isRevisionable()) { + $show_diff = TRUE; + $entity_type = \Drupal::entityTypeManager()->getDefinition($field_storage_definition->getTargetEntityTypeId()); + if (in_array($field_storage_definition->getName(), [$entity_type->getKey('bundle'), $entity_type->getKey('revision')])) { + $show_diff = FALSE; + } + } + return $show_diff; + } +} diff --git a/src/EntityComparisonBase.php b/src/EntityComparisonBase.php index dd7f364..dee03af 100644 --- a/src/EntityComparisonBase.php +++ b/src/EntityComparisonBase.php @@ -121,10 +121,10 @@ class EntityComparisonBase extends ControllerBase { $left_key = $left_entity->getEntityTypeId() . '.' .$field_definition->getName(); // Get the compare settings for this field type. $compare_settings = $this->pluginsConfig->get('fields.' . $left_key); - $result[$left_key] = array( - '#name' => ($compare_settings['settings']['show_header'] == 1) ? $field_definition->getLabel() : '', + $result[$left_key] = [ + '#name' => ($compare_settings['settings']['show_header'] != 1) ? '' : $field_definition->getLabel(), '#settings' => $compare_settings, - ); + ]; // Fields which exist on the right entity also. if (isset($right_values[$field_name])) { @@ -135,7 +135,7 @@ class EntityComparisonBase extends ControllerBase { } // This field exists only on the left entity. else { - $result[$left_key] += $this->combineFields($left_values[$field_name], array()); + $result[$left_key] += $this->combineFields($left_values[$field_name], []); } } @@ -144,10 +144,10 @@ class EntityComparisonBase extends ControllerBase { $field_definition = $right_entity->getFieldDefinition($field_name); $right_key = $right_entity->getEntityTypeId() . '.' .$field_definition->getName(); $compare_settings = $this->pluginsConfig->get('fields.' . $right_key); - $result[$right_key] = array( + $result[$right_key] = [ '#name' => ($compare_settings['settings']['show_header'] == 1) ? $field_definition->getLabel() : '', '#settings' => $compare_settings, - ); + ]; $result[$right_key] += $this->combineFields(array(), $right_values[$field_name]); } diff --git a/src/FieldDiffBuilderBase.php b/src/FieldDiffBuilderBase.php index 5259779..db44344 100644 --- a/src/FieldDiffBuilderBase.php +++ b/src/FieldDiffBuilderBase.php @@ -147,7 +147,7 @@ abstract class FieldDiffBuilderBase extends PluginBase implements FieldDiffBuild $field = $configuration['#fields']; unset($configuration['#fields']); - $field_settings = array(); + $field_settings = []; foreach ($configuration as $key => $value) { $field_settings[$key] = $value; } diff --git a/src/Form/FieldsSettingsForm.php b/src/Form/FieldsSettingsForm.php index b75318a..fbea020 100644 --- a/src/Form/FieldsSettingsForm.php +++ b/src/Form/FieldsSettingsForm.php @@ -130,7 +130,9 @@ class FieldsSettingsForm extends ConfigFormBase { } $field_definitions = $this->entityManager->getFieldStorageDefinitions($entity_type_name); foreach ($field_definitions as $field_name => $field_definition) { - if (!$field_definition->isRevisionable()) { + + $show_diff = \Drupal::service('diff.diff_fields')->showDiff($field_definition); + if (!$show_diff) { continue; } @@ -262,7 +264,7 @@ class FieldsSettingsForm extends ConfigFormBase { $field_row['plugin']['settings_edit_form'] = array( '#type' => 'container', '#attributes' => array('class' => array('field-plugin-settings-edit-form')), - '#parents' => array('fields', $field_key, 'settings_edit_form'), + '#parents' => ['fields', $field_key, 'settings_edit_form'], 'label' => array( '#markup' => $this->t('Plugin settings:' . ' ' . $plugin_options[$display_options['type']] . ''), ), @@ -283,7 +285,7 @@ class FieldsSettingsForm extends ConfigFormBase { '#op' => 'cancel', // Do not check errors for the 'Cancel' button, but make sure we // get the value of the 'plugin type' select. - '#limit_validation_errors' => array(array('fields', $field_key, 'plugin', 'type')), + '#limit_validation_errors' => [['fields', $field_key, 'plugin', 'type']], ), ), ); @@ -353,13 +355,13 @@ class FieldsSettingsForm extends ConfigFormBase { // Pick the elements that need to receive the ajax-new-content effect. switch ($op) { case 'edit': - $updated_rows = array($trigger['#field_key']); + $updated_rows = [$trigger['#field_key']]; $updated_columns = array('plugin'); break; case 'update': case 'cancel': - $updated_rows = array($trigger['#field_key']); + $updated_rows = [$trigger['#field_key']]; $updated_columns = array('plugin', 'settings_edit'); break; } diff --git a/src/Tests/AdminFormsTest.php b/src/Tests/AdminFormsTest.php index b570f13..ae6d296 100644 --- a/src/Tests/AdminFormsTest.php +++ b/src/Tests/AdminFormsTest.php @@ -58,7 +58,8 @@ class AdminFormsTest extends WebTestBase { // @todo Remove following lines when defaults defined. // Define a plugin for the title field. $this->drupalGet('admin/config/content/diff/fields'); - $this->drupalPostAjaxForm(NULL, ['fields[node.body][plugin][type]' => 'text_field_diff_builder'], 'fields[node.body][plugin][type]'); + $this->drupalPostForm(NULL, [], t('Save')); + $this->assertText('Your settings have been saved.'); $this->drupalPostAjaxForm(NULL, [], 'node.body_settings_edit'); $this->assertText('Plugin settings: Text Field Diff'); $edit = [ @@ -66,9 +67,8 @@ class AdminFormsTest extends WebTestBase { 'fields[node.body][settings_edit_form][settings][compare_format]' => TRUE, 'fields[node.body][settings_edit_form][settings][markdown]' => 'filter_xss_all', ]; - $this->drupalPostForm(NULL, $edit, t('Update')); - // @todo Uncomment when we define default values. - //$this->assertText('You have unsaved changes.'); + $this->drupalPostAjaxForm(NULL, $edit, 'node.body_plugin_settings_update'); + $this->assertText('You have unsaved changes.'); $this->drupalPostForm(NULL, [], t('Save')); $this->assertText('Your settings have been saved.'); } diff --git a/src/Tests/DiffLocaleTest.php b/src/Tests/DiffLocaleTest.php index 8374306..15ff1dc 100644 --- a/src/Tests/DiffLocaleTest.php +++ b/src/Tests/DiffLocaleTest.php @@ -24,7 +24,7 @@ class DiffLocaleTest extends WebTestBase { * * @var array */ - public static $modules = array('node', 'diff', 'locale', 'content_translation', 'field_ui'); + public static $modules = array('node', 'diff', 'locale', 'content_translation'); /** * {@inheritdoc} @@ -42,12 +42,6 @@ class DiffLocaleTest extends WebTestBase { * Test Diff functionality for the revisions of a translated node. */ function testTranslationRevisions() { - // @todo Remove following lines when defaults defined. - // Define a plugin for the title field. - $this->drupalGet('admin/config/content/diff/fields'); - $this->drupalPostAjaxForm(NULL, ['fields[node.title][plugin][type]' => 'core_field_diff_builder'], 'fields[node.title][plugin][type]'); - $this->drupalPostForm(NULL, [], t('Save')); - // Add French language. $edit = array( 'predefined_langcode' => 'fr',