diff --git a/config/install/replication.replication_settings.entity_type.article.yml b/config/install/replication.replication_settings.entity_type.article.yml index 0089281..b6a07f0 100644 --- a/config/install/replication.replication_settings.entity_type.article.yml +++ b/config/install/replication.replication_settings.entity_type.article.yml @@ -5,4 +5,5 @@ id: article label: Replicate only article entities filter_id: entity_type parameters: - entity_type: article + entity_type_id: node + bundle: article diff --git a/config/install/replication.replication_settings.entity_type.page.yml b/config/install/replication.replication_settings.entity_type.page.yml index 13a88e1..a0977a1 100644 --- a/config/install/replication.replication_settings.entity_type.page.yml +++ b/config/install/replication.replication_settings.entity_type.page.yml @@ -5,4 +5,5 @@ id: page label: Replicate only page entities filter_id: entity_type parameters: - entity_type: page + entity_type_id: node + bundle: page diff --git a/config/schema/replication.replication_settings.schema.yml b/config/schema/replication.replication_settings.schema.yml index 4a0c664..86c6fcc 100644 --- a/config/schema/replication.replication_settings.schema.yml +++ b/config/schema/replication.replication_settings.schema.yml @@ -12,5 +12,5 @@ replication.replication_settings.*: type: string label: 'Filter plugin id' parameters: - type: array + type: sequence label: 'Filter parameters' diff --git a/src/Entity/ReplicationSettings.php b/src/Entity/ReplicationSettings.php index d64f021..5a03649 100644 --- a/src/Entity/ReplicationSettings.php +++ b/src/Entity/ReplicationSettings.php @@ -17,22 +17,21 @@ use Drupal\replication\Entity\ReplicationSettingsInterface; * config_prefix = "replication_settings", * entity_keys = { * "id" = "id", - * "label" = "label", - * "filter_id" = "filter_id" + * "label" = "label" * } * ) */ class ReplicationSettings extends ConfigEntityBase implements ReplicationSettingsInterface { /** - * An identifier for this replication settings. + * An identifier for these replication settings. * * @var string */ protected $id; /** - * The human readable name for this replication settings. + * The human readable name for these replication settings. * * @var string */ diff --git a/src/Plugin/ReplicationFilter/EntityTypeFilter.php b/src/Plugin/ReplicationFilter/EntityTypeFilter.php index 5ab7393..ce588aa 100644 --- a/src/Plugin/ReplicationFilter/EntityTypeFilter.php +++ b/src/Plugin/ReplicationFilter/EntityTypeFilter.php @@ -10,7 +10,8 @@ use Symfony\Component\HttpFoundation\ParameterBag; * Provides a filter based on entity type. * * Supported parameters: - * entity_type: a comma delimited list of entity type id's to include + * entity_type_id: a comma delimited list of entity type id's to include + * bundle: a comma delimited list of bundles matching the type ids * * @ReplicationFilter( * id = "entity_type", @@ -24,15 +25,30 @@ class EntityTypeFilter extends ReplicationFilterBase { * {@inheritdoc} */ public function filter(EntityInterface $entity, ParameterBag $parameters) { - if ($parameters->has('entity_type')) { - $types = $parameters->get('entity_type'); + $type_ids = $this->parseParameterValues($parameters, 'entity_type_id'); + $bundles = $this->parseParameterValues($parameters, 'bundle'); + return in_array($entity->getEntityTypeId(), $type_ids) && in_array($entity->bundle(), $bundles); + } + + /** + * Parse a parameter's comma delimiated values. + * + * @param string $parameter_name + * The name of the parameter to get the values for. + * + * @return array + * The parsed parameter values. + */ + protected function parseParameterValues(ParameterBag $parameters, $parameter_name) { + if ($parameters->has($parameter_name)) { + $values = $parameters->get($parameter_name); } else { - $types = ''; + $values = ''; } - $types = explode(',', $types); - $types = array_filter(array_map('trim', $types)); - return in_array($entity->bundle(), $types); + $values = explode(',', $values); + $values = array_filter(array_map('trim', $values)); + return $values; } } diff --git a/tests/src/Functional/ReplicationFilterTest.php b/tests/src/Functional/ReplicationFilterTest.php index de0b364..ef3f2db 100644 --- a/tests/src/Functional/ReplicationFilterTest.php +++ b/tests/src/Functional/ReplicationFilterTest.php @@ -14,8 +14,14 @@ use Symfony\Component\HttpFoundation\ParameterBag; */ class ReplicationFilterTest extends WebTestBase { + /** + * {@inheritdoc} + */ protected $strictConfigSchema = FALSE; + /** + * {@inheritdoc} + */ public static $modules = [ 'multiversion', 'node', @@ -137,7 +143,7 @@ class ReplicationFilterTest extends WebTestBase { $entity2->workspace = $workspace; $entity2->save(); - $parameters = new ParameterBag(['entity_type' => 'article']); + $parameters = new ParameterBag(['entity_type_id' => 'node', 'bundle' => 'article']); $changes = $changes_factory->get($workspace)->filter('entity_type')->parameters($parameters)->getNormal(); $this->assertEqual(1, count($changes), 'Expect there is 1 entity in the changeset.'); } diff --git a/tests/src/Kernel/ReplicationSettingsTest.php b/tests/src/Kernel/ReplicationSettingsTest.php index c2815b6..2adbb3d 100644 --- a/tests/src/Kernel/ReplicationSettingsTest.php +++ b/tests/src/Kernel/ReplicationSettingsTest.php @@ -12,8 +12,14 @@ use Drupal\replication\Entity\ReplicationSettings; */ class ReplicationSettingsTest extends KernelTestBase { + /** + * {@inheritdoc} + */ protected $strictConfigSchema = FALSE; + /** + * {@inheritdoc} + */ public static $modules = [ 'user', 'serialization', @@ -32,7 +38,7 @@ class ReplicationSettingsTest extends KernelTestBase { 'id' => 'test', 'label' => 'Replication settings test', 'filter_id' => 'entity_type', - 'parameters' => ['entity_type' => 'article'], + 'parameters' => ['entity_type_id' => 'node', 'bundle' => 'article'], ]); $this->assertTrue($entity instanceof ReplicationSettings, 'Replication Settings entity was created.'); $entity->save();