diff --git a/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php b/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php index 0dbc365758280278ecd56e00fc20d58ca895ba4c..861254e42c6c87c91e8fdb7aeb3b99dbdd9f126a 100644 --- a/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php +++ b/modules/message_recipient_entity/src/Plugin/MessageRecipient/CollectorExtender/ExcludeOwner.php @@ -23,6 +23,7 @@ use Drupal\user\EntityOwnerInterface; id: 'exclude_owner', stage: CollectorExtenderType::QUERY_ALTER, types: ['user'], + config_enforced: TRUE, label: new TranslatableMarkup('Exclude owner'), description: new TranslatableMarkup("Exclude message's associated entity owner if collected by this recipients collector."), )] diff --git a/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php b/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php index bdd0c749769da0e2ae7d7403196a75b2536d538f..12ef32cecc2254949c71d8a0c4b726b68917c335 100644 --- a/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php +++ b/modules/message_recipient_ui/src/Form/RecipientsCollectorFormBase.php @@ -135,7 +135,14 @@ abstract class RecipientsCollectorFormBase extends FormBase { // Store extenders settings. $extenders = $this->getAllExtenders(); + /** @var \Drupal\message_recipient\CollectorExtenderInterface $extender */ foreach ($extenders as $extender_id => $extender) { + // Do not submit the extender in case it is not enforced unless it is + // enabled. And remove it in case it has been added before. + if (!$extender->isConfigEnforced() && empty($form_state->getValue(['extenders', 'status', $extender_id]))) { + $this->recipientsCollector->removeExtender($extender_id); + continue; + } $extender_form_state = SubformState::createForSubform($form['extenders']['settings'][$extender_id], $form, $form_state); $extender->submitConfigurationForm($form['extenders']['settings'][$extender_id], $extender_form_state, $this->recipientsCollector); } @@ -173,15 +180,25 @@ abstract class RecipientsCollectorFormBase extends FormBase { $form['extenders'] = [ '#type' => 'container', '#tree' => TRUE, - '#states' => [ - 'visible' => [ - ':input[name="extenders_description"]' => [ - 'checked' => TRUE, - ], - ], - ], ]; + $form['extenders']['status']['title'] = [ + '#type' => 'item', + '#title' => $this->t('Enabled optional extenders:') + ]; + + /** @var \Drupal\message_recipient\CollectorExtenderInterface $extender */ + foreach ($extenders as $extender_id => $extender) { + if ($extender->isConfigEnforced()) { + continue; + } + $form['extenders']['status'][$extender_id] = [ + '#type' => 'checkbox', + '#title' => $extender->label(), + '#default_value' => in_array($extender_id, array_keys($this->recipientsCollector->getExtenders()->getInstanceIds())), + ]; + } + // Add vertical tabs containing the settings for the extenders. $form['extenders']['extender_settings'] = [ '#title' => $this->t('Collector extender settings'), @@ -190,6 +207,7 @@ abstract class RecipientsCollectorFormBase extends FormBase { '#description_display' => 'before', ]; + // Configs for each extender. foreach ($extenders as $extender_id => $extender) { $form['extenders']['settings'][$extender_id] = [ '#type' => 'details', @@ -198,6 +216,16 @@ abstract class RecipientsCollectorFormBase extends FormBase { '#parents' => ['extenders', $extender_id, 'settings'], ]; + if (!$extender->isConfigEnforced()) { + $form['extenders']['settings'][$extender_id]['#states'] = [ + 'visible' => [ + ':input[name="extenders[status][' . $extender_id . ']"]' => [ + 'checked' => TRUE, + ], + ], + ]; + } + $extender_form_state = SubformState::createForSubform($form['extenders']['settings'][$extender_id], $form, $form_state); $form['extenders']['settings'][$extender_id] += $extender->buildConfigurationForm($form['extenders']['settings'][$extender_id], $extender_form_state, $this->recipientsCollector); } diff --git a/src/Attribute/CollectorExtender.php b/src/Attribute/CollectorExtender.php index 4ad60948dd53ac07f82c9e3a79544f87d39e353e..d1dadb740a2674247f3a3ee155798be4bf1302f4 100644 --- a/src/Attribute/CollectorExtender.php +++ b/src/Attribute/CollectorExtender.php @@ -21,6 +21,8 @@ class CollectorExtender extends Plugin { * The plugin ID. * @param \Drupal\message_recipient\CollectorExtenderType $stage * The stage the extender is acting in, e.g. 'query_alter', 'post_collect'. + * @param bool $config_enforced + * Whether the config for the plugin is enforced or not. * @param array $types * (optional) The applicable recipients collector types, e.g. 'user', * 'email'. @@ -33,6 +35,7 @@ class CollectorExtender extends Plugin { public readonly string $id, public readonly CollectorExtenderType $stage, public readonly array $types = [], + public readonly bool $config_enforced = FALSE, public readonly ?TranslatableMarkup $label = NULL, public readonly ?TranslatableMarkup $description = NULL, ) {} diff --git a/src/CollectorExtenderBase.php b/src/CollectorExtenderBase.php index 4b133b3f4cc3c6b8f7d99e4ade9ac23d0b063e5a..f43b948c3417894be08eb2cca0ed9b90bad2694f 100644 --- a/src/CollectorExtenderBase.php +++ b/src/CollectorExtenderBase.php @@ -78,6 +78,13 @@ abstract class CollectorExtenderBase extends PluginBase implements CollectorExte return $this->pluginDefinition['types']; } + /** + * {@inheritdoc} + */ + public function isConfigEnforced(): bool { + return $this->pluginDefinition['config_enforced']; + } + /** * {@inheritdoc} */ diff --git a/src/CollectorExtenderInterface.php b/src/CollectorExtenderInterface.php index e11fc7999e813c3e897ff6af3a2c85bf92e080f5..9b2d395b3dd1b04e047b2d520e949950a8da60e6 100644 --- a/src/CollectorExtenderInterface.php +++ b/src/CollectorExtenderInterface.php @@ -59,6 +59,14 @@ interface CollectorExtenderInterface extends PluginInspectionInterface, Configur */ public function getTypes(): array; + /** + * Check if whether the collector extender config is enforced. + * + * @return bool + * True if the collector extender config is enforced, false otherwise. + */ + public function isConfigEnforced(): bool; + /** * Check if whether the collector extender is applicable. * diff --git a/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php b/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php index 4a29c4ccee6ce3026a9e9ce7f2eb0e807ea0605f..951d47f59dca058c101b91605e1e175964f50839 100644 --- a/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php +++ b/src/Plugin/MessageRecipient/CollectorExtender/IncludeActor.php @@ -23,6 +23,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; id: 'include_actor', stage: CollectorExtenderType::QUERY_ALTER, types: ['user'], + config_enforced: TRUE, label: new TranslatableMarkup('Include actor'), description: new TranslatableMarkup('Includes actor if collected by this recipients collector.'), )] diff --git a/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php b/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php index 50a3beb369a5436374022740a5ec790f8917d9a8..76fe67401292a710ba43b6fefaecd67327197a69 100644 --- a/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php +++ b/src/Plugin/MessageRecipient/CollectorExtender/IncludeBlocked.php @@ -21,6 +21,7 @@ use Drupal\message_recipient\RecipientsCollectorInterface; id: 'include_blocked_users', stage: CollectorExtenderType::QUERY_ALTER, types: ['user'], + config_enforced: TRUE, label: new TranslatableMarkup('Include blocked users'), description: new TranslatableMarkup('Includes any blocked user collected by this recipients collector.'), )]