Example #1
0
function _pp_sseo_groups($group_labels)
{
    $group_labels = array();
    $groups = pp_get_groups('pp_group', array('skip_meta_types' => array('wp_role')));
    foreach ($groups as $group) {
        $group_labels[$group->ID] = $group->name;
    }
    return $group_labels;
}
 function load_exceptions($via_item_source, $for_item_source, $via_item_type, $item_id, $args = array())
 {
     global $wpdb, $wp_roles;
     $this->loaded_item_id = $item_id;
     if (!isset($this->current_exceptions)) {
         $this->current_exceptions = array();
         $this->agent_info = array();
     }
     $args = array_merge(compact('for_item_source', 'item_id'), array('for_item_type' => '', 'for_item_status' => ''), $args, array('cols' => 'e.agent_type, e.agent_id, e.operation, e.mod_type, i.eitem_id, i.assign_for', 'return_raw_results' => true, 'inherited_from' => '', 'assign_for' => '', 'hierarchical' => false));
     $for_item_type = isset($args['for_item_type']) ? $args['for_item_type'] : $via_item_type;
     extract($args, EXTR_SKIP);
     if ('term' == $via_item_source && !$for_item_type) {
         unset($args['for_item_source']);
         $args['post_types'] = array('');
     }
     //if ( 'term' == $for_item_source )
     $args['cols'] .= ', e.for_item_type';
     if (!empty($agent_type)) {
         $agents_by_type = array($agent_type => array());
     } else {
         $agents_by_type = array();
     }
     $exc = ppc_get_exceptions($args);
     foreach ($exc as $row) {
         pp_set_array_elem($this->current_exceptions, array($row->for_item_type, $row->operation, $row->agent_type, $row->agent_id, $row->assign_for, $row->mod_type));
         $this->current_exceptions[$row->for_item_type][$row->operation][$row->agent_type][$row->agent_id][$row->assign_for][$row->mod_type] = $row->eitem_id;
         if (!isset($agents_by_type[$row->agent_type])) {
             $agents_by_type[$row->agent_type] = array();
         }
         $agents_by_type[$row->agent_type][] = $row->agent_id;
     }
     foreach (array_keys($agents_by_type) as $agent_type) {
         $agents_by_type[$agent_type] = array_unique($agents_by_type[$agent_type]);
         $ids = $agents_by_type[$agent_type];
         if (!empty($agent_id)) {
             $ids = array_merge($ids, (array) $agent_id);
         }
         // ajax passes in specific id(s)
         if ('user' == $agent_type) {
             $this->agent_info['user'] = $wpdb->get_results("SELECT ID, user_login as name, display_name FROM {$wpdb->users} WHERE ID IN ('" . implode("','", array_map('intval', $ids)) . "') ORDER BY user_login", OBJECT_K);
         } elseif ('pp_group' != $agent_type) {
             $args = array('ids' => $ids);
             $this->agent_info[$agent_type] = pp_get_groups($agent_type, $args);
         }
     }
     // retrieve info for all WP roles regardless of exception storage
     $_args = array('cols' => "ID, group_name AS name, metagroup_type, metagroup_id");
     if (!empty($agent_id)) {
         // ajax usage
         $_args['ids'] = (array) $agent_id;
     } else {
         $_where = isset($agents_by_type['pp_group']) ? "ID IN ('" . implode("','", $agents_by_type['pp_group']) . "')" : "  metagroup_type != 'wp_role'";
         if (!($pp_only_roles = pp_get_option('supplemental_role_defs'))) {
             $pp_only_roles = array();
         }
         $_args['where'] = " AND ( {$_where} OR ( metagroup_type = 'wp_role' AND metagroup_id NOT IN ('" . implode("','", $pp_only_roles) . "') ) )";
     }
     $this->agent_info['pp_group'] = pp_get_groups('pp_group', $_args);
     $this->agent_info['wp_role'] = array();
     // rekey WP role exceptions
     foreach ($this->agent_info['pp_group'] as $agent_id => $group) {
         if ('wp_role' == $group->metagroup_type) {
             /*
             if ( 'wp_anon' == $group->metagroup_id ) {
             	unset( $this->agent_info['pp_group'][$agent_id] );
             	continue;
             }
             */
             $this->agent_info['wp_role'][$agent_id] = (object) $this->agent_info['pp_group'][$agent_id];
             if ($role_exists = isset($wp_roles->role_names[$group->metagroup_id])) {
                 $this->agent_info['wp_role'][$agent_id]->name = $wp_roles->role_names[$group->metagroup_id];
             }
             unset($this->agent_info['pp_group'][$agent_id]);
             if ($role_exists || in_array($group->metagroup_id, array('wp_anon', 'wp_all', 'wp_auth'))) {
                 foreach (array_keys($this->current_exceptions) as $for_item_type) {
                     foreach (array_keys($this->current_exceptions[$for_item_type]) as $op) {
                         if (isset($this->current_exceptions[$for_item_type][$op]['pp_group'][$agent_id])) {
                             $this->current_exceptions[$for_item_type][$op]['wp_role'][$agent_id] = (array) $this->current_exceptions[$for_item_type][$op]['pp_group'][$agent_id];
                             unset($this->current_exceptions[$for_item_type][$op]['pp_group'][$agent_id]);
                         }
                     }
                 }
             }
         }
     }
     // don't include orphaned assignments in metabox tab count
     foreach (array_keys($this->current_exceptions) as $for_item_type) {
         foreach (array_keys($this->current_exceptions[$for_item_type]) as $op) {
             foreach (array_keys($this->current_exceptions[$for_item_type][$op]) as $agent_type) {
                 $this->current_exceptions[$for_item_type][$op][$agent_type] = array_intersect_key($this->current_exceptions[$for_item_type][$op][$agent_type], $this->agent_info[$agent_type]);
             }
         }
     }
     // determine if inclusions are set for any agents
     $where = 'term' == $via_item_source ? "AND e.via_item_type = '{$via_item_type}'" : '';
     $where .= 'term' == $via_item_source ? '' : " AND e.for_item_source = '{$for_item_source}'";
     $query_users = isset($this->agent_info['user']) ? array_keys($this->agent_info['user']) : array();
     if (!empty($args['agent_type']) && 'user' == $args['agent_type'] && !empty($args['agent_id'])) {
         $query_users = array_merge($query_users, (array) $args['agent_id']);
     }
     $user_clause = $query_users ? "OR ( e.agent_type = 'user' AND e.agent_id IN ('" . implode("','", $query_users) . "') )" : '';
     //$agents_clause = "( ( e.agent_type = 'pp_group' AND e.agent_id IN ('" . implode( "','", array_keys($this->agent_info['wp_role']) ) . "') ) $user_clause )";
     $agents_clause = "( ( e.agent_type = 'pp_group' ) {$user_clause} )";
     $_assignment_modes = $hierarchical ? array('item', 'children') : array('item');
     // Populate only for wp roles, groups and users with stored exceptions.  Will query for additional individual users as needed.
     foreach ($_assignment_modes as $_assign_for) {
         $results = $wpdb->get_results("SELECT DISTINCT e.agent_type, e.agent_id, e.operation, e.for_item_type FROM {$wpdb->ppc_exceptions} AS e INNER JOIN {$wpdb->ppc_exception_items} AS i ON e.exception_id = i.exception_id WHERE {$agents_clause} AND i.assign_for = '{$_assign_for}' AND e.mod_type = 'include' {$where}");
         foreach ($results as $row) {
             //$_agent_type = ( 'pp_group' == $row->agent_type ) ? 'wp_role' : $row->agent_type;
             if ('pp_group' == $row->agent_type && in_array($row->agent_id, array_keys($this->agent_info['wp_role']))) {
                 $_agent_type = 'wp_role';
             } else {
                 $_agent_type = $row->agent_type;
             }
             pp_set_array_elem($this->inclusions_active, array($row->for_item_type, $row->operation, $_agent_type, $row->agent_id, $_assign_for));
             $this->inclusions_active[$row->for_item_type][$row->operation][$_agent_type][$row->agent_id][$_assign_for] = true;
         }
     }
 }
