<!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][11405] trunk: Groups: Fix AJAX pagination when on a group type directory page.</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 { 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/11405">11405</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/11405","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>r-a-y</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2017-01-31 20:31:10 +0000 (Tue, 31 Jan 2017)</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'>Groups: Fix AJAX pagination when on a group type directory page.

This commit moves group type directory detection from the
`'template_redirect'` hook to our groups component class to ensure
detection is available for AJAX purposes.

Commit also changes invalid group type directory requests to 404 instead
of redirecting back to the main Groups directory.

Props r-a-y, dcavins.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/7423">#7423</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpgroupsbpgroupsscreensphp">trunk/src/bp-groups/bp-groups-screens.php</a></li>
<li><a href="#trunksrcbpgroupsclassesclassbpgroupscomponentphp">trunk/src/bp-groups/classes/class-bp-groups-component.php</a></li>
<li><a href="#trunktestsphpunittestcasesroutinggroupsphp">trunk/tests/phpunit/testcases/routing/groups.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpgroupsbpgroupsscreensphp"></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/bp-groups-screens.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/bp-groups-screens.php 2017-01-31 09:01:04 UTC (rev 11404)
+++ trunk/src/bp-groups/bp-groups-screens.php   2017-01-31 20:31:10 UTC (rev 11405)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -21,22 +21,6 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function groups_directory_groups_setup() {
</span><span class="cx" style="display: block; padding: 0 10px">        if ( bp_is_groups_directory() ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Set group type if available.
-               if ( bp_is_current_action( bp_get_groups_group_type_base() ) && bp_action_variable() ) {
-                       $matched_types = bp_groups_get_group_types( array(
-                               'has_directory'  => true,
-                               'directory_slug' => bp_action_variable(),
-                       ) );
-
-                       // Redirect back to group directory if no match.
-                       if ( empty( $matched_types ) ) {
-                               bp_core_redirect( bp_get_groups_directory_permalink() );
-                       }
-
-                       // Set our global variable.
-                       buddypress()->groups->current_directory_type = reset( $matched_types );
-               }
-
</del><span class="cx" style="display: block; padding: 0 10px">                 bp_update_is_directory( true, 'groups' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                /**
</span></span></pre></div>
<a id="trunksrcbpgroupsclassesclassbpgroupscomponentphp"></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-groups-component.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-groups/classes/class-bp-groups-component.php 2017-01-31 09:01:04 UTC (rev 11404)
+++ trunk/src/bp-groups/classes/class-bp-groups-component.php   2017-01-31 20:31:10 UTC (rev 11405)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -267,6 +267,23 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $this->current_group = 0;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                // Set group type if available.
+               if ( bp_is_groups_directory() && bp_is_current_action( bp_get_groups_group_type_base() ) && bp_action_variable() ) {
+                       $matched_types = bp_groups_get_group_types( array(
+                               'has_directory'  => true,
+                               'directory_slug' => bp_action_variable(),
+                       ) );
+
+                       // Set 404 if we do not have a valid group type.
+                       if ( empty( $matched_types ) ) {
+                               bp_do_404();
+                               return;
+                       }
+
+                       // Set our directory type marker.
+                       $this->current_directory_type = reset( $matched_types );
+               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Set up variables specific to the group creation process.
</span><span class="cx" style="display: block; padding: 0 10px">                if ( bp_is_groups_component() && bp_is_current_action( 'create' ) && bp_user_can_create_groups() && isset( $_COOKIE['bp_new_group_id'] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $bp->groups->new_group_id = (int) $_COOKIE['bp_new_group_id'];
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -297,7 +314,7 @@
</span><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">                // If the user was attempting to access a group, but no group by that name was found, 404.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( bp_is_groups_component() && empty( $this->current_group ) && bp_current_action() && !in_array( bp_current_action(), $this->forbidden_names ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( bp_is_groups_component() && empty( $this->current_group ) && empty( $this->current_directory_type ) && bp_current_action() && ! in_array( bp_current_action(), $this->forbidden_names ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         bp_do_404();
</span><span class="cx" style="display: block; padding: 0 10px">                        return;
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span></span></pre></div>
<a id="trunktestsphpunittestcasesroutinggroupsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/testcases/routing/groups.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/testcases/routing/groups.php  2017-01-31 09:01:04 UTC (rev 11404)
+++ trunk/tests/phpunit/testcases/routing/groups.php    2017-01-31 20:31:10 UTC (rev 11405)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -27,4 +27,39 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $this->go_to( bp_core_get_user_domain( bp_loggedin_user_id() ) . bp_get_groups_slug() . '/invites' );
</span><span class="cx" style="display: block; padding: 0 10px">                $this->assertTrue( bp_is_user_groups() && bp_is_current_action( 'invites' ) );
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+       /**
+        * @group group_types
+        */
+       public function test_group_directory_with_type() {
+               bp_groups_register_group_type( 'foo' );
+               $this->go_to( bp_get_groups_directory_permalink() . 'type/foo/' );
+               $this->assertTrue( bp_is_groups_component() && ! bp_is_group() && bp_is_current_action( bp_get_groups_group_type_base() ) && bp_is_action_variable( 'foo', 0 ) );
+       }
+
+       /**
+        * @group group_types
+        */
+       public function test_group_directory_with_type_that_has_custom_directory_slug() {
+               bp_groups_register_group_type( 'foo', array( 'has_directory' => 'foos' ) );
+               $this->go_to( bp_get_groups_directory_permalink() . 'type/foos/' );
+               $this->assertTrue( bp_is_groups_component() && ! bp_is_group() && bp_is_current_action( bp_get_groups_group_type_base() ) && bp_is_action_variable( 'foos', 0 ) );
+       }
+
+       /**
+        * @group group_types
+        */
+       public function test_group_directory_should_404_for_group_types_that_have_no_directory() {
+               bp_register_member_type( 'foo', array( 'has_directory' => false ) );
+               $this->go_to( bp_get_members_directory_permalink() . 'type/foo/' );
+               $this->assertTrue( is_404() );
+       }
+
+       /**
+        * @group group_types
+        */
+       public function test_group_directory_should_404_for_invalid_group_types() {
+               $this->go_to( bp_get_members_directory_permalink() . 'type/foo/' );
+               $this->assertTrue( is_404() );
+       }
</ins><span class="cx" style="display: block; padding: 0 10px"> }
</span></span></pre>
</div>
</div>

</body>
</html>