diff --git a/CRM/Member/BAO/Membership.php b/CRM/Member/BAO/Membership.php index 6d206aa137b..a5bea509fcf 100644 --- a/CRM/Member/BAO/Membership.php +++ b/CRM/Member/BAO/Membership.php @@ -1344,9 +1344,11 @@ public static function sortName($id) { * @throws \CRM_Core_Exception */ public static function createRelatedMemberships(&$params, &$dao, $reset = FALSE) { + // CRM-4213 check for loops, using static variable to record contacts already processed. static $relatedContactIds = array(); if ($reset) { - // not sure why a static var is in use here - we need a way to reset it from the test suite + // We need a way to reset this static variable from the test suite. + // @todo consider replacing with Civi::$statics but note reset now used elsewhere: CRM-17723. $relatedContactIds = array(); return FALSE; } @@ -1388,12 +1390,12 @@ public static function createRelatedMemberships(&$params, &$dao, $reset = FALSE) ); } - // check for loops. CRM-4213 - // remove repeated related contacts, which already inherited membership. - $relatedContactIds[$membership->contact_id] = TRUE; + // CRM-4213, CRM-19735 check for loops, using static variable to record contacts already processed. + // Remove repeated related contacts, which already inherited membership of this type. + $relatedContactIds[$membership->contact_id][$membership->membership_type_id] = TRUE; foreach ($allRelatedContacts as $cid => $status) { - if (empty($relatedContactIds[$cid])) { - $relatedContactIds[$cid] = TRUE; + if (empty($relatedContactIds[$cid]) || empty($relatedContactIds[$cid][$membership->membership_type_id])) { + $relatedContactIds[$cid][$membership->membership_type_id] = TRUE; //don't create membership again for owner contact. $nestedRelationship = FALSE;