Example #3
0
                $omit_users = $wpdb->get_col("SELECT u.ID FROM {$wpdb->users} AS u INNER JOIN {$wpdb->pp_group_members} AS gm ON u.ID = gm.user_id INNER JOIN {$wpdb->pp_groups} AS g ON gm.group_id = g.ID WHERE g.metagroup_type = 'wp_role' AND g.metagroup_id IN ('{$role_csv}')");
            }
        }
        foreach ($results as $row) {
            if (!in_array($row->ID, $omit_users)) {
                if (defined('PP_USER_RESULTS_DISPLAY_NAME')) {
                    $title = $row->user_login != $row->display_name ? " title='" . esc_attr($row->user_login) . "'" : '';
                    echo "<option value='{$row->ID}' class='pp-new-selection'{$title}>{$row->display_name}</option>";
                } else {
                    $title = $row->user_login != $row->display_name ? " title='" . esc_attr($row->display_name) . "'" : '';
                    echo "<option value='{$row->ID}' class='pp-new-selection'{$title}>{$row->user_login}</option>";
                }
            }
        }
    }
} else {
    $reqd_caps = apply_filters('pp_edit_groups_reqd_caps', array('pp_edit_groups'));
    // determine all currently stored groups (of any status) for user in question (not necessarily logged user)
    if (!empty($agent_id)) {
        $omit_groups = pp_get_groups_for_user($agent_id, $agent_type, array('status' => 'any'));
    } else {
        $omit_groups = array();
    }
    if ($groups = pp_get_groups($agent_type, array('filtering' => true, 'include_norole_groups' => false, 'reqd_caps' => $reqd_caps, 'search' => $search_str))) {
        foreach ($groups as $row) {
            if ((empty($row->metagroup_id) || is_null($row->metagroup_id)) && !isset($omit_groups[$row->ID])) {
                echo "<option value='{$row->ID}'>{$row->name}</option>";
            }
        }
    }
}
Example #4
0
 public static function flt_users_custom_column($content = '', $column_name, $id)
 {
     switch ($column_name) {
         case 'pp_groups':
             global $wp_list_table;
             //if ( ! $agent_type = apply_filters( 'pp_query_group_type', '' ) )
             //	$agent_type = 'pp_group';
             static $all_groups;
             static $all_group_types;
             if (!isset($all_groups)) {
                 $all_groups = array();
                 $all_group_types = pp_get_group_types(array('editable' => true));
             }
             $all_group_names = array();
             foreach ($all_group_types as $agent_type) {
                 if (!isset($all_groups[$agent_type])) {
                     $all_groups[$agent_type] = pp_get_groups($agent_type);
                 }
                 if (empty($all_groups[$agent_type])) {
                     continue;
                 }
                 $group_names = array();
                 if ($group_ids = pp_get_groups_for_user($id, $agent_type, array('cols' => 'id', 'query_user_ids' => array_keys($wp_list_table->items)))) {
                     foreach (array_keys($group_ids) as $group_id) {
                         if (isset($all_groups[$agent_type][$group_id])) {
                             if (empty($all_groups[$agent_type][$group_id]->metagroup_type) || 'wp_role' != $all_groups[$agent_type][$group_id]->metagroup_type) {
                                 $group_names[$all_groups[$agent_type][$group_id]->name] = $group_id;
                             }
                         }
                     }
                     if ($group_names) {
                         uksort($group_names, "strnatcasecmp");
                         foreach ($group_names as $name => $_id) {
                             if (defined('PP_USERS_UI_GROUP_FILTER_LINK')) {
                                 $url = add_query_arg('pp_group', $_id, $_SERVER['REQUEST_URI']);
                                 $all_group_names[] = "<a href='{$url}'>{$name}</a>";
                             } else {
                                 $all_group_names[] = "<a href='" . "admin.php?page=pp-edit-permissions&amp;action=edit&amp;agent_type={$agent_type}&amp;agent_id={$_id}'>{$name}</a>";
                             }
                         }
                         //$group_names = array_merge( $group_names, $this_group_names );
                     }
                 }
             }
             return implode(", ", $all_group_names);
             break;
         case 'pp_roles':
             global $wp_list_table, $wp_roles;
             static $role_info;
             $role_str = '';
             if (!isset($role_info)) {
                 $role_info = ppc_count_assigned_roles('user', array('query_agent_ids' => array_keys($wp_list_table->items)));
             }
             $user_object = new WP_User((int) $id);
             static $hide_roles;
             if (!isset($hide_roles)) {
                 $hide_roles = !defined('bbp_get_version') ? array('bbp_participant', 'bbp_moderator', 'bbp_keymaster', 'bbp_blocked', 'bbp_spectator') : array();
                 $hide_roles = apply_filters('pp_hide_roles', $hide_roles);
             }
             $user_object->roles = array_diff($user_object->roles, $hide_roles);
             $role_titles = array();
             foreach ($user_object->roles as $role_name) {
                 if (isset($wp_roles->role_names[$role_name])) {
                     $role_titles[] = $wp_roles->role_names[$role_name];
                 }
             }
             if (isset($role_info[$id]) && isset($role_info[$id]['roles'])) {
                 $role_titles = array_merge($role_titles, array_keys($role_info[$id]['roles']));
             }
             $display_limit = 3;
             if (count($role_titles) > $display_limit) {
                 $excess = count($role_titles) - $display_limit;
                 $role_titles = array_slice($role_titles, 0, $display_limit);
                 $role_titles[] = sprintf(__('%s&nbsp;more', 'pp'), $excess);
             }
             $role_str = '<span class="pp-group-site-roles">' . implode(', ', $role_titles) . '</span>';
             if (current_user_can('edit_user', $id) && current_user_can('pp_assign_roles')) {
                 $edit_link = "admin.php?page=pp-edit-permissions&amp;action=edit&amp;agent_id={$id}&amp;agent_type=user";
                 $role_str = "<a href=\"{$edit_link}\">{$role_str}</a><br />";
             }
             return $role_str;
             break;
         case 'pp_exceptions':
             global $wp_list_table;
             return ppc_list_agent_exceptions('user', $id, array('query_agent_ids' => array_keys($wp_list_table->items)));
             break;
         default:
             return $content;
     }
 }
