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.