<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][13524] trunk/src/bp-groups/classes/class-bp-group-extension.php: Improve the BP Rewrites API support of the Group Extension</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/13524">13524</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/13524","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2023-07-24 10:27:28 +0000 (Mon, 24 Jul 2023)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Improve the BP Rewrites API support of the Group Extension

The `BP_Group_Extension::init()` $args parameter (array) now accepts a new argument: `$show_tab_callback`. You can use this argument to inform about the callback function to use to check whether the Extension group's tab should be displayed or not. This callback function is called inside  the `BP_Group_Extension::setup_access_settings()` to make sure to set the `$show_tab` argument once the current group has been defined by BuddyPress.

Third party plugin authors are strongly encouraged to use this new argument if they used to define the `$show_tab` argument according to the result of a function. Doing so in BuddyPress 12.0.0 won't make your extension behave as expected.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/8943">#8943</a>
Closes https://github.com/buddypress/buddypress/pull/136</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpgroupsclassesclassbpgroupextensionphp">trunk/src/bp-groups/classes/class-bp-group-extension.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpgroupsclassesclassbpgroupextensionphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-groups/classes/class-bp-group-extension.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/classes/class-bp-group-extension.php  2023-07-22 07:22:41 UTC (rev 13523)
+++ trunk/src/bp-groups/classes/class-bp-group-extension.php    2023-07-24 10:27:28 UTC (rev 13524)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -196,14 +196,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">        public $show_tab_callback = '';
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-         * List of Group access levels.
-        *
-        * @since 12.0.0
-        * @var string[]
-        */
-       public $access_levels = array( 'noone', 'admin', 'mod', 'member', 'loggedin', 'anyone' );
-
-       /**
</del><span class="cx" style="display: block; padding: 0 10px">          * Whether the current user can visit the tab.
</span><span class="cx" style="display: block; padding: 0 10px">         *
</span><span class="cx" style="display: block; padding: 0 10px">         * @since 2.1.0
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -513,6 +505,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         *                                           tab to group moderators and admins, specify
</span><span class="cx" style="display: block; padding: 0 10px">         *                                           `array( 'mod', 'admin' )`. Defaults to 'anyone' for public groups
</span><span class="cx" style="display: block; padding: 0 10px">         *                                           and 'member' for private groups.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         *    @type string|array  $show_tab_callback The function to execute to set the $show_tab argument.
</ins><span class="cx" style="display: block; padding: 0 10px">          * }
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public function init( $args = array() ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -544,15 +537,12 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'screens'           => $this->get_default_screens(),
</span><span class="cx" style="display: block; padding: 0 10px">                                'access'            => null,
</span><span class="cx" style="display: block; padding: 0 10px">                                'show_tab'          => null,
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                'show_tab_callback' => '',
</ins><span class="cx" style="display: block; padding: 0 10px">                         )
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $show_tab = $this->params['show_tab'];
-               if ( $show_tab && ! in_array( $show_tab, $this->access_levels, true ) && is_callable( $show_tab ) ) {
-                       $this->show_tab_callback = $show_tab;
-
-                       // Group Admin can always see.
-                       $this->params['show_tab'] = 'admin';
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( $this->params['show_tab_callback'] && is_callable( $this->params['show_tab_callback'] ) ) {
+                       $this->show_tab_callback = $this->params['show_tab_callback'];
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $this->initialized = true;
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -866,9 +856,14 @@
</span><span class="cx" style="display: block; padding: 0 10px">                // Tab Visibility.
</span><span class="cx" style="display: block; padding: 0 10px">                $this->user_can_see_nav_item = false;
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Use the provided callback to show or hide the Group extension tab.
+               if ( $this->show_tab_callback ) {
+                       $this->params['show_tab'] = call_user_func_array( $this->show_tab_callback, array( $this->group_id ) );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 /*
</span><span class="cx" style="display: block; padding: 0 10px">                 * Backward compatibility for components that do not provide
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                 * explicit 'show_tab' parameter.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+          * explicit 'show_tab_callback' or 'show_tab' parameters.
</ins><span class="cx" style="display: block; padding: 0 10px">                  */
</span><span class="cx" style="display: block; padding: 0 10px">                if ( empty( $this->params['show_tab'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( false === $this->params['enable_nav_item'] ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1111,10 +1106,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        return true;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( $this->show_tab_callback ) {
-                       return call_user_func( $this->show_tab_callback );
-               }
-
</del><span class="cx" style="display: block; padding: 0 10px">                 return $this->user_can_see_nav_item;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>