Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
07/12/2014 01:26:36 AM (12 years ago)
Author:
boonebgorges
Message:

Overhaul access and visibility control for group tabs

Previously, access control to group tabs was handled in two ways:

  • for BP_Group_Extension tabs, the 'enable_nav_item' and 'visibility' provided some control over access to plugin developers, though it was inconsistent, buggy, and difficult to implement properly
  • for tabs provided by bp-groups, access to the tabs of non-public groups was controlled directly in the BP_Groups_Component::setup_globals() method

Aside from being unclear for developers, this technique for controlling access
was also inflexible. For non-public groups, tab access was hardcoded and
handled before BP_Group_Extension plugins even had a chance to load. As a
result, it was essentially impossible to add public tabs to non-public groups
(among other non-standard customizations).

The current changeset comprises a number of changes that make tab access more
consistent and flexible:

  • Access control is moved to the new bp_groups_group_access_protection() function. This function has the necessary filters to customize access protection in arbitrary ways. And because it loads at 'bp_actions' - just before the page begins to render - all extensions have had a chance to load and register themselves with the desired access settings.
  • The 'visibility' and 'enable_nav_item' properties of BP_Group_Extension are phased out in favor of 'access' and 'show_tab' params. 'access' controls who can visit the tab, while 'show_tab' controls who can see the item in the navigation. These new properties have intelligent defaults (based on the privacy level of the group), but can be overridden with a number of custom settings: 'admin', 'mod', 'member', 'loggedin', 'anyone', or 'noone'. Backward compatibility is maintained, so that existing BP_Group_Extension plugins that use enable_nav_item or visibility will continue to work as before.

Fixes #4785

Props boonebgorges, dcavins, imath

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/assets/group-extensions.php

    r8538 r8605  
    203203    }
    204204}
     205
     206class BPTest_Group_Extension_Inferred_Access_Settings_EnableNavItem_True extends BP_Group_Extension {
     207    public function __construct() {
     208        $class_name = get_class( $this );
     209
     210        $args = array(
     211            'name' => $class_name,
     212            'slug' => sanitize_title( $class_name ),
     213            'enable_nav_item' => true,
     214        );
     215
     216        parent::init( $args );
     217    }
     218}
     219
     220class BPTest_Group_Extension_Inferred_Access_Settings_EnableNavItem_False extends BP_Group_Extension {
     221    public function __construct() {
     222        $class_name = get_class( $this );
     223
     224        $args = array(
     225            'name' => $class_name,
     226            'slug' => sanitize_title( $class_name ),
     227            'enable_nav_item' => false,
     228        );
     229
     230        parent::init( $args );
     231    }
     232}
     233class BPTest_Group_Extension_Access_Anyone extends BP_Group_Extension {
     234    public function __construct() {
     235        $class_name = get_class( $this );
     236
     237        $args = array(
     238            'name' => $class_name,
     239            'slug' => sanitize_title( $class_name ),
     240            'access' => 'anyone',
     241        );
     242
     243        parent::init( $args );
     244    }
     245}
     246
     247class BPTest_Group_Extension_Access_Loggedin extends BP_Group_Extension {
     248    public function __construct() {
     249        $class_name = get_class( $this );
     250
     251        $args = array(
     252            'name' => $class_name,
     253            'slug' => sanitize_title( $class_name ),
     254            'access' => 'loggedin',
     255        );
     256
     257        parent::init( $args );
     258    }
     259}
     260
     261class BPTest_Group_Extension_Access_Member extends BP_Group_Extension {
     262    public function __construct() {
     263        $class_name = get_class( $this );
     264
     265        $args = array(
     266            'name' => $class_name,
     267            'slug' => sanitize_title( $class_name ),
     268            'access' => 'member',
     269        );
     270
     271        parent::init( $args );
     272    }
     273}
     274
     275class BPTest_Group_Extension_Access_AdminMod extends BP_Group_Extension {
     276    public function __construct() {
     277        $class_name = get_class( $this );
     278
     279        $args = array(
     280            'name' => $class_name,
     281            'slug' => sanitize_title( $class_name ),
     282            'access' => array(
     283                'mod',
     284                'admin',
     285            ),
     286        );
     287
     288        parent::init( $args );
     289    }
     290}
     291
     292class BPTest_Group_Extension_Access_Admin extends BP_Group_Extension {
     293    public function __construct() {
     294        $class_name = get_class( $this );
     295
     296        $args = array(
     297            'name' => $class_name,
     298            'slug' => sanitize_title( $class_name ),
     299            'access' => 'admin',
     300        );
     301
     302        parent::init( $args );
     303    }
     304}
     305
     306class BPTest_Group_Extension_Access_Noone extends BP_Group_Extension {
     307    public function __construct() {
     308        $class_name = get_class( $this );
     309
     310        $args = array(
     311            'name' => $class_name,
     312            'slug' => sanitize_title( $class_name ),
     313            'access' => 'noone',
     314        );
     315
     316        parent::init( $args );
     317    }
     318}
     319
     320class BPTest_Group_Extension_ShowTab_Anyone extends BP_Group_Extension {
     321    public function __construct() {
     322        $class_name = get_class( $this );
     323
     324        $args = array(
     325            'name' => $class_name,
     326            'slug' => sanitize_title( $class_name ),
     327            'access' => 'admin',
     328            'show_tab' => 'anyone',
     329        );
     330
     331        parent::init( $args );
     332    }
     333}
     334
     335class BPTest_Group_Extension_ShowTab_Loggedin extends BP_Group_Extension {
     336    public function __construct() {
     337        $class_name = get_class( $this );
     338
     339        $args = array(
     340            'name' => $class_name,
     341            'slug' => sanitize_title( $class_name ),
     342            'access' => 'admin',
     343            'show_tab' => 'loggedin',
     344        );
     345
     346        parent::init( $args );
     347    }
     348}
     349
     350class BPTest_Group_Extension_ShowTab_Member extends BP_Group_Extension {
     351    public function __construct() {
     352        $class_name = get_class( $this );
     353
     354        $args = array(
     355            'name' => $class_name,
     356            'slug' => sanitize_title( $class_name ),
     357            'access' => 'admin',
     358            'show_tab' => 'member',
     359        );
     360
     361        parent::init( $args );
     362    }
     363}
     364
     365class BPTest_Group_Extension_ShowTab_AdminMod extends BP_Group_Extension {
     366    public function __construct() {
     367        $class_name = get_class( $this );
     368
     369        $args = array(
     370            'name' => $class_name,
     371            'slug' => sanitize_title( $class_name ),
     372            'access' => 'admin',
     373            'show_tab' => array(
     374                'mod',
     375                'admin',
     376            ),
     377        );
     378
     379        parent::init( $args );
     380    }
     381}
     382
     383class BPTest_Group_Extension_ShowTab_Admin extends BP_Group_Extension {
     384    public function __construct() {
     385        $class_name = get_class( $this );
     386
     387        $args = array(
     388            'name' => $class_name,
     389            'slug' => sanitize_title( $class_name ),
     390            'access' => 'admin',
     391            'show_tab' => 'admin',
     392        );
     393
     394        parent::init( $args );
     395    }
     396}
     397
     398class BPTest_Group_Extension_ShowTab_Noone extends BP_Group_Extension {
     399    public function __construct() {
     400        $class_name = get_class( $this );
     401
     402        $args = array(
     403            'name' => $class_name,
     404            'slug' => sanitize_title( $class_name ),
     405            'access' => 'noone',
     406            'show_tab' => 'noone',
     407        );
     408
     409        parent::init( $args );
     410    }
     411}
Note: See TracChangeset for help on using the changeset viewer.