diff --git a/modules/site_tools_group_helpers/site_tools_group_helpers.info.yml b/modules/site_tools_group_helpers/site_tools_group_helpers.info.yml new file mode 100644 index 0000000..72309f1 --- /dev/null +++ b/modules/site_tools_group_helpers/site_tools_group_helpers.info.yml @@ -0,0 +1,8 @@ +name: 'Site Tools — Group Helpers' +type: module +description: 'Utilitários reutilizáveis para integração com o módulo Group.' +core_version_requirement: ^10.3 || ^11 +package: Custom +dependencies: + - site_tools:site_tools + - group:group diff --git a/modules/site_tools_group_helpers/site_tools_group_helpers.install b/modules/site_tools_group_helpers/site_tools_group_helpers.install new file mode 100644 index 0000000..28dfd46 --- /dev/null +++ b/modules/site_tools_group_helpers/site_tools_group_helpers.install @@ -0,0 +1,27 @@ +getStorage('field_config') + ->loadByProperties(['field_type' => 'entity_reference']); + + foreach ($field_configs as $field_config) { + if ($field_config->getSetting('handler') === 'site_tools_group_helpers') { + _site_tools_group_helpers_set_widget($field_config, 'options_select', []); + } + } +} diff --git a/modules/site_tools_group_helpers/site_tools_group_helpers.module b/modules/site_tools_group_helpers/site_tools_group_helpers.module new file mode 100644 index 0000000..666ca7e --- /dev/null +++ b/modules/site_tools_group_helpers/site_tools_group_helpers.module @@ -0,0 +1,98 @@ +getFormObject()->getEntity(); + + if ($field->getFieldStorageDefinition()->getSetting('target_type') !== 'group') { + return; + } + + $target_bundles = &$form['settings']['handler']['handler_settings']['target_bundles'] ?? NULL; + if ($target_bundles !== NULL) { + $target_bundles['#required'] = FALSE; + } +} + +/** + * Implements hook_field_config_update(). + * + * When a field switches to the site_tools_group_helpers selection handler, + * automatically updates all its form displays to use the options_select widget. + * When it switches away, reverts to entity_reference_autocomplete. + */ +function site_tools_group_helpers_field_config_update(FieldConfigInterface $field_config): void { + $handler = $field_config->getSetting('handler'); + $original_handler = $field_config->original?->getSetting('handler'); + + if ($handler === $original_handler) { + return; + } + + if ($handler === 'site_tools_group_helpers') { + _site_tools_group_helpers_set_widget($field_config, 'options_select', []); + } + elseif ($original_handler === 'site_tools_group_helpers') { + _site_tools_group_helpers_set_widget($field_config, 'entity_reference_autocomplete', [ + 'match_operator' => 'CONTAINS', + 'match_limit' => 10, + 'size' => 60, + 'placeholder' => '', + ]); + } +} + +/** + * Updates the widget type for a field across all its form displays. + * + * @param \Drupal\field\FieldConfigInterface $field_config + * The field config entity. + * @param string $widget_type + * The widget plugin ID to apply. + * @param array $settings + * The widget settings to apply. + */ +function _site_tools_group_helpers_set_widget(FieldConfigInterface $field_config, string $widget_type, array $settings): void { + $entity_type_id = $field_config->getTargetEntityTypeId(); + $bundle = $field_config->getTargetBundle(); + $field_name = $field_config->getName(); + + $form_displays = \Drupal::entityTypeManager() + ->getStorage('entity_form_display') + ->loadByProperties([ + 'targetEntityType' => $entity_type_id, + 'bundle' => $bundle, + ]); + + foreach ($form_displays as $form_display) { + $component = $form_display->getComponent($field_name); + if ($component === NULL) { + continue; + } + + $form_display->setComponent($field_name, [ + 'type' => $widget_type, + 'weight' => $component['weight'], + 'region' => $component['region'] ?? 'content', + 'settings' => $settings, + 'third_party_settings' => $component['third_party_settings'] ?? [], + ]); + $form_display->save(); + } +} diff --git a/modules/site_tools_group_helpers/src/Plugin/EntityReferenceSelection/MemberGroupSelection.php b/modules/site_tools_group_helpers/src/Plugin/EntityReferenceSelection/MemberGroupSelection.php new file mode 100644 index 0000000..30f5554 --- /dev/null +++ b/modules/site_tools_group_helpers/src/Plugin/EntityReferenceSelection/MemberGroupSelection.php @@ -0,0 +1,64 @@ +currentUser); + + if (empty($memberships)) { + // User has no memberships — return an empty result set. + $query->condition('id', 0, '='); + return $query; + } + + $gids = array_map(fn($m) => $m->getGroupId(), $memberships); + $query->condition('id', $gids, 'IN'); + + return $query; + } + +}