Example #5
0
function pp_nav_menu_item_group_meta_box($object, $post_type)
{
    global $_nav_menu_placeholder, $nav_menu_selected_id;
    $post_type_name = $post_type['args']->name;
    // paginate browsing for large numbers of post objects
    $per_page = 50;
    $pagenum = isset($_REQUEST[$post_type_name . '-tab']) && isset($_REQUEST['paged']) ? absint($_REQUEST['paged']) : 1;
    $offset = 0 < $pagenum ? $per_page * ($pagenum - 1) : 0;
    $args = array('offset' => $offset, 'order' => 'ASC', 'orderby' => 'title', 'posts_per_page' => $per_page, 'post_type' => $post_type_name, 'suppress_filters' => true, 'update_post_term_cache' => false, 'update_post_meta_cache' => false);
    if ('attachment' == $post_type_name) {
        $args['post_status'] = 'inherit';
    }
    /*
    if ( isset( $post_type['args']->_default_query ) )
    	$args = array_merge($args, (array) $post_type['args']->_default_query );
    
    $get_posts = new WP_Query;
    $posts = $get_posts->query( $args );
    if ( ! $get_posts->post_count ) {
    */
    if (!($posts = pp_get_groups($post_type_name))) {
        echo '<p>' . __('No items.') . '</p>';
        return;
    }
    //$post_type_object = get_post_type_object($post_type_name);
    $post_type_object = pp_get_group_type_object($post_type_name);
    //$num_pages = $get_posts->max_num_pages;
    $num_pages = 1;
    $page_links = paginate_links(array('base' => add_query_arg(array($post_type_name . '-tab' => 'all', 'paged' => '%#%', 'item-type' => 'post_type', 'item-object' => $post_type_name)), 'format' => '', 'prev_text' => __('&laquo;'), 'next_text' => __('&raquo;'), 'total' => $num_pages, 'current' => $pagenum));
    if (!$posts) {
        $error = '<li id="error">' . $post_type['args']->labels->not_found . '</li>';
    }
    $db_fields = false;
    /*
    if ( is_post_type_hierarchical( $post_type_name ) ) {
    	$db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' );
    }
    */
    $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    $walker = new PP_Walker_Nav_Menu_Checklist($db_fields);
    $current_tab = 'most-recent';
    if (isset($_REQUEST[$post_type_name . '-tab']) && in_array($_REQUEST[$post_type_name . '-tab'], array('all', 'search'))) {
        $current_tab = pp_sanitize_key($_REQUEST[$post_type_name . '-tab']);
    }
    /*
    if ( ! empty( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) {
    	$current_tab = 'search';
    }
    */
    $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce');
    ?>
	<div id="posttype-<?php 
    echo $post_type_name;
    ?>
" class="posttypediv">
		<ul id="posttype-<?php 
    echo $post_type_name;
    ?>
-tabs" class="posttype-tabs add-menu-item-tabs">
			<li <?php 
    echo 'most-recent' == $current_tab ? ' class="tabs"' : '';
    ?>
><a class="nav-tab-link" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args)));
    }
    ?>
#tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>
-most-recent"><?php 
    _e('Most Recent');
    ?>
</a></li>
			<li <?php 
    echo 'all' == $current_tab ? ' class="tabs"' : '';
    ?>
><a class="nav-tab-link" href="<?php 
    if ($nav_menu_selected_id) {
        echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args)));
    }
    ?>
#<?php 
    echo $post_type_name;
    ?>
-all"><?php 
    _e('View All');
    ?>
</a></li>
			<!-- <li -search </li> -->
		</ul>

		<div id="tabs-panel-posttype-<?php 
    echo $post_type_name;
    ?>
-most-recent" class="tabs-panel <?php 
    echo 'most-recent' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>
">
			<ul id="<?php 
    echo $post_type_name;
    ?>
checklist-most-recent" class="categorychecklist form-no-clear">
				<?php 
    //$recent_args = array_merge( $args, array( 'orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15 ) );
    //$most_recent = $get_posts->query( $recent_args );
    $_args = array('skip_meta_types' => 'wp_role', 'order_by' => 'ug.add_date_gmt DESC');
    global $wpdb;
    $groups_table = apply_filters('pp_use_groups_table', $wpdb->pp_groups, $post_type_name);
    $group_members_table = apply_filters('pp_use_group_members_table', $wpdb->pp_group_members, $post_type_name);
    $_args['join'] = "INNER JOIN {$group_members_table} AS ug ON {$groups_table}.ID = ug.group_id";
    $most_recent = pp_get_groups($post_type_name, $_args);
    foreach (array_keys($most_recent) as $key) {
        $most_recent[$key]->object_id = $posts[$key]->ID;
        $most_recent[$key]->title = $posts[$key]->name;
        $most_recent[$key]->post_parent = 0;
        //$most_recent[$key]->post_type = $post_type_name;
        $most_recent[$key]->custom_source = $post_type_name;
    }
    $args['walker'] = $walker;
    echo walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args);
    ?>
			</ul>
		</div><!-- /.tabs-panel -->

		<!-- search
		<div class="tabs-panel">
		</div>
		-->

		<div id="<?php 
    echo $post_type_name;
    ?>
-all" class="tabs-panel tabs-panel-view-all <?php 
    echo 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive';
    ?>
">
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
			<ul id="<?php 
    echo $post_type_name;
    ?>
checklist" class="list:<?php 
    echo $post_type_name;
    ?>
 categorychecklist form-no-clear">
				<?php 
    $db_fields = array('parent' => 'post_parent', 'id' => 'ID');
    $walker = new PP_Walker_Nav_Menu_Checklist($db_fields);
    $args['walker'] = $walker;
    /*
    // kevinB: add "(none)" item for include exceptions
    $front_page_obj = (object) array( 'ID' => 0, 'post_parent' => 0, 'post_content' => '', 'post_excerpt' => '', 'post_title' => __( '(none)', 'pp' ), 'object_id' => 0, 'title' => __( '(none)', 'pp' ), 'menu_item_parent' => 0, 'db_id' => 0 );
    $front_page_obj->_add_to_top = true;
    $front_page_obj->label = __( '(none)', 'pp' );
    array_unshift( $posts, $front_page_obj );
    
    $posts = apply_filters( 'nav_menu_items_'.$post_type_name, $posts, $args, $post_type );
    */
    $_args = array('skip_meta_types' => 'wp_role');
    $posts = pp_get_groups($post_type_name, $_args);
    foreach (array_keys($posts) as $key) {
        $posts[$key]->object_id = $posts[$key]->ID;
        $posts[$key]->title = $posts[$key]->name;
        $posts[$key]->post_parent = 0;
        //$posts[$key]->post_type = $post_type_name;
        $posts[$key]->custom_source = $post_type_name;
    }
    $checkbox_items = walk_nav_menu_tree(array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args);
    if ('all' == $current_tab && !empty($_REQUEST['selectall'])) {
        $checkbox_items = preg_replace('/(type=(.)checkbox(\\2))/', '$1 checked=$2checked$2', $checkbox_items);
    }
    echo $checkbox_items;
    ?>
			</ul>
			<?php 
    if (!empty($page_links)) {
        ?>
				<div class="add-menu-item-pagelinks">
					<?php 
        echo $page_links;
        ?>
				</div>
			<?php 
    }
    ?>
		</div><!-- /.tabs-panel -->

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php 
    echo esc_url(add_query_arg(array($post_type_name . '-tab' => 'all', 'selectall' => 1), remove_query_arg($removed_args)));
    ?>
#posttype-<?php 
    echo $post_type_name;
    ?>
" class="select-all"><?php 
    _e('Select All');
    ?>
</a>
			</span>
			
			<span class="add-to-menu">
				<img class="waiting" style="display:none" src="<?php 
    echo esc_url(admin_url('images/wpspin_light.gif'));
    ?>
" alt="" />
				<input type="submit"<?php 
    disabled($nav_menu_selected_id, 0);
    ?>
 class="button-secondary submit-add-<?php 
    echo $post_type_name;
    ?>
-exception" value="<?php 
    esc_attr_e('Add Exceptions', 'pp');
    ?>
" name="add-post-type-menu-item" id="submit-posttype-<?php 
    echo $post_type_name;
    ?>
