From 9d701107ac72d0b33665fb5f283ccacb875f26e6 Mon Sep 17 00:00:00 2001 From: Kyle Huynh <7862086+kylehuynh205@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:17:18 -0400 Subject: [PATCH 1/5] Refactor group relation handling in Utilities.php --- src/Utilities.php | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/Utilities.php b/src/Utilities.php index c86f0d7..3b1bf27 100644 --- a/src/Utilities.php +++ b/src/Utilities.php @@ -57,20 +57,7 @@ public static function getMedia(NodeInterface $node) { * @throws \Drupal\Core\Entity\EntityStorageException */ public static function clear_group_relation_by_entity($entity) { - // Get access control field from config. - if ($entity->getEntityTypeId() === "node") { - // Get access control field from config. - $access_control_field = self::getAccessControlFieldinNode($entity); - } - elseif ($entity->getEntityTypeId() === "media") { - $access_control_field = self::getAccessControlFieldinMedia($entity); - } - - // Check if $access_control_field exists and valid. - if (empty($access_control_field) || !$entity->hasField($access_control_field)) { - return; - } - // For each term, loop through groups-entity. + // Check if group relationships exist for the entity and delete them. foreach (GroupRelationship::loadByEntity($entity) as $group_content) { $group_content->delete(); } @@ -109,12 +96,12 @@ public static function taggingFieldAccessTermsNode($nid, $targets) { $node = Node::load($nid); // Clear any previous relations before adding new ones if called from the UI. - // 1. Clear field_access_terms in media level. - self::untag_existed_field_access_terms($node); - - // 2. Clearing group relation with islandora object. + // 1. Clearing group relation with islandora object first. self::clear_group_relation_by_entity($node); + // 2. Clear field_access_terms. + self::untag_existed_field_access_terms($node); + if (count($targets) > 0) { // Get access control field from config. $access_control_field = self::getAccessControlFieldinNode($node); @@ -134,6 +121,8 @@ public static function taggingFieldAccessTermsNode($nid, $targets) { * @return void */ public static function taggingFieldAccessTermMedia($media, $targets) { + // Clearing group relation with media first. + self::clear_group_relation_by_entity($media); self::untag_existed_field_access_terms($media); @@ -414,8 +403,16 @@ public static function adding_media_of_islandora_object_to_group($node, $media) * @return void */ public static function clear_term_in_field_access_terms($ne, $group_name) { - // Get access control field from config. - $access_control_field = self::getAccessControlFieldinNode($ne); + // Get access control field from config based on entity type. + if ($ne->getEntityTypeId() === 'node') { + $access_control_field = self::getAccessControlFieldinNode($ne); + } + elseif ($ne->getEntityTypeId() === 'media') { + $access_control_field = self::getAccessControlFieldinMedia($ne); + } + else { + return; + } // @todo search if the node->field_access_terms contain group name if (empty($access_control_field) || !$ne->hasField($access_control_field)) { @@ -721,7 +718,7 @@ public static function form_submit_delete_relation_untagging_entity_to_group($fo $form_object = $form_state->getFormObject(); if ($form_object instanceof EntityForm) { $entity = $form_object->getEntity(); - if ($entity->getEntityTypeId() === 'group_content') { + if (in_array($entity->getEntityTypeId(), ['group_relationship', 'group_content'])) { $group_content = $entity; $group = $group_content->getGroup(); if ($entity->getEntity()->getEntityTypeId() === "node") { @@ -843,7 +840,7 @@ public static function getGroupsByNode($nid) { } } - return array_unique($group_ids); + return $group_ids; } /** @@ -863,7 +860,7 @@ public static function getGroupsByMedia($mid) { $group_ids[] = $rel->getGroup()->label(); } } - return array_unique($group_ids); + return $group_ids; } } From 0d73fd9d7489a249763421a36380d8a1dc31344b Mon Sep 17 00:00:00 2001 From: Kyle Huynh <7862086+kylehuynh205@users.noreply.github.com> Date: Mon, 27 Jul 2026 11:18:18 -0400 Subject: [PATCH 2/5] Refactor form alteration logic for delete operations --- islandora_group.module | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/islandora_group.module b/islandora_group.module index 4e9fb89..e98c3ab 100644 --- a/islandora_group.module +++ b/islandora_group.module @@ -66,11 +66,15 @@ function islandora_group_entity_delete(EntityInterface $entity) { * Implements hook_form_alter(). */ function islandora_group_form_alter(&$form, &$form_state, $form_id) { - if (str_starts_with($form_id, "group_content_group_content_type") && str_ends_with($form_id, "_delete_form")) { - // When insert update. - $form['actions']['submit']['#submit'][] = 'form_submit_delete_relation_untagging_entity_to_group'; + $form_object = $form_state->getFormObject(); + if ($form_object instanceof \Drupal\Core\Entity\EntityFormInterface) { + $entity = $form_object->getEntity(); + if (in_array($entity->getEntityTypeId(), ['group_relationship', 'group_content']) && $form_object->getOperation() === 'delete') { + $form['actions']['submit']['#submit'][] = ['\Drupal\islandora_group\Utilities', 'form_submit_delete_relation_untagging_entity_to_group']; + } } - elseif (in_array($form_id, ['media_access_control_form', "islandora_object_access_control_form"])) { + + if (in_array($form_id, ['media_access_control_form', "islandora_object_access_control_form"])) { $form['#attached']['library'] = [ 'islandora_group/datatables', ]; From 9e9edd1029e4d6adc6c825d9002c9d381e6744b2 Mon Sep 17 00:00:00 2001 From: DSU Admin Date: Mon, 27 Jul 2026 19:57:25 -0400 Subject: [PATCH 3/5] Fixes for same action but trigger from islandora workbench --- islandora_group.module | 20 ++++++++++++++++++-- src/Utilities.php | 5 +++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/islandora_group.module b/islandora_group.module index e98c3ab..6c1aaa1 100644 --- a/islandora_group.module +++ b/islandora_group.module @@ -116,6 +116,22 @@ function islandora_group_node_insert(NodeInterface $node) { */ function islandora_group_node_update(NodeInterface $node) { Utilities::print_log("islandora_group_node_update"); + + +// Get access control field from config. + $access_control_field = Utilities::getAccessControlFieldinNode($node); + + // Make sure the selected access control field valid. + if (empty($access_control_field) || !$node->hasField($access_control_field)) { + return; + } + + $node_terms = $node->get($access_control_field)->referencedEntities(); + if (count($node_terms) ==0) { + Utilities::drupal_log("Removing relationsihp ...."); + Utilities::clear_group_relation_by_entity($node); + } + if (!Utilities::isCalledFromGroupModule()) { Utilities::adding_islandora_object_to_group($node); @@ -153,7 +169,7 @@ function islandora_group_node_update(NodeInterface $node) { * Implements hook_media_insert(). */ function islandora_group_media_insert(MediaInterface $media) { - Utilities::print_log("islandora_group_media_insert"); + Utilities::drupal_log("islandora_group_media_insert"); // Add this node to group. if (!Utilities::isCalledFromGroupModule()) { Utilities::adding_media_only_into_group($media); @@ -164,7 +180,7 @@ function islandora_group_media_insert(MediaInterface $media) { * Implements hook_media_update(). */ function islandora_group_media_update(MediaInterface $media) { - Utilities::print_log("islandora_group_media_update"); + Utilities::drupal_log("islandora_group_media_update"); // Add this node to group. if (!Utilities::isCalledFromGroupModule()) { Utilities::adding_media_only_into_group($media); diff --git a/src/Utilities.php b/src/Utilities.php index 3b1bf27..87904e7 100644 --- a/src/Utilities.php +++ b/src/Utilities.php @@ -496,6 +496,7 @@ public static function adding_media_only_into_group(MediaInterface $media) { $terms = $media->get($access_control_field)->referencedEntities(); if (empty($terms)) { // No term, exit;. + self::updating_media_only_into_group($media); return; } @@ -840,7 +841,7 @@ public static function getGroupsByNode($nid) { } } - return $group_ids; + return array_unique($group_ids); } /** @@ -860,7 +861,7 @@ public static function getGroupsByMedia($mid) { $group_ids[] = $rel->getGroup()->label(); } } - return $group_ids; + return array_unique($group_ids); } } From 4429c43f620aab950aa25cee7f08db8d20306401 Mon Sep 17 00:00:00 2001 From: Kyle Huynh <7862086+kylehuynh205@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:06:55 -0400 Subject: [PATCH 4/5] Clarify comment on media group relationship handling Updated comment for clarity regarding group relationships. --- src/Utilities.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Utilities.php b/src/Utilities.php index 87904e7..25b45da 100644 --- a/src/Utilities.php +++ b/src/Utilities.php @@ -495,8 +495,8 @@ public static function adding_media_only_into_group(MediaInterface $media) { // Get field_access_terms. $terms = $media->get($access_control_field)->referencedEntities(); if (empty($terms)) { - // No term, exit;. - self::updating_media_only_into_group($media); + // No term, clear all group relationship between the media and group + self::updating_media_only_into_group($media); return; } From 2f6f41c839ec56c9e9fd0123b93b20edfc633762 Mon Sep 17 00:00:00 2001 From: Kyle Huynh <7862086+kylehuynh205@users.noreply.github.com> Date: Mon, 27 Jul 2026 20:13:50 -0400 Subject: [PATCH 5/5] Simplify access control field checks in node update Refactor access control field retrieval and validation logic in islandora_group_node_update function. --- islandora_group.module | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/islandora_group.module b/islandora_group.module index 6c1aaa1..033ff43 100644 --- a/islandora_group.module +++ b/islandora_group.module @@ -116,21 +116,18 @@ function islandora_group_node_insert(NodeInterface $node) { */ function islandora_group_node_update(NodeInterface $node) { Utilities::print_log("islandora_group_node_update"); + // Get access control field from config. + $access_control_field = Utilities::getAccessControlFieldinNode($node); + // Make sure the selected access control field valid. + if (empty($access_control_field) || !$node->hasField($access_control_field)) { + return; + } -// Get access control field from config. - $access_control_field = Utilities::getAccessControlFieldinNode($node); - - // Make sure the selected access control field valid. - if (empty($access_control_field) || !$node->hasField($access_control_field)) { - return; - } - - $node_terms = $node->get($access_control_field)->referencedEntities(); - if (count($node_terms) ==0) { - Utilities::drupal_log("Removing relationsihp ...."); - Utilities::clear_group_relation_by_entity($node); - } + $node_terms = $node->get($access_control_field)->referencedEntities(); + if (count($node_terms) ==0) { + Utilities::clear_group_relation_by_entity($node); + } if (!Utilities::isCalledFromGroupModule()) { Utilities::adding_islandora_object_to_group($node);