コード例 #1
0
 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;
 }