/** * Returns true if the object blongs to the texmplate context ($memberIds) * @author Ignacio Vazquez - elpepe.uy@gmail.com * @param ContentDataObject $object * @param array $memberIds */ static function validateObjectContext($object, $memberIds) { $valid = true; // Dimensiones requeridas para el tipo de objecto $dimensions = Dimensions::getAllowedDimensions(self::instance()->getObjectTypeId()); $requiredDimensions = array(); foreach ($dimensions as $dim) { if ($dim['is_required']) { $requiredDimensions[$dim['dimension_id']] = $dim; // Performance, dim id in the array key ! ! ! } } // Miembros del Objeto $objMembers = $object->getMemberIds(); // P/cada miembro foreach ($objMembers as $mid) { $member = Members::instance()->findById($mid); if ($member instanceof Member) { /* @var $member Member */ $did = $member->getDimensionId(); // Si la dimension del miembro esta en la requeridas if ($requiredDimensions[$did]) { if (!in_array($mid, $memberIds)) { $valid = false; } } } } if (!$valid) { throw new DAOValidationError($this, array(lang("template members do not match object members"))); } }
/** * @param unknown_type $content_object_type_id * @param unknown_type $genid * @param unknown_type $selected_members * @param unknown_type $options * @param unknown_type $skipped_dimensions * @param unknown_type $simulate_required */ function render_dimension_trees($content_object_type_id, $genid = null, $selected_members = null, $options = array(), $skipped_dimensions = null, $simulate_required = null) { if (is_numeric($content_object_type_id)) { if (is_null($genid)) $genid = gen_id(); $user_dimensions = get_user_dimensions_ids(); // User allowed dimensions $dimensions = array() ; if ( $all_dimensions = Dimensions::getAllowedDimensions($content_object_type_id) ) { // Diemsions for this content type foreach ($all_dimensions as $dimension){ // A kind of intersection... if ( isset($user_dimensions[$dimension['dimension_id']] ) ){ if( $dimension_options = json_decode($dimension['dimension_options'])){ if (isset($dimension_options->useLangs) && $dimension_options->useLangs ) { $dimension['dimension_name'] = lang($dimension['dimension_code']); } } $dimensions[] = $dimension ; } } } $object_is_new = is_null($selected_members); if ($dimensions!= null && count($dimensions)) { if (is_null($selected_members) && array_var($options, 'select_current_context')) { $context = active_context(); $selected_members = array(); foreach ($context as $selection) { if ($selection instanceof Member) $selected_members[] = $selection->getId(); } } $selected_members_json = json_encode($selected_members); $component_id = "$genid-member-chooser-panel-$content_object_type_id" ; if (isset($options['layout']) && in_array($options['layout'], array('horizontal', 'column'))) { $layout = $options['layout']; } else { //$layout = count($dimensions) > 5 ? "horizontal" : "column"; $layout = "column"; } ?> <?php if (!$object_is_new) : ?> <input id='<?php echo $genid; ?>trees_not_loaded' name='trees_not_loaded' type='hidden' value="1"></input> <?php endif;?> <input id='<?php echo $genid; ?>members' name='members' type='hidden' value="<?php echo str_replace('"', "'", $selected_members_json); ?>"></input> <div id='<?php echo $component_id ?>-container' class="member-chooser-container" ></div> <script> var memberChooserPanel = new og.MemberChooserPanel({ renderTo: '<?php echo $component_id ?>-container', id: '<?php echo $component_id ?>', selectedMembers: <?php echo $selected_members_json?>, layout: '<?php echo $layout; ?>' }) ; <?php foreach ($dimensions as $dimension) : $dimension_id = $dimension['dimension_id']; if (is_array($skipped_dimensions) && in_array($dimension_id, $skipped_dimensions)) continue; if ( is_array(array_var($options, 'allowedDimensions')) && array_search($dimension_id, $options['allowedDimensions']) === false ){ continue; } if (!$dimension['is_manageable']) continue; $is_required = $dimension['is_required']; $dimension_name = $dimension['dimension_name'] ; if ($is_required) $dimension_name.= " *" ; if (is_array($simulate_required) && in_array($dimension_id, $simulate_required)) $is_required = true; if (!isset($id)) $id = gen_id(); ?> var config = { title: '<?php echo $dimension_name ?>', dimensionId: <?php echo $dimension_id ?>, objectTypeId: <?php echo $content_object_type_id ?>, required: <?php echo $is_required ?>, reloadDimensions: <?php echo json_encode( DimensionMemberAssociations::instance()->getDimensionsToReload($dimension_id) ) ; ?>, isMultiple: <?php echo $dimension['is_multiple'] ?>, selModel: <?php echo ($dimension['is_multiple'])? 'new Ext.tree.MultiSelectionModel()': 'new Ext.tree.DefaultSelectionModel()'?> }; <?php if( isset ($options['allowedMemberTypes'])) : ?> config.allowedMemberTypes = <?php echo json_encode($options['allowedMemberTypes']) ?> ; <?php endif; ?> <?php if( isset ($options['collapsible'])) : ?> config.collapsible = <?php echo (int)$options['collapsible'] ?> ; <?php endif; ?> <?php if( isset ($options['collapsed'])) : ?> config.collapsed = <?php echo (int) $options['collapsed'] ?> ; <?php endif; ?> config.listeners = { 'tree rendered': function(tree) { if (!tree.ownerCt.rendered_trees) tree.ownerCt.rendered_trees = 0; tree.ownerCt.rendered_trees++; if (tree.ownerCt.rendered_trees == tree.ownerCt.items.length) tree.ownerCt.fireEvent('all trees rendered', tree.ownerCt); } }; var tree = new og.MemberChooserTree ( config ); memberChooserPanel.add(tree); <?php endforeach; ?> og.can_submit_members = false; memberChooserPanel.on('all trees rendered', function(panel) { og.can_submit_members = true; var trees_to_reload = []; panel.items.each(function(item, index, length) { var checked = item.getLastChecked(); if (checked != 0 && item.filterOnChange) trees_to_reload.push(item); }); if (trees_to_reload.length > 0) { for (var i=0; i<trees_to_reload.length; i++) { trees_to_reload[i].dont_update_form = true; tree = trees_to_reload[i]; setTimeout(function() { tree.dont_update_form = false; }, 2500); } for (var i=1; i<trees_to_reload.length; i++) { var next = trees_to_reload[i]; trees_to_reload[i-1].on('all trees updated', function(){ next.fireEvent('checkchange', next.getNodeById(next.getLastChecked()), true); next.expand(); }); } var t = trees_to_reload[0]; t.fireEvent('checkchange', t.getNodeById(t.getLastChecked()), true); t.expand(); } }); memberChooserPanel.doLayout(); </script> <?php } } }
function render_member_selectors($content_object_type_id, $genid = null, $selected_member_ids = null, $options = array(), $skipped_dimensions = null, $simulate_required = null) { if (is_numeric($content_object_type_id)) { if (is_null($genid)) $genid = gen_id(); $user_dimensions = get_user_dimensions_ids(); // User allowed dimensions $dimensions = array(); // Diemsions for this content type if ( $all_dimensions = Dimensions::getAllowedDimensions($content_object_type_id) ) { foreach ($all_dimensions as $dimension){ if ( isset($user_dimensions[$dimension['dimension_id']] ) ){ if( $dimension_options = json_decode($dimension['dimension_options'])){ if (isset($dimension_options->useLangs) && $dimension_options->useLangs ) { $dimension['dimension_name'] = lang($dimension['dimension_code']); } } $dimensions[] = $dimension; } } } if ($dimensions != null && count($dimensions)) { if (is_null($selected_member_ids) && array_var($options, 'select_current_context')) { $context = active_context(); $selected_member_ids = array(); foreach ($context as $selection) { if ($selection instanceof Member) $selected_member_ids[] = $selection->getId(); } } if (is_null($selected_member_ids)) $selected_member_ids = array(); // Set view variables $selected_members = count($selected_member_ids) > 0 ? Members::findAll(array('conditions' => 'id IN ('.implode(',', $selected_member_ids).')')) : array(); $selected_members_json = "[".implode(',', $selected_member_ids)."]"; $component_id = "$genid-member-selectors-panel-$content_object_type_id"; $object_is_new = is_null($selected_members); $listeners = array_var($options, 'listeners', array()); $allowed_member_type_ids = array_var($options, 'allowedMemberTypes', null); $initial_selected_members = $selected_members; if (count($initial_selected_members) == 0) { $selected_context_member_ids = active_context_members(false); if (count($selected_context_member_ids) > 0) { $initial_selected_members = Members::findAll(array('conditions' => 'id IN ('.implode(',', $selected_context_member_ids).')')); } } $tmp = array(); foreach ($initial_selected_members as $ism) { if ($ism->getDimension()->getIsManageable()) $tmp[] = $ism; } $initial_selected_members = $tmp; // Render view include get_template_path("components/multiple_dimension_selector", "dimension"); } } }
function render_member_selectors($content_object_type_id, $genid = null, $selected_member_ids = null, $options = array(), $skipped_dimensions = null, $simulate_required = null, $default_view = true) { if (is_numeric($content_object_type_id)) { if (is_null($genid)) { $genid = gen_id(); } $user_dimensions = get_user_dimensions_ids(); // User allowed dimensions $dimensions = array(); // Diemsions for this content type if ($all_dimensions = Dimensions::getAllowedDimensions($content_object_type_id)) { foreach ($all_dimensions as $dimension) { if (isset($user_dimensions[$dimension['dimension_id']])) { $custom_name = DimensionOptions::getOptionValue($dimension['dimension_id'], 'custom_dimension_name'); $dimension['dimension_name'] = $custom_name && trim($custom_name) != "" ? $custom_name : lang($dimension['dimension_code']); $dimensions[] = $dimension; } } } if ($dimensions != null && count($dimensions)) { if (is_null($selected_member_ids) && array_var($options, 'select_current_context')) { $context = active_context(); $selected_member_ids = array(); foreach ($context as $selection) { if ($selection instanceof Member) { $selected_member_ids[] = $selection->getId(); } } } if (is_null($selected_member_ids)) { $selected_member_ids = array(); } $skipped_dimensions_cond = ""; if (is_array($skipped_dimensions) && count($skipped_dimensions) > 0) { $skipped_dimensions_cond = " AND dimension_id NOT IN (" . implode(',', $skipped_dimensions) . ")"; } // Set view variables $manageable_conds = ' AND dimension_id IN (SELECT id from ' . TABLE_PREFIX . 'dimensions WHERE is_manageable=1)' . $skipped_dimensions_cond; $selected_members = count($selected_member_ids) > 0 ? Members::findAll(array('conditions' => 'id IN (' . implode(',', $selected_member_ids) . ') ' . $manageable_conds)) : array(); $selected_member_ids = array(); foreach ($selected_members as $sm) { $selected_member_ids[] = $sm->getId(); } $selected_members_json = "[" . implode(',', $selected_member_ids) . "]"; $component_id = "{$genid}-member-selectors-panel-{$content_object_type_id}"; $object_is_new = is_null($selected_members); $listeners = array_var($options, 'listeners', array()); $allowed_member_type_ids = array_var($options, 'allowedMemberTypes', null); $initial_selected_members = $selected_members; if (count($initial_selected_members) == 0) { $selected_context_member_ids = active_context_members(false); if (count($selected_context_member_ids) > 0) { $initial_selected_members = Members::findAll(array('conditions' => 'id IN (' . implode(',', $selected_context_member_ids) . ')')); } } $tmp = array(); foreach ($initial_selected_members as $ism) { if ($ism->getDimension()->getIsManageable()) { $tmp[] = $ism; } } $initial_selected_members = $tmp; // Render view include get_template_path("components/multiple_dimension_selector", "dimension"); } } }
/** * Returns the users with permissions for the object type $object_type for the context $context * * @param $object_type_id Object Type * @param $context Context * @param $access_level (ACCESS_LEVEL_READ, ACCESS_LEVEL_WRITE, ACCESS_LEVEL_DELETE) * @param $extra_conditions Extra conditions to add to the users query * @param $to_assign true if this function is called to fill the "assigned to" combobox when editing a task */ function allowed_users_in_context($object_type_id, $context = null, $access_level = ACCESS_LEVEL_READ, $extra_conditions = "") { $result = array(); $members = array(); if (isset($context) && is_array($context)) { foreach ($context as $selection) { if ($selection instanceof Member) { $members[] = $selection; } } } if (count($members) == 0) { $logged_user_pgs = logged_user()->getPermissionGroupIds(); if (count($logged_user_pgs) > 0) { $dimensions = Dimensions::getAllowedDimensions($object_type_id); foreach ($dimensions as $d) { $dim = Dimensions::getDimensionById(array_var($d, 'dimension_id')); if ($dim instanceof Dimension && $dim->getDefinesPermissions() && $dim->getCode() != 'feng_persons' && $dim->getCode() != 'feng_users') { if ($dim->hasAllowAllForContact(implode(",", $logged_user_pgs))) { $permission_conditions = ""; } else { $permission_conditions = " AND EXISTS (SELECT cmp.permission_group_id FROM " . TABLE_PREFIX . "contact_member_permissions cmp \n\t\t\t\t\t\t\t\tWHERE cmp.permission_group_id IN (" . implode(",", $logged_user_pgs) . ") AND cmp.member_id=" . TABLE_PREFIX . "members.id AND cmp.object_type_id={$object_type_id})"; } $members = array_merge($members, $dim->getAllMembers(false, null, true, $permission_conditions)); } } } } $all_permission_groups = array(); $rows = DB::executeAll("SELECT DISTINCT permission_group_id FROM " . TABLE_PREFIX . "contact_permission_groups"); foreach ($rows as $row) { $all_permission_groups[] = $row['permission_group_id']; } $allowed_permission_groups = can_access_pgids($all_permission_groups, $members, $object_type_id, $access_level); if (count($allowed_permission_groups) > 0) { $result = Contacts::instance()->findAll(array('conditions' => "id IN (SELECT DISTINCT contact_id FROM " . TABLE_PREFIX . "contact_permission_groups\n\t\t\t\t\t\t\t\tWHERE permission_group_id IN (" . implode(",", $allowed_permission_groups) . ") {$extra_conditions})", 'order' => 'name')); } return $result; }
/** * Returns the users with permissions for the object type $object_type for the context $context * * @param $object_type_id Object Type * @param $context Context * @param $access_level (ACCESS_LEVEL_READ, ACCESS_LEVEL_WRITE, ACCESS_LEVEL_DELETE) * @param $extra_conditions Extra conditions to add to the users query * @param $to_assign true if this function is called to fill the "assigned to" combobox when editing a task */ function allowed_users_in_context($object_type_id, $context = null, $access_level = ACCESS_LEVEL_READ, $extra_conditions = "", $for_tasks_filter = false) { $result = array(); $members = array(); if (isset($context) && is_array($context)) { foreach ($context as $selection) { if ($selection instanceof Member && $selection->getDimension()->getDefinesPermissions() && $selection->getDimension()->getIsManageable()) { $members[] = $selection; } } } $zero_members = false; if (count($members) == 0) { $zero_members = true; $logged_user_pgs = logged_user()->getPermissionGroupIds(); if (count($logged_user_pgs) > 0) { $dimensions = Dimensions::getAllowedDimensions($object_type_id); foreach ($dimensions as $d) { $dim = Dimensions::getDimensionById(array_var($d, 'dimension_id')); if ($dim instanceof Dimension && $dim->getDefinesPermissions() && $dim->getCode() != 'feng_persons' && $dim->getCode() != 'feng_users') { if ($dim->hasAllowAllForContact(implode(",", $logged_user_pgs))) { $permission_conditions = ""; } else { $permission_conditions = " AND EXISTS (SELECT cmp.permission_group_id FROM " . TABLE_PREFIX . "contact_member_permissions cmp \r\n\t\t\t\t\t\t\t\tWHERE cmp.permission_group_id IN (" . implode(",", $logged_user_pgs) . ") AND cmp.member_id=" . TABLE_PREFIX . "members.id AND cmp.object_type_id={$object_type_id})"; } $members = array_merge($members, $dim->getAllMembers(false, null, true, $permission_conditions)); } } } } $all_permission_groups = array(); $rows = DB::executeAll("SELECT DISTINCT permission_group_id FROM " . TABLE_PREFIX . "contact_permission_groups"); foreach ($rows as $row) { $all_permission_groups[] = $row['permission_group_id']; } if ($zero_members && $for_tasks_filter) { $allowed_permission_groups = get_user_pgs_with_permissions_in_my_members($object_type_id); } else { if ($zero_members && config_option('let_users_create_objects_in_root') && (logged_user()->isAdminGroup() || logged_user()->isExecutive() || logged_user()->isManager())) { $allowed_permission_groups = array_flat(DB::executeAll("SELECT permission_group_id FROM " . TABLE_PREFIX . "contact_member_permissions WHERE member_id=0 AND object_type_id={$object_type_id}")); } else { $allowed_permission_groups = can_access_pgids($all_permission_groups, $members, $object_type_id, $access_level); } } foreach ($allowed_permission_groups as $k => &$apg) { if (trim($apg) == '') { unset($allowed_permission_groups[$k]); } } if (count($allowed_permission_groups) > 0) { $isSuperAdmin = " OR user_type IN (SELECT id FROM " . TABLE_PREFIX . "permission_groups WHERE type='roles' AND name = 'Super Administrator')"; $result = Contacts::instance()->findAll(array('conditions' => "disabled=0 AND (\r\n\t\t\t\t\t\t\t\t\t\t\tid IN (SELECT DISTINCT contact_id FROM " . TABLE_PREFIX . "contact_permission_groups\r\n\t\t\t\t\t\t\t\t\t\t\tWHERE permission_group_id IN (" . implode(",", $allowed_permission_groups) . ") \r\n\t\t\t\t\t\t\t\t\t\t\t{$isSuperAdmin}\r\n\t\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t{$extra_conditions})", 'order' => 'name')); } return $result; }
function getMembersIdsToDisplayPath() { $member_ids = array(); $dimensions_ids = array(); $selected_members_ids = $this->getMemberIds(); if (count($selected_members_ids) > 0) { $selected_members_cond = ' AND id IN (' . implode(',', $selected_members_ids) . ')'; //get all dimensions ids to showInPaths $dimensions = Dimensions::getAllowedDimensions($this->getObjectTypeId()); foreach ($dimensions as $dimension) { $options = json_decode($dimension['dimension_options']); if (isset($options->showInPaths) && $options->showInPaths) { $dimensions_ids[] = $dimension['dimension_id']; $to_display = user_config_option('breadcrumb_member_count'); $extra_cond = " AND m.dimension_id = " . $dimension['dimension_id']; $extra_cond .= $selected_members_cond; $dim_members = ObjectMembers::getMembersIdsByObjectAndExtraCond($this->getId(), $extra_cond, $to_display, false); foreach ($dim_members as $mem) { $member_ids[$dimension['dimension_id']][$mem] = $mem; } } } } return $member_ids; }