Пример #1
0
 function get_dimensions_for_properties()
 {
     if (!can_manage_dimension_members(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $dim_id = get_id();
     $obj_type = get_id('otype');
     $parent_id = get_id('parent');
     if ($parent_id == 0) {
         $dim_obj_type = DimensionObjectTypes::findById(array('dimension_id' => $dim_id, 'object_type_id' => $obj_type));
         if (!$dim_obj_type->getIsRoot()) {
             flash_error(lang('parent member must be selected to set properties'));
             ajx_current("empty");
             return;
         }
     }
     $dimensions = array();
     $associations_info = array();
     $associations_info_tmp = array();
     $member_parents = array();
     $associations = DimensionMemberAssociations::getAssociatations($dim_id, $obj_type);
     foreach ($associations as $assoc) {
         $assoc_info = array('id' => $assoc->getId(), 'required' => $assoc->getIsRequired(), 'multi' => $assoc->getIsMultiple(), 'ot' => $assoc->getAssociatedObjectType());
         $assoc_info['members'] = Members::getByDimensionObjType($assoc->getAssociatedDimensionMemberAssociationId(), $assoc->getAssociatedObjectType());
         $ot = ObjectTypes::findById($assoc->getAssociatedObjectType());
         $assoc_info['ot_name'] = $ot->getName();
         if (!isset($associations_info_tmp[$assoc->getAssociatedDimensionMemberAssociationId()])) {
             $associations_info_tmp[$assoc->getAssociatedDimensionMemberAssociationId()] = array();
             $dimensions[] = Dimensions::getDimensionById($assoc->getAssociatedDimensionMemberAssociationId());
         }
         $associations_info_tmp[$assoc->getAssociatedDimensionMemberAssociationId()][] = $assoc_info;
     }
     // check for restrictions
     if ($parent_id > 0) {
         $parent = Members::findById($parent_id);
         $all_parents = $parent->getAllParentMembersInHierarchy();
         $all_parent_ids = array($parent_id);
         foreach ($all_parents as $p) {
             $all_parent_ids[] = $p->getId();
         }
     } else {
         $all_parent_ids = array(0);
     }
     $all_property_members = array();
     foreach ($associations_info_tmp as $assoc_dim => $ot_infos) {
         foreach ($ot_infos as $info) {
             $restriction_defs = DimensionMemberRestrictionDefinitions::findAll(array("conditions" => "`dimension_id` = {$dim_id} AND `restricted_dimension_id` = {$assoc_dim} \n\t\t\t\t\tAND `restricted_object_type_id` = " . $info['ot']));
             if (!is_array($restriction_defs) || count($restriction_defs) == 0) {
                 // no restriction definitions => include all members
                 $associations_info[$assoc_dim][] = $info;
                 $restricted_dimensions[$assoc_dim] = false;
             } else {
                 // restriction definition found => filter members
                 $restricted_dimensions[$assoc_dim] = true;
                 $restrictions = array();
                 $rest_members = array();
                 $conditions = "";
                 foreach ($restriction_defs as $rdef) {
                     $conditions = "`restricted_member_id` IN (SELECT `id` FROM " . Members::instance()->getTableName(true) . " WHERE \n\t\t\t\t\t\t\t`object_type_id` = " . $rdef->getRestrictedObjectTypeId() . " AND `dimension_id` = {$assoc_dim}) AND `member_id` IN (" . implode(",", $all_parent_ids) . ")";
                     $restrictions[] = MemberRestrictions::findAll(array("conditions" => $conditions));
                 }
                 $to_intersect = array();
                 foreach ($restrictions as $k => $rests) {
                     $to_intersect[$k] = array();
                     foreach ($rests as $rest) {
                         $to_intersect[$k][] = $rest->getRestrictedMemberId();
                     }
                     if (count($to_intersect[$k]) == 0) {
                         unset($to_intersect[$k]);
                     }
                 }
                 $apply_filter = true;
                 $intersection = array_var($to_intersect, 0, array());
                 if (count($to_intersect) > 1) {
                     $k = 1;
                     while ($k < count($to_intersect)) {
                         $intersection = array_intersect($intersection, $to_intersect[$k++]);
                     }
                 } else {
                     if (count($to_intersect) == 0) {
                         // no restrictions found for members
                         $apply_filter = false;
                     }
                 }
                 if ($apply_filter) {
                     $rest_members = Members::findAll(array("conditions" => "`id` IN (" . implode(",", $intersection) . ")"));
                 } else {
                     $rest_members = $info['members'];
                 }
                 $new_info = $info;
                 $new_info['members'] = $rest_members;
                 $associations_info[$assoc_dim][] = $new_info;
                 foreach ($rest_members as $member) {
                     if (!isset($member_parents[$assoc_dim])) {
                         $member_parents[$assoc_dim] = array();
                     }
                     if ($member->getParentMemberId() > 0) {
                         $member_parents[$assoc_dim][$member->getId()] = $member->getParentMemberId();
                     }
                 }
             }
         }
     }
     foreach ($associations_info as $assoc_dim => $ot_infos) {
         foreach ($ot_infos as $info) {
             foreach ($info['members'] as $mem) {
                 $all_property_members[] = $mem->getId();
             }
         }
     }
     // para cada $info['ot'] ver si en el resultado hay miembros que los restringen
     foreach ($associations_info as $assoc_dim => &$ot_infos) {
         foreach ($ot_infos as &$info) {
             $restriction_defs = DimensionMemberRestrictionDefinitions::findAll(array("conditions" => "`restricted_dimension_id` = {$assoc_dim} \n\t\t\t\t\tAND `restricted_object_type_id` = " . $info['ot']));
             $restrictions = array();
             foreach ($restriction_defs as $rdef) {
                 $restrictions_tmp = MemberRestrictions::findAll(array("conditions" => "`member_id` IN (\n\t\t\t\t\t\tSELECT `id` FROM " . Members::instance()->getTableName(true) . " WHERE `dimension_id` = " . $rdef->getDimensionId() . " AND `object_type_id` = " . $rdef->getObjectTypeId() . " AND `id` IN (" . implode(",", $all_property_members) . "))"));
                 $restrictions = array_merge($restrictions, $restrictions_tmp);
             }
             $restricted_ids = array();
             if (count($restrictions) == 0) {
                 continue;
             }
             foreach ($restrictions as $rest) {
                 $restricted_ids[] = $rest->getRestrictedMemberId();
             }
             $tmp = array();
             foreach ($info['members'] as $rmem) {
                 if (in_array($rmem->getId(), $restricted_ids)) {
                     $tmp[] = $rmem;
                 }
             }
             $info['members'] = $tmp;
         }
     }
     $req_dimensions = array();
     foreach ($associations_info as $assoc_dim => &$ot_infos) {
         $required_count = 0;
         foreach ($ot_infos as &$info) {
             if ($info['required']) {
                 $required_count++;
             }
         }
         $req_dimensions[$assoc_dim] = $required_count > 0;
     }
     $member_id = get_id('mem_id');
     $actual_associations_info = array();
     if ($member_id > 0) {
         // actual associations
         $actual_associations = MemberPropertyMembers::getAssociatedPropertiesForMember($member_id);
         foreach ($actual_associations as $actual_assoc) {
             $actual_associations_info[$actual_assoc->getPropertyMemberId()] = true;
         }
     }
     tpl_assign('genid', array_var($_GET, 'genid'));
     tpl_assign('dimensions', $dimensions);
     tpl_assign('associations', $associations_info);
     tpl_assign('actual_associations', $actual_associations_info);
     tpl_assign('req_dimensions', $req_dimensions);
     tpl_assign('restricted_dimensions', isset($restricted_dimensions) ? $restricted_dimensions : array());
     ajx_extra_data(array('parents' => $member_parents, 'genid' => array_var($_GET, 'genid')));
     $this->setTemplate('dim_properties');
 }
 /**
 * This function will return paginated result. Result is an array where first element is 
 * array of returned object and second populated pagination object that can be used for 
 * obtaining and rendering pagination data using various helpers.
 * 
 * Items and pagination array vars are indexed with 0 for items and 1 for pagination
 * because you can't use associative indexing with list() construct
 *
 * @access public
 * @param array $arguments Query argumens (@see find()) Limit and offset are ignored!
 * @param integer $items_per_page Number of items per page
 * @param integer $current_page Current page number
 * @return array
 */
 function paginate($arguments = null, $items_per_page = 10, $current_page = 1) {
   if(isset($this) && instance_of($this, 'DimensionMemberRestrictionDefinitions')) {
     return parent::paginate($arguments, $items_per_page, $current_page);
   } else {
     return DimensionMemberRestrictionDefinitions::instance()->paginate($arguments, $items_per_page, $current_page);
   } // if
 } // paginate
Пример #3
0
 function getDimensionRestrictedObjectTypeIds($restricted_dimension_id, $is_required = true)
 {
     return DimensionMemberRestrictionDefinitions::getRestrictedObjectTypeIds($this->getDimensionId(), $this->getObjectTypeId(), $restricted_dimension_id, $is_required);
 }
 /**
  * Return manager instance
  *
  * @access protected
  * @param void
  * @return DimensionMemberRestrictionDefinitions 
  */
 function manager()
 {
     if (!$this->manager instanceof DimensionMemberRestrictionDefinitions) {
         $this->manager = DimensionMemberRestrictionDefinitions::instance();
     }
     return $this->manager;
 }