" />
			</span>
		</p>

	</div> <!-- /.posttypediv -->

	<?php 
}
Example #6
0
    public static function _current_exceptions_ui($exc_results, $args = array())
    {
        global $pp_admin, $pp_role_defs, $pp_data_sources;
        $defaults = array('read_only' => false, 'class' => 'pp-group-roles', 'item_links' => false, 'caption' => '', 'link' => '', 'agent_type' => '');
        $args = array_merge($defaults, $args);
        extract($args);
        if (!$exc_results) {
            return;
        }
        if (!$caption) {
            $caption = 'user' == $agent_type ? sprintf(__('Exceptions %1$s(for user)%2$s', 'pp'), '<small>', '</small>') : __('Exceptions', 'pp');
        }
        require_once PPC_ABSPATH . '/lib/ancestry_lib_pp.php';
        $can_assign = current_user_can('pp_assign_roles') && pp_bulk_roles_enabled();
        $exceptions = array_fill_keys(array_merge(array('term', 'post'), pp_get_group_types()), array());
        $item_paths = array_fill_keys(array_keys($exceptions), array(__('(none)', 'pp')));
        // support imported include exception with no items included
        $post_types = pp_get_enabled_post_types(array(), 'names');
        $taxonomies = pp_get_enabled_taxonomies(array('object_type' => false), 'names');
        foreach ($exc_results as $row) {
            // object_type not strictly necessary here, included for consistency with term role array
            switch ($row->via_item_source) {
                case 'term':
                    if ($row->item_id) {
                        $taxonomy = '';
                        $term_id = (int) pp_ttid_to_termid($row->item_id, $taxonomy);
                        if ($row->item_id) {
                            $item_paths['term'][$row->item_id] = PP_Ancestry::get_term_path($term_id, $taxonomy);
                        }
                        $via_type = $taxonomy;
                    } else {
                        $via_type = $row->via_item_type;
                    }
                    break;
                case 'post':
                    if ($row->item_id) {
                        $item_paths['post'][$row->item_id] = PP_Ancestry::get_post_path($row->item_id);
                    }
                    // no break
                // no break
                default:
                    if (pp_group_type_exists($row->via_item_source)) {
                        static $groups_by_id;
                        if (!isset($groups_by_id)) {
                            $groups_by_id = array();
                        }
                        if (!isset($groups_by_id[$row->via_item_source])) {
                            $groups_by_id[$row->via_item_source] = array();
                            foreach (pp_get_groups($row->via_item_source, array('skip_meta_types' => 'wp_role')) as $group) {
                                $groups_by_id[$row->via_item_source][$group->ID] = $group->name;
                            }
                        }
                        if (isset($groups_by_id[$row->via_item_source][$row->item_id])) {
                            $item_paths[$row->via_item_source][$row->item_id] = $groups_by_id[$row->via_item_source][$row->item_id];
                        }
                        $via_type = $row->via_item_source;
                    } else {
                        $via_type = $row->via_item_type ? $row->via_item_type : $row->for_item_type;
                    }
            }
            if (!isset($exceptions[$row->via_item_source][$via_type])) {
                $exceptions[$row->via_item_source][$via_type] = array();
            }
            if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type])) {
                $exceptions[$row->via_item_source][$via_type][$row->for_item_type] = array();
            }
            if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation])) {
                $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation] = array();
            }
            if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type])) {
                $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type] = array();
            }
            if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status])) {
                $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status] = array();
            }
            if (!isset($exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id])) {
                $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id] = array();
            }
            $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id][$row->assign_for] = $row->eitem_id;
            if (!empty($row->inherited_from)) {
                $exceptions[$row->via_item_source][$via_type][$row->for_item_type][$row->operation][$row->mod_type][$row->for_item_status][$row->item_id]['inherited_from'] = $row->inherited_from;
            }
        }
        echo '<div style="clear:both;"></div>' . "<div id='pp_current_exceptions' class='pp-group-box {$class}'>" . '<h3>';
        if ($link) {
            echo "<a href='{$link}'>{$caption}</a>";
        } else {
            echo $caption;
        }
        echo '</h3>';
        echo '<div>';
        echo '<div id="pp_current_exceptions_inner">';
        //ksort( $type_roles );
        if (empty($_REQUEST['all_types']) && !empty($exceptions['post'])) {
            $all_types = array_fill_keys(array_merge($post_types, $taxonomies, array('')), true);
            $all_types = array_diff_key($all_types, array('topic' => true, 'reply' => true));
            // hide topic, reply assignments even if they are somehow saved/imported without inherited_from value
            $exceptions['post'] = array_intersect_key($exceptions['post'], $all_types);
            foreach (array_keys($exceptions['post']) as $key) {
                $exceptions['post'][$key] = array_intersect_key($exceptions['post'][$key], $all_types);
            }
        }
        foreach (array_keys($exceptions) as $via_src) {
            ksort($exceptions[$via_src]);
            foreach (array_keys($exceptions[$via_src]) as $via_type) {
                if ($via_type_obj = pp_get_type_object($via_src, $via_type)) {
                    $via_type_caption = $via_type_obj->labels->singular_name;
                } else {
                    continue;
                }
                $any_redundant = false;
                echo "<div id='pp_current_{$via_src}_{$via_type}_roles' class='pp-current-exceptions'>";
                /*
                if ( 'term' == $via_src )
                	echo '<h4>' . __( 'Per-Term:', 'pp' ) . '</h4>';
                else {
                	if ( $object_type )
                		echo '<h4>' . sprintf( __( 'Per-%s:', 'pp' ), $type_caption ) . '</h4>';
                	else
                		echo '<h4>' . sprintf( __( 'Per-object:', 'pp' ), $type_caption ) . '</h4>';
                }
                
                echo '<h4>' . sprintf( __( '%s Exceptions', 'pp' ), $via_type_caption ) . '</h4>';
                */
                ksort($exceptions[$via_src][$via_type]);
                foreach (array_keys($exceptions[$via_src][$via_type]) as $for_type) {
                    if (pp_group_type_exists($for_type)) {
                        $for_src = $for_type;
                    } else {
                        $for_src = taxonomy_exists($for_type) || !$for_type ? 'term' : 'post';
                    }
                    if (!$for_type) {
                        $for_type_obj = (object) array('labels' => (object) array('singular_name' => __('(all post types)', 'pp')));
                    } elseif (!($for_type_obj = pp_get_type_object($for_src, $for_type))) {
                        continue;
                    }
                    foreach (array_keys($exceptions[$via_src][$via_type][$for_type]) as $operation) {
                        if (!($operation_obj = pp_get_op_object($operation, $for_type))) {
                            continue;
                        }
                        if ('assign' == $operation) {
                            $op_caption = $for_type ? sprintf(__('%1$s (%2$s: %3$s)', 'pp'), $operation_obj->label, $for_type_obj->labels->singular_name, $via_type_caption) : sprintf(__('%1$s %2$s %3$s', 'pp'), $operation_obj->label, $via_type_caption, $for_type_obj->labels->singular_name);
                        } elseif (in_array($operation, array('manage', 'associate'))) {
                            $op_caption = sprintf(__('%1$s %2$s', 'pp'), $operation_obj->label, $via_type_caption);
                        } else {
                            $op_caption = sprintf(__('%1$s %2$s', 'pp'), $operation_obj->label, $for_type_obj->labels->singular_name);
                        }
                        echo "<div class='type-roles-wrapper'>";
                        echo '<h4>' . $op_caption . '</h4>';
                        echo "<div class='pp-current-type-roles'>";
                        echo '<div class="pp-current-roles-tbl-wrapper"><table>';
                        // fill table body (item assignments for each role)
                        echo '<tbody>';
                        foreach (array_keys($exceptions[$via_src][$via_type][$for_type][$operation]) as $mod_type) {
                            if (!($mod_type_obj = pp_get_mod_object($mod_type))) {
                                continue;
                            }
                            foreach (array_keys($exceptions[$via_src][$via_type][$for_type][$operation][$mod_type]) as $status) {
                                if ($status) {
                                    $_status = explode(':', $status);
                                    if (count($_status) > 1) {
                                        $attrib = $_status[0];
                                        $_status = $_status[1];
                                    } else {
                                        $attrib = 'post_status';
                                        $_status = $status;
                                    }
                                    if ('post_status' == $attrib) {
                                        if ($status_obj = get_post_status_object($_status)) {
                                            $status_label = $status_obj->label;
                                        } elseif ('{unpublished}' == $_status) {
                                            // @todo: API
                                            $status_label = __('unpublished', 'pp');
                                        } else {
                                            $status_label = $status;
                                        }
                                    } else {
                                        $status_label = $status;
                                    }
                                    $mod_caption = sprintf(__('%1$s (%2$s)', 'pp'), $mod_type_obj->label, $status_label);
                                } else {
                                    $mod_caption = $mod_type_obj->label;
                                }
                                if ('exclude' == $mod_type && !empty($exceptions[$via_src][$via_type][$for_type][$operation]['include'])) {
                                    $tr_class = ' class="pp_faded"';
                                    $mod_caption = sprintf(__('* %s', 'pp'), $mod_caption);
                                    $any_faded = true;
                                } else {
                                    $tr_class = '';
                                }
                                echo "<tr{$tr_class}><td class='pp_item_role_caption'>{$mod_caption}</td>";
                                echo '<td>';
                                //if ( $item_links ) {
                                //	if ( 'term' != $scope )
                                //		$edit_url_base = $pp_data_sources->member_property( $item_source, '_edit_link' );
                                //}
                                echo "<div class='pp-role-terms-wrapper pp-role-terms-{$via_type}'>";
                                if ('term' == $via_src && !in_array($operation, array('manage', 'associate'))) {
                                    if (taxonomy_exists($via_type)) {
                                        // "Categories:"
                                        $tx_obj = get_taxonomy($via_type);
                                        $tx_caption = $tx_obj->labels->name;
                                    } else {
                                        $tx_caption = '';
                                    }
                                    echo '<div class="pp-taxonomy-caption">' . sprintf(__('%s:', 'pp'), $tx_caption) . '</div>';
                                    //$edit_url_base = ( isset($tx_obj->_edit_link) ) ? $tx_obj->_edit_link : '';
                                }
                                echo '<div class="pp-role-terms">';
                                $tx_item_paths = array_intersect_key($item_paths[$via_src], $exceptions[$via_src][$via_type][$for_type][$operation][$mod_type][$status]);
                                uasort($tx_item_paths, 'strnatcasecmp');
                                // sort by array values, but maintain keys );
                                foreach ($tx_item_paths as $item_id => $item_path) {
                                    //$assignment = $roles[$scope][$role_name][$item_source][$item_type][$item_id];
                                    $assignment = $exceptions[$via_src][$via_type][$for_type][$operation][$mod_type][$status][$item_id];
                                    $classes = array();
                                    if (isset($assignment['children'])) {
                                        if (isset($assignment['item'])) {
                                            $ass_id = $assignment['item'] . ',' . $assignment['children'];
                                            $classes[] = 'role_both';
                                            $any_both = true;
                                        } else {
                                            $ass_id = '0,' . $assignment['children'];
                                            $classes[] = 'role_ch';
                                            $any_child_only = true;
                                        }
                                    } else {
                                        $ass_id = $assignment['item'];
                                    }
                                    $class = $classes ? "class='" . implode(' ', $classes) . "'" : '';
                                    if ($read_only) {
                                        if ($item_links) {
                                            //$item_edit_url = sprintf($edit_url_base, $item_id);
                                            $item_edit_url = '';
                                            echo "<div><a href='{$item_edit_url}' {$class}>{$item_path}</a></div>";
                                        } else {
                                            echo "<div><span {$class}>{$item_path}</span></div>";
                                        }
                                    } else {
                                        $cb_id = 'pp_edit_exception_' . str_replace(',', '_', $ass_id);
                                        if (!empty($assignment['inherited_from'])) {
                                            $classes[] = 'inherited';
                                            $classes[] = "from_{$assignment['inherited_from']}";
                                        }
                                        if ($tr_class) {
                                            // apply fading for redundantly stored exclusions
                                            $classes[] = $tr_class;
                                        }
                                        $lbl_class = $classes ? "class='" . implode(' ', $classes) . "'" : '';
                                        if ('term' == $via_src) {
                                            $edit_url = admin_url("edit-tags.php?taxonomy={$via_type}&action=edit&tag_ID=" . pp_ttid_to_termid($item_id, $via_type) . "&post_type={$for_type}");
                                        } else {
                                            $edit_url = admin_url("post.php?post={$item_id}&action=edit");
                                        }
                                        echo "<div><label for='{$cb_id}' {$lbl_class}><input id='{$cb_id}' type='checkbox' name='pp_edit_exception[]' value='{$ass_id}' {$class}> " . $item_path . '</label><a href="' . $edit_url . '">' . __('edit') . '</a></div>';
                                    }
                                }
                                // end foreach item
                                if (count($tx_item_paths) > 3 && !$read_only) {
                                    $cb_id = "pp_check_all_{$via_src}_{$via_type}_{$for_type}_{$operation}_{$status}";
                                    echo "<div><label for='{$cb_id}'><input type='checkbox' id='{$cb_id}' class='pp_check_all'> " . __('(all)', 'pp') . '</label></div>';
                                }
                                echo '</div></div>';
                                // pp-role-terms, pp-role-terms-wrapper
                                echo '</td></tr>';
                            }
                            // end foreach status
                        }
                        // end foreach mod_type
                        echo '</tbody>';
                        echo '</table></div>';
                        // pp-current-roles-tbl-wrapper
                        echo '<div class="pp-exception-bulk-edit" style="display:none">';
                        echo "<select><option value=''>" . __ppw('Bulk Actions', 'pp') . "</option><option value='remove'>" . __ppw('Remove', 'pp') . '</option>';
                        if ('post' == $via_src && (!$via_type || $via_type_obj->hierarchical)) {
                            echo "<option value='propagate'>" . sprintf(__('Assign for selected and sub-%s', 'pp'), $via_type_obj->labels->name) . '</option>';
                            echo "<option value='unpropagate'>" . sprintf(__('Assign for selected %s only', 'pp'), $via_type_obj->labels->singular_name) . '</option>';
                            echo "<option value='children_only'>" . sprintf(__('Assign for sub-%s only', 'pp'), $via_type_obj->labels->name) . '</option>';
                        } elseif ('term' == $via_src && $via_type_obj->hierarchical) {
                            echo "<option value='propagate'>" . __('Assign for selected and sub-terms', 'pp') . '</option>';
                            echo "<option value='unpropagate'>" . __('Assign for selected term only', 'pp') . '</option>';
                            echo "<option value='children_only'>" . __('Assign for sub-terms only', 'pp') . '</option>';
                        }
                        echo '</select>';
                        //submit_button( __ppw('Apply'), 'button-secondary submit-edit-item-exception', '', false );
                        ?>
						<input type="submit" name="" class="button submit-edit-item-exception" value="<?php 
                        _e('Apply', 'pp');
                        ?>
" />
						<?php 
                        echo '<img class="waiting" style="display:none;" src="' . esc_url(admin_url('images/wpspin_light.gif')) . '" alt="" />';
                        echo '</div>';
                        // pp-exception-bulk-edit
                        echo '</div></div>';
                        // type-roles-wrapper, pp-current-type-roles
                    }
                    // end foreach operation
                }
                // end foreach for_type
                if ($any_redundant) {
                    echo '<div class="pp-current-roles-note">' . __('* = exceptions redundant due to a corresponding &quot;only these&quot; entry', 'pp') . '</div>';
                }
                if (!empty($via_type_obj->hierarchical)) {
                    $_caption = strtolower($via_type_obj->labels->name);
                    if (!empty($any_both) || !empty($any_child_only)) {
                        ?>
						<div class="pp-current-roles-note">

						<?php 
                        if (!empty($any_both)) {
                            echo '<span class="role_both" style="padding-right:20px">' . sprintf(__('... = assigned for %1$s and sub-%1$s', 'pp'), $_caption) . '</span>';
                        }
                        if (!empty($any_child_only)) {
                            echo '<span>' . sprintf(__('* = assigned for sub-%s only', 'pp'), $_caption) . '</span>';
                        }
                        ?>
						</div>
					<?php 
                    }
                    $show_all_url = esc_url(add_query_arg('show_propagated', '1', $_SERVER['REQUEST_URI']));
                    $show_all_link = "&nbsp;&nbsp;<a href='{$show_all_url}'>";
                    if (empty($_REQUEST['show_propagated'])) {
                        if ('term' == $via_src) {
                            echo '<div class="pp-current-roles-note">' . sprintf(__('note: Exceptions inherited from parent %1$s are not displayed. %2$sshow all%3$s', 'pp'), $_caption, $show_all_link, '</a>') . '</div>';
                        } else {
                            echo '<div class="pp-current-roles-note">' . sprintf(__('note: Exceptions inherited from parent %1$s or terms are not displayed. %2$sshow all%3$s', 'pp'), $_caption, $show_all_link, '</a>') . '</div>';
                        }
                    }
                }
                echo '</div>';
                // pp-current-exceptions
            }
            // end foreach via_type
        }
        // end foreach via_src
        echo '</div>';
        // pp_current_exceptions_inner
        echo '</div>';
        // no class
        echo '</div>';
        // pp_current_exceptions
    }
