function apply_association_filters($dimension, $dimension_members, $selected_members) { $members_to_retrieve = array(); $all_associated_members_ids = array(); foreach ($selected_members as $member) { // ignore selected members that are from the same dimension that is going to be filtered if (!$member instanceof Member || $member->getDimensionId() == $dimension->getId()) { continue; } // get dimension associations for selected member object type and the dimension to be filtered $association_ids = DimensionMemberAssociations::getAllAssociationIds($member->getDimensionId(), $dimension->getId(), $member->getObjectTypeId()); if (count($association_ids) > 0) { $associated_members_ids = array(); foreach ($association_ids as $id) { $property_members_members = null; $property_members_props = null; $association = DimensionMemberAssociations::findById($id); // $children = $member->getAllChildrenInHierarchy(); if ($association->getDimensionId() == $dimension->getId()) { if (is_null($property_members_members)) { $property_members_members = MemberPropertyMembers::getAllPropertyMembers($id); } $tmp_assoc_member_ids = array_var($property_members_members, $member->getId(), array()); /* foreach ($children as $child){ $tmp_assoc_member_ids = array_merge($tmp_assoc_member_ids, array_var($property_members_members, $child->getId(), array())); } */ $associated_members_ids = array_unique(array_merge($associated_members_ids, $tmp_assoc_member_ids)); } else { if (is_null($property_members_props)) { $property_members_props = MemberPropertyMembers::getAllPropertyMembers($id, true); } $tmp_assoc_member_ids = array_var($property_members_props, $member->getId(), array()); /* foreach ($children as $child){ $tmp_assoc_member_ids = array_merge($tmp_assoc_member_ids, array_var($property_members_props, $child->getId(), array())); } */ $associated_members_ids = array_unique(array_merge($associated_members_ids, $tmp_assoc_member_ids)); } } $all_associated_members_ids[] = array_unique($associated_members_ids); } } if (isset($association_ids) && count($association_ids) > 0 && count($all_associated_members_ids) > 0) { $intersection = array_var($all_associated_members_ids, 0); if (count($all_associated_members_ids) > 1) { $k = 1; while ($k < count($all_associated_members_ids)) { $intersection = array_intersect($intersection, $all_associated_members_ids[$k++]); } } $all_associated_members_ids = $intersection; if (count($all_associated_members_ids) > 0) { $dimension_member_ids = array(); foreach ($dimension_members as $dm) { $dimension_member_ids[] = $dm->getId(); } $members_to_retrieve_ids = array(); $associated_members = Members::findAll(array('conditions' => 'id IN (' . implode(',', $all_associated_members_ids) . ')')); foreach ($associated_members as $associated_member) { $context_hierarchy_members = $associated_member->getAllParentMembersInHierarchy(true); foreach ($context_hierarchy_members as $context_member) { if (!in_array($context_member->getId(), $members_to_retrieve_ids) && in_array($context_member->getId(), $dimension_member_ids)) { $members_to_retrieve[$context_member->getName() . "_" . $context_member->getId()] = $context_member; $members_to_retrieve_ids[] = $context_member->getId(); } } } // alphabetical order $members_to_retrieve = array_ksort($members_to_retrieve); } } else { $members_to_retrieve = $dimension_members; } return $members_to_retrieve; }