function scoper_object_roles_list($viewing_user, $args = array()) { $html = ''; if (!USER_ROLES_RS && !GROUP_ROLES_RS) { wp_die(__awp('Cheatin’ uh?')); } $defaults = array('enforce_duration_limits' => true, 'is_user_profile' => false, 'echo' => true); $args = array_merge($defaults, (array) $args); extract($args); global $scoper, $wpdb, $current_user; if ($viewing_user) { if (!is_object($viewing_user)) { global $current_rs_user; if ($viewing_user == $current_rs_user->ID) { $viewing_user = $current_rs_user; } else { $viewing_user = new WP_Scoped_User($viewing_user); } } } $all_roles = array(); $role_display = array(); foreach ($scoper->role_defs->get_all_keys() as $role_handle) { if ($viewing_user) { $role_display[$role_handle] = $scoper->role_defs->get_display_name($role_handle, OBJECT_UI_RS); } else { $role_display[$role_handle] = $scoper->role_defs->get_abbrev($role_handle, OBJECT_UI_RS); } } if (!$is_user_profile) { $require_blogwide_editor = scoper_get_option('role_admin_blogwide_editor_only'); if ('admin' === $require_blogwide_editor && !is_user_administrator_rs()) { return false; } if ('admin_content' === $require_blogwide_editor && !is_content_administrator_rs()) { return false; } } else { $require_blogwide_editor = false; } foreach ($scoper->data_sources->get_all() as $src_name => $src) { $otype_count = 0; if (!empty($src->taxonomy_only) || $src_name == 'group' && !$viewing_user) { continue; } $strict_objects = $scoper->get_restrictions(OBJECT_SCOPE_RS, $src_name); foreach ($src->object_types as $object_type => $otype) { $otype_count++; $disable_role_admin = false; if ($require_blogwide_editor) { if (!$scoper->user_can_edit_blogwide('post', $object_type, array('require_others_cap' => true))) { $disable_role_admin = true; } } if (!empty($src->cols->type) && !empty($otype->name)) { $col_type = $src->cols->type; $otype_clause = "AND {$src->table}.{$col_type} = '{$otype->name}'"; } elseif ($otype_count < 2) { $otype_clause = ''; } else { continue; } $col_id = $src->cols->id; $col_name = $src->cols->name; $ug_clause_for_user_being_viewed = $viewing_user ? $viewing_user->get_user_clause('uro') : ''; // TODO: replace join with uro subselect $qry = "SELECT DISTINCT {$src->table}.{$col_name}, {$src->table}.{$col_id}, uro.role_name, uro.date_limited, uro.start_date_gmt, uro.end_date_gmt" . " FROM {$src->table} "; $join = " INNER JOIN {$wpdb->user2role2object_rs} AS uro" . " ON uro.obj_or_term_id = {$src->table}.{$col_id}" . " AND uro.src_or_tx_name = '{$src_name}'" . " AND uro.scope = 'object' AND uro.role_type = 'rs'"; $duration_clause = $enforce_duration_limits ? scoper_get_duration_clause("{$src->table}.{$src->cols->date}") : ''; $status_clause = 'post' == $src_name ? "AND post_status != 'auto-draft'" : ''; // TODO: version update script to delete post roles on auto-drafts (stored via default roles) $where = " WHERE 1=1 {$status_clause} {$otype_clause} {$duration_clause} {$ug_clause_for_user_being_viewed}"; $orderby = " ORDER BY {$src->table}.{$col_name} ASC, uro.role_name ASC"; $qry .= $join . $where . $orderby; $results = scoper_get_results($qry); if (!is_user_administrator_rs()) { // no need to filter admins - just query the assignments // only list role assignments which the logged-in user can administer $args['required_operation'] = OP_EDIT_RS; // Possible TODO: re-implement OP_ADMIN distinction with admin-specific capabilities /* if ( cr_get_reqd_caps( $src_name, OP_ADMIN_RS, $object_type ) { $args['required_operation'] = OP_ADMIN_RS; } else { $reqd_caps = array(); foreach (array_keys($src->statuses) as $status_name) { $admin_caps = $scoper->cap_defs->get_matching($src_name, $object_type, OP_ADMIN_RS, $status_name); $delete_caps = $scoper->cap_defs->get_matching($src_name, $object_type, OP_DELETE_RS, $status_name); $reqd_caps[$object_type][$status_name] = array_merge(array_keys($admin_caps), array_keys($delete_caps)); } $args['force_reqd_caps'] = $reqd_caps; } */ $qry = "SELECT {$src->table}.{$col_id} FROM {$src->table} WHERE 1=1"; $args['require_full_object_role'] = true; $qry_flt = apply_filters('objects_request_rs', $qry, $src_name, $object_type, $args); $cu_admin_results = scoper_get_col($qry_flt); if (empty($viewing_user) || $current_user->ID != $viewing_user->ID) { foreach ($results as $key => $row) { if (!in_array($row->{$col_id}, $cu_admin_results)) { unset($results[$key]); } } } else { // for current user's view of their own user profile, just de-link unadminable objects $link_roles = array(); $link_objects = array(); if (!$disable_role_admin) { foreach ($results as $key => $row) { if (in_array($row->{$col_id}, $cu_admin_results)) { $link_roles[$row->{$col_id}] = true; } } $args['required_operation'] = OP_EDIT_RS; $args['require_full_object_role'] = false; if (isset($args['force_reqd_caps'])) { unset($args['force_reqd_caps']); } $qry_flt = apply_filters('objects_request_rs', $qry, $src_name, $object_type, $args); $cu_edit_results = scoper_get_col($qry_flt); foreach ($results as $key => $row) { if (in_array($row->{$col_id}, $cu_edit_results)) { $link_objects[$row->{$col_id}] = true; } } } } } $object_roles = array(); $objnames = array(); if ($results) { $got_object_roles = true; foreach ($results as $row) { if (!isset($objnames[$row->{$col_id}])) { if ('post' == $src->name) { $objnames[$row->{$col_id}] = apply_filters('the_title', $row->{$col_name}, $row->{$col_id}); } else { $objnames[$row->{$col_id}] = $row->{$col_name}; } } $role_handle = 'rs_' . $row->role_name; if ($row->date_limited) { $duration_key = serialize(array('start_date_gmt' => $row->start_date_gmt, 'end_date_gmt' => $row->end_date_gmt)); } else { $duration_key = ''; } $object_roles[$duration_key][$row->{$col_id}][$role_handle] = true; } } else { continue; } ?> <?php $title_roles = __('edit roles', 'scoper'); foreach (array_keys($object_roles) as $duration_key) { $date_caption = ''; $limit_class = ''; $limit_style = ''; $link_class = ''; if ($duration_key) { $html .= "<h3 style='margin-bottom:0'>{$date_caption}</h3>"; $duration_limits = unserialize($duration_key); $duration_limits['date_limited'] = true; ScoperAdminUI::set_agent_formatting($duration_limits, $date_caption, $limit_class, $link_class, $limit_style); $title = "title='{$date_caption}'"; $date_caption = '<span class="rs-gray"> ' . trim($date_caption) . '</span>'; } else { $title = "title='{$title_roles}'"; } if (!$disable_role_admin && (is_user_administrator_rs() || $cu_admin_results)) { //if ( ( $src_name != $object_type ) && ( 'post' != $object_type ) ) { // menu links currently assume unique object type names // $roles_page = "rs-roles-{$object_type}_{$src_name}"; //} else { $roles_page = "rs-{$object_type}-roles"; //} $url = "admin.php?page={$roles_page}"; $html .= "<h4><a name='{$object_type}' href='{$url}'><strong>" . sprintf(__('%1$s Roles%2$s:', 'scoper'), $otype->labels->singular_name, '</strong></a><span style="font-weight:normal">' . $date_caption) . "</span></h4>"; } else { $html .= "<h4><strong>" . sprintf(__('%1$s Roles%2$s:', 'scoper'), $otype->labels->singular_name, $date_caption) . "</strong></h4>"; } $html .= "<ul class='rs-termlist'><li>" . "<table class='widefat'>" . "<thead>" . "<tr class='thead'>" . "\t<th class='rs-tightcol'>" . __('ID') . "</th>" . "\t<th>" . __awp('Name') . "</th>" . "\t<th>" . __('Role Assignments', 'scoper') . "</th>" . "</tr>" . "</thead>"; $id_clause = isset($role_codes[$role_handle]) ? "id='roles-{$role_codes[$role_handle]}'" : ''; $html .= "<tbody {$id_clause}>"; $style = ' class="rs-backwhite"'; $title_item = sprintf(__('edit %s', 'scoper'), agp_strtolower($otype->labels->singular_name)); foreach ($object_roles[$duration_key] as $obj_id => $roles) { $object_name = esc_attr($objnames[$obj_id]); $html .= "\n\t<tr{$style}>"; $link_this_object = !isset($link_objects) || isset($link_objects[$obj_id]); // link from object ID to the object type's default editor, if defined if ($link_this_object && !empty($src->edit_url)) { $src_edit_url = sprintf($src->edit_url, $obj_id); $html .= "<td><a href='{$src_edit_url}' class='edit' title='{$title_item}'>{$obj_id}</a></td>"; } else { $html .= "<td>{$obj_id}</td>"; } $name = !empty($objnames[$obj_id]) ? $objnames[$obj_id] : __('(untitled)', 'scoper'); // link from object name to our "Edit Object Role Assignment" interface $link_this_role = !isset($link_roles) || isset($link_roles[$obj_id]); if ($link_this_role) { if ('group' == $object_type) { $rs_edit_url = sprintf($src->edit_url, $obj_id); } else { $rs_edit_url = "admin.php?page=rs-object_role_edit&src_name={$src_name}&object_type={$object_type}&object_id={$obj_id}&object_name={$object_name}"; } $html .= "\n\t<td><a {$title}{$limit_style}class='{$link_class}{$limit_class}' href='{$rs_edit_url}'>{$name}</a></td>"; } else { $html .= "\n\t<td>{$name}</td>"; } $html .= "<td>"; $role_list = array(); foreach (array_keys($roles) as $role_handle) { // roles which require object assignment are asterisked (bolding would contradict the notation of term roles list, where propogating roles are bolded) if (isset($strict_objects['restrictions'][$role_handle][$obj_id]) || isset($strict_objects['unrestrictions'][$role_handle]) && is_array($strict_objects['unrestrictions'][$role_handle]) && !isset($strict_objects['unrestrictions'][$role_handle][$obj_id])) { $role_list[] = "<span class='rs-backylw'>" . $role_display[$role_handle] . '</span>'; } else { $role_list[] = $role_display[$role_handle]; } } $html .= implode(', ', $role_list); $html .= '</td></tr>'; $style = ' class="alternate"' == $style ? ' class="rs-backwhite"' : ' class="alternate"'; } // end foreach object_roles $html .= '</tbody></table>'; $html .= '</li></ul><br />'; } // end foreach role date range } // end foreach object_types } // end foreach data source if ($echo) { echo $html; } else { return $html; } }
function _agents_checklist_display($agents_subset, $role_basis, $all_agents, $id_prefix, $stored_assignments, $args, &$key, &$action_links) { $defaults = array('eligible_ids' => '', 'locked_ids' => '', 'suppress_extra_prefix' => false, 'check_for_incomplete_submission' => false, 'checkall_threshold' => 6, 'filter_threshold' => 10, 'default_hide_threshold' => 20, 'caption_length_limit' => 20, 'emsize_threshold' => 4, 'objtype_display_name' => '', 'objtype_display_name_plural' => '', 'propagation' => false, 'for_children_ids' => '', 'for_entity_ids' => '', 'via_other_scope_ids' => '', 'via_other_scope_prefix' => '/', 'via_other_scope_suffix' => '/', 'via_other_role_ids' => '', 'via_other_role_prefix' => '(', 'via_other_role_suffix' => ')', 'via_other_basis_ids' => '', 'via_other_basis_prefix' => "|", 'via_other_basis_suffix' => '|', 'inherited_prefix' => '{', 'inherited_suffix' => '}', 'suppress_last_agents' => false); $args = array_merge($defaults, (array) $args); extract($args); $ie_checkbox_style = !empty($GLOBALS['is_IE']) ? "style='height:1em'" : ''; if (ELIGIBLE_ITEMS_RS == $agents_subset && scoper_get_option("{$role_basis}_role_assignment_csv")) { return ScoperAgentsChecklist::eligible_agents_input_box($role_basis, $id_prefix, $propagation); } if (is_array($eligible_ids) && empty($eligible_ids)) { $eligible_ids = array(-1); } else { if (!is_array($eligible_ids)) { $eligible_ids = array(); } else { $eligible_ids = array_flip($eligible_ids); } } if (!is_array($stored_assignments)) { $stored_assignments = array(); } if (!is_array($locked_ids)) { $locked_ids = array(); } else { $locked_ids = array_flip($locked_ids); } if (!is_array($for_children_ids)) { $for_children_ids = array(); } else { $for_children_ids = array_flip($for_children_ids); } if (is_array($for_entity_ids) && !empty($for_entity_ids)) { $for_entity_ids = array_flip($for_entity_ids); } if (!$via_other_scope_ids || !is_array($via_other_scope_ids)) { $via_other_scope_ids = array(); } else { $via_other_scope_ids = array_flip($via_other_scope_ids); } if (!is_array($via_other_role_ids)) { $via_other_role_ids = array(); } else { $via_other_role_ids = array_flip($via_other_role_ids); } if (!is_array($via_other_basis_ids)) { $via_other_basis_ids = array(); } else { $via_other_basis_ids = array_flip($via_other_basis_ids); } if (!$suppress_extra_prefix) { $id_prefix .= "_{$role_basis}"; } $any_inherited = $any_other_scope = $any_other_role = $any_other_basis = $any_date_limits = false; $agent_count = array(); $agent_count[CURRENT_ITEMS_RS] = count($stored_assignments); if (empty($eligible_ids)) { $agent_count[ELIGIBLE_ITEMS_RS] = count($all_agents) - count($stored_assignments); } elseif ($eligible_ids != array(-1)) { foreach (array_keys($all_agents) as $_key) { $all_agent_ids[$all_agents[$_key]->ID] = true; } $eligible_ids = array_intersect_key($eligible_ids, $all_agent_ids); $agent_count[ELIGIBLE_ITEMS_RS] = count(array_diff_key($eligible_ids, $stored_assignments)); } else { $agent_count[ELIGIBLE_ITEMS_RS] = 0; } $default_hide_filtered_list = $default_hide_threshold && $agent_count[$agents_subset] > $default_hide_threshold; $checked = $agents_subset == CURRENT_ITEMS_RS ? $checked = "checked='checked'" : ''; // determine whether to show caption, show/hide checkbox and filter textbox $any_display_filtering = $agent_count[CURRENT_ITEMS_RS] > $filter_threshold || $agent_count[ELIGIBLE_ITEMS_RS] > $filter_threshold; if ($agent_count[$agents_subset] > $filter_threshold) { if (ROLE_BASIS_GROUPS == $role_basis) { $caption = CURRENT_ITEMS_RS == $agents_subset ? __('show current groups (%d)', 'scoper') : __('show eligible groups (%d)', 'scoper'); } else { $caption = CURRENT_ITEMS_RS == $agents_subset ? __('show current users (%d)', 'scoper') : __('show eligible users (%d)', 'scoper'); } $js_call = "agp_display_if('div_{$agents_subset}_{$id_prefix}', this.id);" . "agp_display_if('chk-links_{$agents_subset}_{$id_prefix}', this.id);"; $flt_checked = !$default_hide_filtered_list ? "checked='checked'" : ''; $ul_class = 'rs-agents-ul'; echo "<ul class='rs-list_horiz {$ul_class}'><li>"; // IE6 (at least) does not render label reliably without this echo "<input type='checkbox' name='rs-jscheck[]' value='validate_me_{$agents_subset}_{$id_prefix}' id='chk_{$agents_subset}_{$id_prefix}' {$flt_checked} onclick=\"{$js_call}\" {$ie_checkbox_style} /> "; echo "<strong><label for='chk_{$agents_subset}_{$id_prefix}'>"; printf($caption, $agent_count[$agents_subset]); echo '</label></strong>'; echo '</li>'; $class = $default_hide_filtered_list ? '' : 'class="agp_js_show"'; echo "\r\n" . "<li style='clear:both;'> <label for='flt_{$agents_subset}_{$id_prefix}' id='lbl_flt_{$id_prefix}'>"; _e('filter:', 'scoper'); $js_call = "agp_filter_ul('list_{$agents_subset}_{$id_prefix}', this.value, 'chk_{$agents_subset}_{$id_prefix}', 'chk-links_{$agents_subset}_{$id_prefix}');"; echo " <input type='text' id='flt_{$agents_subset}_{$id_prefix}' size='10' onkeyup=\"{$js_call}\" />"; echo "</label></li>"; echo "<li {$class} style='display:none;' id='chk-links_{$agents_subset}_{$id_prefix}'>"; $js_call = "agp_check_by_name('{$id_prefix}[]', true, true, false, 'list_{$agents_subset}_{$id_prefix}', 1);"; echo "\r\n" . " " . "<a href='javascript:void(0)' onclick=\"{$js_call}\">"; _e('select', 'scoper'); echo '</a> '; $js_call = "agp_check_by_name('{$id_prefix}[]', '', true, false, 'list_{$agents_subset}_{$id_prefix}', 1);"; echo "\r\n" . "<a href='javascript:void(0)' onclick=\"{$js_call}\">"; _e('unselect', 'scoper'); echo "</a>"; if ($propagation) { $js_call = "agp_check_by_name('p_{$id_prefix}[]', true, true, false, 'list_{$agents_subset}_{$id_prefix}', 1);"; echo "\r\n" . " " . "<a href='javascript:void(0)' onclick=\"{$js_call}\">"; _e('propagate', 'scoper'); echo '</a> '; $js_call = "agp_check_by_name('p_{$id_prefix}[]', '', true, false, 'list_{$agents_subset}_{$id_prefix}', 1);"; echo "\r\n" . "<a href='javascript:void(0)' onclick=\"{$js_call}\">"; _e('unpropagate', 'scoper'); echo "</a>"; } echo '</li></ul>'; } else { $ul_class = ''; if ($agent_count[$agents_subset]) { echo "<ul class='rs-list_horiz rs-agents_filter {$ul_class}'><li>"; if (ROLE_BASIS_GROUPS == $role_basis) { $caption = CURRENT_ITEMS_RS == $agents_subset ? __('current groups (%d):', 'scoper') : __('eligible groups (%d):', 'scoper'); } else { $caption = CURRENT_ITEMS_RS == $agents_subset ? __('current users (%d):', 'scoper') : __('eligible users (%d):', 'scoper'); } printf("<div class='rs-agents_caption'><strong>{$caption}</strong></div>", $agent_count[$agents_subset]); echo '</li></ul>'; } } $title = ''; if ($propagation) { if (!$otype_label_singular) { $otype_label_singular = __('object', 'scoper'); } if (!$otype_label) { $otype_label = __('objects', 'scoper'); } } if ($any_display_filtering || $agent_count[$agents_subset] > $emsize_threshold) { global $wp_locale; $rtl = isset($wp_locale) && 'rtl' == $wp_locale->text_direction; // -------- determine required list item width ----------- if ($caption_length_limit > 40) { $caption_length_limit = 40; } if ($caption_length_limit < 10) { $caption_length_limit = 10; } $longest_caption_length = 0; foreach ($all_agents as $agent) { $id = $agent->ID; if (is_array($for_entity_ids)) { $role_assigned = isset($for_entity_ids[$id]) || isset($for_children_ids[$id]); } else { $role_assigned = isset($stored_assignments[$id]); } switch ($agents_subset) { case CURRENT_ITEMS_RS: if (!$role_assigned) { continue 2; } break; default: //ELIGIBLE_ITEMS_RS if ($role_assigned) { continue 2; } if ($eligible_ids && !isset($eligible_ids[$id])) { continue 2; } } $caption = ROLE_BASIS_GROUPS == $role_basis && $agent->meta_id ? ScoperAdminLib::get_metagroup_name($agent->meta_id) : $agent->display_name; if ($role_assigned && !empty($stored_assignments[$id]['inherited_from'])) { $caption = $inherited_prefix . $caption . $inherited_suffix; } elseif (!$role_assigned && isset($via_other_basis_ids[$id])) { $caption = $via_other_basis_prefix . $caption . $via_other_basis_suffix; } elseif (isset($via_other_role_ids[$id])) { $caption = $via_other_role_prefix . $caption . $via_other_role_suffix; } elseif (isset($via_other_scope_ids[$id])) { $caption = $via_other_scope_prefix . $caption . $via_other_scope_suffix; } if (strlen($caption) > $longest_caption_length) { if (strlen($caption) >= $caption_length_limit) { $longest_caption_length = $caption_length_limit + 2; } else { $longest_caption_length = strlen($caption); } } } if ($longest_caption_length < 10) { $longest_caption_length = 10; } //if ( ! $ems_per_character = scoper_get_option('ems_per_character') ) if (defined('UI_EMS_PER_CHARACTER')) { $ems_per_character = UI_EMS_PER_CHARACTER; } else { $ems_per_character = 0.85; } $list_width_ems = $ems_per_character * $longest_caption_length; if ($propagation) { $list_width_ems = $list_width_ems + 1.0; } $ems_integer = intval($list_width_ems); $ems_half = $list_width_ems - $ems_integer >= 0.5 ? '_5' : ''; $ul_class = "rs-agents_list_{$ems_integer}{$ems_half}"; $hide_class = $default_hide_filtered_list && $agent_count[$agents_subset] > $filter_threshold ? 'class="agp_js_hide"' : ''; echo "\r\n" . "<div id='div_{$agents_subset}_{$id_prefix}' {$hide_class}>" . "<div class='rs-agents_emsized'>" . "<ul class='{$ul_class}' id='list_{$agents_subset}_{$id_prefix}'>"; } else { $ul_class = "rs-agents_list_auto"; echo "\r\n<ul class='{$ul_class}' id='list_{$agents_subset}_{$id_prefix}'>"; } //-------- end list item width determination -------------- $last_agents = array(); $last_agents_prop = array(); foreach ($all_agents as $agent) { $id = $agent->ID; $agent_display_name = ROLE_BASIS_GROUPS == $role_basis && $agent->meta_id ? ScoperAdminLib::get_metagroup_name($agent->meta_id) : $agent->display_name; if (is_array($for_entity_ids)) { $role_assigned = isset($for_entity_ids[$id]) || isset($for_children_ids[$id]); } else { $role_assigned = isset($stored_assignments[$id]); } switch ($agents_subset) { case CURRENT_ITEMS_RS: if (!$role_assigned) { continue 2; } break; default: //ELIGIBLE_ITEMS_RS if ($role_assigned) { continue 2; } if ($eligible_ids && !isset($eligible_ids[$id])) { continue 2; } } // markup for role duration / content date limits $title = ''; // we can't set the title because it's used by JS for onkey filtering $limit_class = ''; $link_class = ''; $limit_style = ''; if (isset($stored_assignments[$id])) { ScoperAdminUI::set_agent_formatting($stored_assignments[$id], $title, $limit_class, $link_class, $limit_style); } if ($title) { $any_date_limits = true; $label_title = " title='{$title}'"; } else { $label_title = ''; } $disabled = $locked_ids && isset($locked_ids[$id]) ? " disabled='disabled'" : ''; $li_title = "title=' " . agp_strtolower($agent_display_name) . " '"; if ($check_for_incomplete_submission && isset($_POST['scoper_error']) && isset($_POST[$id_prefix])) { $this_checked = in_array($id, $_POST[$id_prefix]) ? ' checked="checked"' : ''; } else { if ($role_assigned && (!is_array($for_entity_ids) || isset($for_entity_ids[$id]))) { $this_checked = ' checked="checked"'; } else { $this_checked = ''; } } if ($this_checked && !$suppress_last_agents) { $last_agents[] = $id; } if (isset($via_other_role_ids[$id])) { $label_class = " class='rs-via-r{$limit_class}'"; } elseif (!$role_assigned && isset($via_other_basis_ids[$id])) { $label_class = " class='rs-via-b{$limit_class}'"; } elseif (isset($via_other_scope_ids[$id])) { $label_class = " class='rs-via-s{$limit_class}'"; } elseif ($limit_class) { $label_class = " class='" . trim($limit_class) . "'"; } else { $label_class = ''; } echo "\r\n<li {$li_title}>" . "<input type='checkbox' name='{$id_prefix}[]'{$disabled}{$this_checked} value='{$id}' id='{$id_prefix}{$id}' {$ie_checkbox_style} />"; if ($propagation) { if ($check_for_incomplete_submission && isset($_POST['scoper_error']) && isset($_POST["p_{$id_prefix}"])) { $this_checked_prop = in_array($id, $_POST["p_{$id_prefix}"]) ? ' checked="checked"' : ''; } else { if (isset($for_children_ids[$id])) { $this_checked_prop = " checked='checked'"; } else { $this_checked_prop = ''; } } if ($this_checked_prop && !$suppress_last_agents) { $last_agents_prop[] = $id; } echo "{" . "<input type='checkbox' name='p_{$id_prefix}[]'{$disabled}{$this_checked_prop} value='{$id}' id='p_{$id_prefix}{$id}' {$ie_checkbox_style} />" . "}"; } echo "<label {$title} {$limit_style} for='{$id_prefix}{$id}'{$label_class}{$label_title}>"; $caption = $agent_display_name; if (strlen($caption) > $caption_length_limit) { if (!empty($rtl)) { $caption = '...' . substr($caption, strlen($caption) - $caption_length_limit); } else { $caption = substr($caption, 0, $caption_length_limit) . '...'; } } if ($role_assigned && !empty($stored_assignments[$id]['inherited_from'])) { $caption = $inherited_prefix . $caption . $inherited_suffix; $any_inherited = true; } elseif (isset($via_other_role_ids[$id])) { $caption = $via_other_role_prefix . $caption . $via_other_role_suffix; $any_other_role = true; } elseif (!$role_assigned && isset($via_other_basis_ids[$id])) { $caption = $via_other_basis_prefix . $caption . $via_other_basis_suffix; $any_other_basis = true; } elseif (isset($via_other_scope_ids[$id])) { $caption = $via_other_scope_prefix . $caption . $via_other_scope_suffix; $any_other_scope = true; } $caption = ' ' . $caption; echo $caption; // str_replace(' ', ' ', $caption); echo '</label></li>'; } //foreach agent echo "\r\n<li></li></ul>"; // prevent invalid markup if no other li's if (CURRENT_ITEMS_RS == $agents_subset) { $last_agents = implode("~", $last_agents); $last_agents_prop = implode("~", $last_agents_prop); echo "<input type=\"hidden\" id=\"last_{$id_prefix}\" name=\"last_{$id_prefix}\" value=\"{$last_agents}\" />"; echo "<input type=\"hidden\" id=\"last_p_{$id_prefix}\" name=\"last_p_{$id_prefix}\" value=\"{$last_agents_prop}\" />"; } if ($any_display_filtering || $agent_count[$agents_subset] > $emsize_threshold) { echo '</div></div>'; } // display key if ($any_inherited && $inherited_prefix) { $key['inherited'] = "{$inherited_prefix} {$inherited_suffix}" . '<span class="rs-keytext">' . sprintf(__('inherited from parent %s', 'scoper'), agp_strtolower($otype_label_singular)) . '</span>'; } if ($any_other_role && $via_other_role_prefix) { $key['other_role'] = "<span class='rs-via-r'>{$via_other_role_prefix} {$via_other_role_suffix}" . '<span class="rs-keytext">' . str_replace(' ', ' ', __('has via other role', 'scoper')) . '</span></span>'; } if ($any_other_basis && $via_other_basis_prefix) { $key['other_basis'] = "<span class='rs-via-b'>{$via_other_basis_prefix} {$via_other_basis_suffix}" . '<span class="rs-keytext">' . str_replace(' ', ' ', __('has via group', 'scoper')) . '</span></span>'; } if ($any_other_scope && $via_other_scope_prefix) { $key['other_scope'] = "<span class='rs-via-s'>{$via_other_scope_prefix} {$via_other_scope_suffix}" . '<span class="rs-keytext">' . str_replace(' ', ' ', __('has via other scope', 'scoper')) . '</span></span>'; } if ($propagation) { $key['propagation'] = "{<input type='checkbox' disabled='disabled' name='rs-prop_key_{$agents_subset}_{$id_prefix}' id='rs-prop_key_{$agents_subset}_{$id_prefix}' style='vertical-align:middle' />}" . '<span class="rs-keytext">' . sprintf(__('propagate to sub-%s', 'scoper'), agp_strtolower($otype_label)) . '</span>'; } if ($any_date_limits && !empty($object_id)) { if (empty($GLOBALS['post']) || 'auto-draft' != $GLOBALS['post']->post_status) { //don't display link for auto-drafts $action_links['limits'] = sprintf(__('%1$sEdit date limits%2$s', 'scoper'), "<a href='admin.php?page=rs-{$object_type}-roles#item-{$object_id}'>", '</a>'); } } }
function display_ui_user_roles($user, $groups_only = false) { global $scoper; $blog_roles = array(); $term_roles = array(); $blog_roles = $user->get_blog_roles_daterange('rs', array('include_role_duration_key' => true, 'enforce_duration_limits' => false)); // arg: return array with additional key dimension for role duration // for Administrators, display any custom post General Roles which were auto-assigned to maintain default editing rights global $current_rs_user; if ($current_rs_user->ID == $user->ID) { if (is_content_administrator_rs()) { $blog_roles[''][''] = isset($blog_roles['']['']) ? array_merge($current_rs_user->assigned_blog_roles['']) : $current_rs_user->assigned_blog_roles['']; } } foreach ($this->scoper->taxonomies->get_all() as $taxonomy => $tx) { $term_roles[$taxonomy] = $user->get_term_roles_daterange($taxonomy, 'rs', array('include_role_duration_key' => true, 'enforce_duration_limits' => false)); } // arg: return array with additional key dimension for role duration $duration_limits_enabled = scoper_get_option('role_duration_limits'); $content_date_limits_enabled = scoper_get_option('role_content_date_limits'); $html = ''; if ($groups_only) { if (IS_MU_RS && scoper_get_option('mu_sitewide_groups', true)) { global $blog_id; $list = scoper_get_blog_list(0, 'all'); $blog_path = ''; foreach ($list as $blog) { if ($blog['blog_id'] == $blog_id) { $blog_path = $blog['path']; break; } } $group_caption = sprintf(__('Group Roles %1$s(for %2$s)%3$s', 'scoper'), '<span style="font-weight: normal">', rtrim($blog_path, '/'), '</span>'); } else { $group_caption = __('Group Roles', 'scoper'); } } else { $html .= "<div id='userprofile_rolesdiv_rs' class='rs-scoped_role_profile'>"; $html .= "<h3>" . __('Scoped Roles', 'scoper') . "</h3>"; $wp_blog_roles = array_intersect_key($user->assigned_blog_roles[''], $scoper->role_defs->get_matching('wp')); if (!empty($wp_blog_roles)) { $display_names = array(); foreach (array_keys($wp_blog_roles) as $role_handle) { $display_names[] = $scoper->role_defs->get_display_name($role_handle); } $html .= sprintf(__("<strong>Assigned WordPress Role:</strong> %s", 'scoper'), implode(", ", $display_names)); if ($contained_roles = $this->scoper->role_defs->get_contained_roles(array_keys($wp_blog_roles), false, 'rs')) { $display_names = array(); foreach (array_keys($contained_roles) as $role_handle) { $display_names[] = $this->scoper->role_defs->get_display_name($role_handle); } $html .= '<br /><span class="rs-gray">'; $html .= sprintf(__("(contains %s)", 'scoper'), implode(", ", $display_names)); $html .= '</span>'; } } $html .= '<br /><br />'; } $display_names = array(); foreach (array_keys($blog_roles) as $duration_key) { if (is_serialized($duration_key)) { $role_date_limits = unserialize($duration_key); $role_date_limits->date_limited = true; } else { $role_date_limits = array(); } foreach (array_keys($blog_roles[$duration_key]) as $date_key) { $display_names = array(); if (is_serialized($date_key)) { $content_date_limits = unserialize($date_key); $content_date_limits->content_date_limited = true; } else { $content_date_limits = array(); } $date_caption = ''; if ($role_date_limits || $content_date_limits) { $limit_class = ''; // unused byref arg $limit_style = ''; // unused byref arg $link_class = ''; // unused byref arg ScoperAdminUI::set_agent_formatting(array_merge((array) $role_date_limits, (array) $content_date_limits), $date_caption, $limit_class, $link_class, $limit_style, false); // arg: no title='' wrapper around date_caption $date_caption = '<span class="rs-gray"> ' . trim($date_caption) . '</span>'; } if ($rs_blog_roles = $this->scoper->role_defs->filter($blog_roles[$duration_key][$date_key], array('role_type' => 'rs'))) { foreach (array_keys($rs_blog_roles) as $role_handle) { $display_names[] = $this->scoper->role_defs->get_display_name($role_handle); } $url = "admin.php?page=rs-general_roles"; $linkopen = "<strong><a href='{$url}'>"; $linkclose = "</a></strong>"; $list = implode(", ", $display_names); if ($groups_only) { $html .= sprintf(_n('<strong>%1$sGeneral Role%2$s</strong>%4$s: %3$s', '<strong>%1$sGeneral Roles%2$s</strong>%4$s: %3$s', count($display_names), 'scoper'), $linkopen, $linkclose, $list, $date_caption); } else { $html .= sprintf(_n('<strong>Additional %1$sGeneral Role%2$s</strong>%4$s: %3$s', '<strong>Additional %1$sGeneral Roles%2$s</strong>%4$s: %3$s', count($display_names), 'scoper'), $linkopen, $linkclose, $list, $date_caption); } if ($contained_roles = $this->scoper->role_defs->get_contained_roles(array_keys($rs_blog_roles), false, 'rs')) { $display_names = array(); foreach (array_keys($contained_roles) as $role_handle) { $display_names[] = $this->scoper->role_defs->get_display_name($role_handle); } $html .= '<br /><span class="rs-gray">'; $html .= sprintf(__("(contains %s)", 'scoper'), implode(", ", $display_names)); $html .= '</span>'; } $html .= '<br /><br />'; } } // end foreach content date range } // end foreach role duration date range $disable_role_admin = false; global $profileuser; $viewing_own_profile = !empty($profileuser) && $profileuser->ID == $current_rs_user->ID; if (!$viewing_own_profile) { if ($require_blogwide_editor = scoper_get_option('role_admin_blogwide_editor_only')) { if ('admin' == $require_blogwide_editor && !is_user_administrator_rs()) { return false; } if ('admin_content' == $require_blogwide_editor && !is_content_administrator_rs()) { return false; } $disable_role_admin = !$scoper->user_can_edit_blogwide('post', '', array('require_others_cap' => true, 'status' => 'publish')); } } foreach ($this->scoper->taxonomies->get_all() as $taxonomy => $tx) { if (empty($term_roles[$taxonomy])) { continue; } $val = ORDERBY_HIERARCHY_RS; $args = array('order_by' => $val); if (!($terms = $this->scoper->get_terms($taxonomy, UNFILTERED_RS, COLS_ALL_RS, 0, $args))) { continue; } $object_types = array(); $obj_src = $this->scoper->data_sources->get($tx->object_source); if (!$obj_src || !is_array($obj_src->object_types)) { continue; } foreach (array_keys($obj_src->object_types) as $object_type) { if (scoper_get_otype_option('use_term_roles', $tx->object_source, $object_type)) { $object_types[] = $object_type; } } if (!$object_types) { continue; } $object_types[] = $taxonomy; $admin_terms = $disable_role_admin ? array() : $this->scoper->get_terms($taxonomy, ADMIN_TERMS_FILTER_RS, COL_ID_RS); $strict_terms = $this->scoper->get_restrictions(TERM_SCOPE_RS, $taxonomy); $role_defs = $this->scoper->role_defs->get_matching('rs', $tx->object_source, $object_types); $tx_src = $this->scoper->data_sources->get($tx->source); $col_id = $tx_src->cols->id; $col_name = $tx_src->cols->name; $term_names = array(); foreach ($terms as $term) { $term_names[$term->{$col_id}] = $term->{$col_name}; } foreach (array_keys($term_roles[$taxonomy]) as $duration_key) { if (is_serialized($duration_key)) { $role_date_limits = unserialize($duration_key); $role_date_limits->date_limited = true; } else { $role_date_limits = array(); } foreach (array_keys($term_roles[$taxonomy][$duration_key]) as $date_key) { if (is_serialized($date_key)) { $content_date_limits = unserialize($date_key); $content_date_limits->content_date_limited = true; } else { $content_date_limits = array(); } $title = ''; $date_caption = ''; $limit_class = ''; $limit_style = ''; $link_class = ''; $style = ''; if ($role_date_limits || $content_date_limits) { ScoperAdminUI::set_agent_formatting(array_merge((array) $role_date_limits, (array) $content_date_limits), $date_caption, $limit_class, $link_class, $limit_style); $title = "title='{$date_caption}'"; $date_caption = '<span class="rs-gray"> ' . trim($date_caption) . '</span>'; } if ($admin_terms) { $url = "admin.php?page=rs-{$taxonomy}-roles_t"; //$html .= ("\n<h4><a href='$url'>" . sprintf(_ x('%1$s Roles%2$s:', 'Category Roles, content date range', 'scoper'), $tx->display_name, '</a><span style="font-weight:normal">' . $date_caption) . '</span></h4>' ); $html .= "\n<h4><a href='{$url}'>" . sprintf(__('%1$s Roles%2$s:', 'scoper'), $tx->labels->singular_name, '</a><span style="font-weight:normal">' . $date_caption) . '</span></h4>'; } else { $html .= "\n<h4>" . sprintf(__('%1$s Roles%2$s:', 'scoper'), $tx->labels->singular_name, $date_caption) . '</h4>'; } //$html .= ("\n<h4>" . sprintf(_ x('%1$s Roles%2$s:', 'Category Roles, content date range', 'scoper'), $tx->display_name, $date_caption) . '</h4>' ); $html .= '<ul class="rs-termlist" style="padding-left:0.1em;">'; $html .= '<li>'; $html .= '<table class="widefat"><thead><tr class="thead">'; $html .= '<th class="rs-tightcol">' . __awp('Role') . '</th>'; $html .= '<th>' . $tx->labels->name . '</th>'; $html .= '</tr></thead><tbody>'; foreach (array_keys($role_defs) as $role_handle) { if (isset($term_roles[$taxonomy][$duration_key][$date_key][$role_handle])) { $role_terms = $term_roles[$taxonomy][$duration_key][$date_key][$role_handle]; $role_display = $this->scoper->role_defs->get_display_name($role_handle); $term_role_list = array(); foreach ($role_terms as $term_id) { if (!in_array($term_id, $admin_terms)) { $term_role_list[] = $term_names[$term_id]; } elseif (isset($strict_terms['restrictions'][$role_handle][$term_id]) || isset($strict_terms['unrestrictions'][$role_handle]) && is_array($strict_terms['unrestrictions'][$role_handle]) && !isset($strict_terms['unrestrictions'][$role_handle][$term_id])) { $term_role_list[] = "<span class='rs-backylw'><a {$title}{$limit_style}class='{$link_class}{$limit_class}' href='{$url}#item-{$term_id}'>" . $term_names[$term_id] . '</a></span>'; } else { $term_role_list[] = "<a {$title}{$limit_style}class='{$link_class}{$limit_class}' href='{$url}#item-{$term_id}'>" . $term_names[$term_id] . '</a>'; } } $html .= "\r\n" . "<tr{$style}>" . "<td>" . str_replace(' ', ' ', $role_display) . "</td>" . '<td>' . implode(', ', $term_role_list) . '</td>' . "</tr>"; $style = ' class="alternate"' == $style ? ' class="rs-backwhite"' : ' class="alternate"'; } } $html .= '</tbody></table>'; $html .= '</li></ul><br />'; } // end foreach content date range } // end foreach role duration date range } // end foreach taxonomy require_once dirname(__FILE__) . '/object_roles_list.php'; $html .= scoper_object_roles_list($user, array('enforce_duration_limits' => false, 'is_user_profile' => $viewing_own_profile, 'echo' => false)); if ($groups_only) { //if ( empty($rs_blog_roles) && empty($term_role_list) && empty($got_obj_roles) ) if ($html) { echo '<div>'; echo "<h3>{$group_caption}</h3>"; echo $html; echo '</div>'; if (IS_MU_RS) { echo '<br /><hr /><br />'; } } //echo '<p>' . __('No roles are assigned to this group.', 'scoper'), '</p>'; } else { echo $html; echo '</div>'; } }
function role_assignment_list($roles, $agent_names, $checkbox_base_id = '', $role_basis = 'user') { $agent_grouping = array(); $agent_list = array(); $role_propagated = array(); if (!$checkbox_base_id) { $link_end = ''; } $date_limits = array(); // This would sort entire list (currently grouping by assign_for and alphabetizing each grouping) //$sorted_roles = array(); //uasort($agent_names, 'strnatcasecmp'); //foreach ( $agent_names as $agent_id => $agent_name ) // $sorted_roles[$agent_id] = $roles[$agent_id]; foreach ($roles as $agent_id => $val) { if ($limitation_type = $val['date_limited'] + 2 * $val['content_date_limited']) { $date_limits[$agent_id] = $val; } if (is_array($val) && !empty($val['inherited_from'])) { $role_propagated[$agent_id] = true; } if (is_array($val) && 'both' == $val['assign_for']) { $agent_grouping[$limitation_type][ASSIGN_FOR_BOTH_RS][$agent_id] = $agent_names[$agent_id]; } elseif (is_array($val) && 'children' == $val['assign_for']) { $agent_grouping[$limitation_type][ASSIGN_FOR_CHILDREN_RS][$agent_id] = $agent_names[$agent_id]; } else { $agent_grouping[$limitation_type][ASSIGN_FOR_ENTITY_RS][$agent_id] = $agent_names[$agent_id]; } } // display for_entity assignments first, then for_both, then for_children $assign_for_order = array('entity', 'both', 'children'); $use_agents_csv = scoper_get_option("{$role_basis}_role_assignment_csv"); foreach (array_keys($agent_grouping) as $limitation_type) { foreach ($assign_for_order as $assign_for) { if (!isset($agent_grouping[$limitation_type][$assign_for])) { continue; } // sort each assign_for grouping alphabetically uasort($agent_grouping[$limitation_type][$assign_for], 'strnatcasecmp'); foreach ($agent_grouping[$limitation_type][$assign_for] as $agent_id => $agent_name) { // surround rolename with bars to indicated it was inherited $pfx = isset($role_propagated[$agent_id]) ? '{' : ''; $sfx = ''; if ($checkbox_base_id) { if ($use_agents_csv) { $js_call = "agp_append('{$role_basis}_csv', ', {$agent_name}');"; } else { $js_call = "agp_check_it('{$checkbox_base_id}{$agent_id}');"; } $link_end = " href='javascript:void(0)' onclick=\"{$js_call}\">"; $sfx = '</a>'; } // surround rolename with braces to indicated it was inherited if ($pfx) { $sfx .= '}'; } $limit_class = ''; $limit_style = ''; $link_class = 'rs-link_plain'; $title_text = ''; if ($limitation_type) { ScoperAdminUI::set_agent_formatting($date_limits[$agent_id], $title_text, $limit_class, $link_class, $limit_style); $title = "title='{$title_text}'"; } else { $title = "title='select'"; } switch ($assign_for) { case ASSIGN_FOR_BOTH_RS: //roles which are assigned for entity and children will be bolded in list $link = $link_end ? "<a {$title}{$limit_style}class='{$link_class}{$limit_class}'" . $link_end : ''; $agent_list[$limitation_type][ASSIGN_FOR_BOTH_RS][$agent_id] = $pfx . $link . $agent_name . $sfx; break; case ASSIGN_FOR_CHILDREN_RS: //roles with are assigned only to children will be grayed $link = $link_end ? "<a {$title}{$limit_style}class='{$link_class} rs-gray{$limit_class}'" . $link_end : ''; $agent_list[$limitation_type][ASSIGN_FOR_CHILDREN_RS][$agent_id] = $pfx . "<span class='rs-gray'>" . $link . $agent_names[$agent_id] . $sfx . '</span>'; break; case ASSIGN_FOR_ENTITY_RS: $link = $link_end ? "<a {$title}{$limit_style}class='{$link_class}{$limit_class}'" . $link_end : ''; $agent_list[$limitation_type][ASSIGN_FOR_ENTITY_RS][$agent_id] = $pfx . $link . $agent_names[$agent_id] . $sfx; } } // end foreach agents $agent_list[$limitation_type][$assign_for] = implode(', ', $agent_list[$limitation_type][$assign_for]); if (ASSIGN_FOR_ENTITY_RS != $assign_for) { $agent_list[$limitation_type][$assign_for] = "<span class='rs-bold'>" . $agent_list[$limitation_type][$assign_for] . '</span>'; } } // end foreach assign_for $agent_list[$limitation_type] = implode(', ', $agent_list[$limitation_type]); } if ($agent_list) { return implode(', ', $agent_list); } }