Example #7
0
    public static function display_ui_user_groups($include_role_metagroups = false, $args = array())
    {
        $defaults = array('initial_hide' => false, 'selected_only' => false, 'hide_checkboxes' => false, 'force_display' => false, 'edit_membership_link' => false, 'user_id' => false);
        extract(array_merge($defaults, $args), EXTR_SKIP);
        require_once dirname(__FILE__) . '/permissions-ui_pp.php';
        if (!is_numeric($user_id)) {
            global $profileuser;
            $user_id = !empty($profileuser) ? $profileuser->ID : 0;
        }
        $group_types = pp_get_group_types(array('editable' => true));
        foreach ($group_types as $agent_type) {
            //if ( ! $agent_type = apply_filters( 'pp_query_group_type', '' ) )
            //	$agent_type = 'pp_group';
            if ('pp_group' == $agent_type && in_array('pp_net_group', $group_types)) {
                continue;
            }
            if (!pp_has_group_cap('pp_manage_members', 0, $agent_type)) {
                continue;
            }
            if (!($all_groups = pp_get_groups($agent_type))) {
                continue;
            }
            $reqd_caps = (array) apply_filters('pp_edit_groups_reqd_caps', array('pp_edit_groups'));
            // @todo: reinstate?
            //$editable_ids = pp_get_groups( 'pp_group', FILTERED_PP, 'id', compact('reqd_caps') );
            if (current_user_can('pp_manage_members')) {
                $editable_ids = array_keys($all_groups);
            } else {
                $editable_ids = array();
            }
            $stored_groups = pp_get_groups_for_user($user_id, $agent_type, array('cols' => 'id'));
            //$addable_ids = array_diff( $editable_ids, array_keys($stored_groups) );
            $locked_ids = array_diff(array_keys($stored_groups), $editable_ids);
            // can't manually edit membership of WP Roles groups or other metagroups lacking _ed_ suffix
            $all_ids = array();
            foreach ($all_groups as $key => $group) {
                if ($selected_only && !isset($stored_groups[$group->ID])) {
                    unset($all_groups[$key]);
                    continue;
                }
                $all_ids[] = $group->ID;
                if (!$include_role_metagroups && !empty($group->metagroup_id) && 'wp_role' == $group->metagroup_type) {
                    $editable_ids = array_diff($editable_ids, array($group->ID));
                    unset($stored_groups[$group->ID]);
                    unset($all_groups[$key]);
                } elseif (!in_array($group->ID, $editable_ids) && !in_array($group->ID, $locked_ids)) {
                    unset($all_groups[$key]);
                }
            }
            $locked_ids = array_diff(array_keys($stored_groups), $editable_ids);
            // avoid incorrect eligible count if orphaned group roles are included in editable_ids
            $editable_ids = array_intersect($editable_ids, $all_ids);
            if (!$all_groups && !$force_display) {
                continue;
            }
            $style = $initial_hide ? "style='display:none'" : '';
            echo "<div id='userprofile_groupsdiv_pp' class='pp-group-box pp-group_members' {$style}>";
            echo "<h3>";
            if ('pp_group' == $agent_type) {
                if (defined('GROUPS_CAPTION_RS')) {
                    echo GROUPS_CAPTION_RS;
                } else {
                    _e('Permission Groups', 'pp');
                }
            } else {
                $group_type_obj = pp_get_group_type_object($agent_type);
                echo $group_type_obj->labels->name;
            }
            echo "</h3>";
            $css_id = $agent_type;
            $args = array('eligible_ids' => $editable_ids, 'locked_ids' => $locked_ids, 'show_subset_caption' => false, 'hide_checkboxes' => $hide_checkboxes);
            require_once dirname(__FILE__) . '/agents_ui_pp.php';
            $pp_agents_ui = pp_init_agents_ui();
            $pp_agents_ui->agents_ui($agent_type, $all_groups, $css_id, $stored_groups, $args);
            if ($edit_membership_link || !$all_groups && $force_display) {
                ?>
				<p>
				<?php 
                if (!$all_groups && $force_display) {
                    _e('This user is not a member of any Permission Groups.', 'pp');
                    ?>
&nbsp;&bull;&nbsp;
				<?php 
                }
                ?>
				<a href='user-edit.php?user_id=<?php 
                echo $user_id;
                ?>
#userprofile_groupsdiv_pp' title='<?php 
                echo esc_attr(__('Edit this user&apos;s group membership', 'pp'));
                ?>
'><?php 
                _e('add / edit membership');
                ?>
</a>
				&nbsp;&nbsp;
				<span class="pp-subtext">
				<?php 
                $note = apply_filters('pp_user_profile_groups_note', defined('BP_VERSION') ? __('note: BuddyPress Groups and other externally defined groups are not listed here, even if they modify permissions', 'pp') : '', $user_id, $args);
                echo $note;
                ?>
				</span>
				</p>
			<?php 
            }
            echo '</div>';
        }
        // end foreach agent_type
        echo "<input type='hidden' name='pp_editing_user_groups' value='1' />";
    }