[buddypress-trac] [BuddyPress Trac] #6534: A new API to manage single items navigation

buddypress-trac noreply at wordpress.org
Fri May 6 04:21:07 UTC 2016

#6534: A new API to manage single items navigation
 Reporter:  imath                   |       Owner:
     Type:  enhancement             |      Status:  new
 Priority:  high                    |   Milestone:  2.6
Component:  API                     |     Version:
 Severity:  normal                  |  Resolution:
 Keywords:  dev-feedback has-patch  |

Comment (by boonebgorges):

 I know that @imath is concerned about backward compatibility holding up
 this ticket, so I decided to dive in and do a BC review.
 [attachment:6534.05.patch] contains a number of items that improve (and
 demonstrate) backward compatibility. (I have not done a full patch review
 yet - I will do so in the upcoming days, but I wanted to get this part of
 it up for review first.) A summary:

 I wrote a bunch of unit tests that describe various ways one can interact
 with the `bp_nav` and `bp_options_nav` global, and got them to pass
 against the current BP trunk. See the `globalAccess.php` file in
 [attachment:6534.05.patch] (they probably won't run on trunk because of
 some mods I made during development, but with a bit of massaging they
 could be made to do so). I also tested using the following function on the
 front end:

 I think I managed to synthesize the approaches made by @imath and @r-a-y.
 @imath's patch wasn't extensive enough to provide BC for the most common
 mods to the global, while @r-a-y's patch broke in a number of ways for me,
 and I think was overly complex because it was trying to be truly
 recursive. Figuring this out took me most of a day, and would've taken
 much longer without looking at your clever patches, so thanks :)

 The gist linked above, and the unit tests, show the extent of the BC that
 is covered by the patch. Here are some uses that are *not* covered:

 // Unsetting a single property of a nav item. The new nav API doesn't
 support malformed items very well.
 unset( $bp->bp_nav['foo']['name'] );

 // Sorting. This will probably give you a fatal error.
 sort( $bp->bp_nav );

 // Looping using foreach.
 foreach ( $bp->bp_nav as $key => $value ) { ...

 There may be others. It's likely that people are doing these things, but
 I'd wager that it's very rare compared to the basic set/get/isset/unset
 actions that are covered by [attachment:6534.05.patch]. I guess it's worth
 looking through the plugin directory to see if unsupported mods are in
 widespread use; it's possible to support them with some fancy use of
 `ArrayObject`, but I don't want to go to the trouble for extreme edge

 A couple other notes on my BC implementation:

 1. I renamed the BC classes and put them into separate files

 2. I added a check that ensures that they're only loaded when
 `ArrayAccess` is available. SPL can be disabled on PHP 5.2.x (though it is
 enabled by default), so we want to be sure not to cause fatals. On these
 installations, there will simply be no backward compatibility support for
 bp_nav and bp_options_nav - a fair compromise, I think.

 3. Another BC syntax break I noticed was that it's no longer possible to
 do this:

 $nav_item = $bp->bp_options_nav['foo']['bar'];
 $css_id = $nav_item['css_id'];

 because the `$nav_item` is a `stdClass`. Even if we're no longer going to
 use this syntax in BP, I think it's wise to support its legacy use in
 plugins/themes. So I introduced `BP_Core_Nav_Item`, which extends
 `ArrayObject` when available, and used that class in `BP_Core_Nav` instead
 of `$nav_item = (object) $args`. This seems like a small and easy gesture
 we can make for BC. Having a separate class for nav items also opens the
 door for other OOP techniques in the future.

 4. Seems like if we're going to throw `_doing_it_wrong()` notices, we
 should do it whenever the global is touched, not just when an offset is
 provided. So I made that change. If I'm missing something, go ahead and
 change it back.

 5. Another BC break that we should probably document or mitigate is that
 this will no longer work:

 bp_core_new_subnav_item( array(
     'name' => 'Foo',
     'parent_slug' => bp_get_current_group_slug(),
 ) );

 Currently, this will add a subnav to the current group. But the new
 `bp_core_add_subnav_item()` will only know to add to a group nav (rather
 than members) if 'groups' is passed to the `$component` parameter. In
 `BP_Core_BP_Nav_BackCompat::get_component()`, I do this: if
 `bp_is_group()`, and the nav item slug matches the slug of the current
 group, I assume that you intend to be modifying the group nav. (This won't
 be true in absolutely every case, but 99.999% of the time.) I see that
 something similar is happening in the deprecated `_remove_` functions. I'd
 suggest adding it to `bp_core_new_subnav_item()` too.

 Phew - I think that's it for the BC stuff. Once we address the above
 points, I think we'll be in a good place from the compatibility point of

 I will come back soon with a more complete review, but first a small note,
 before I forget: The function names `bp_core_add_nav_item()` and
 `bp_core_add_subnav_item()` were once in use in BP, and removed in [2168].
 They were replaced by the current functions for the same reason we're
 using the names to replace what we've currently got - because we need easy
 synonyms for changed syntax. Probably not worth worrying about, but I
 thought I'd throw it out there :)

Ticket URL: <https://buddypress.trac.wordpress.org/ticket/6534#comment:25>
BuddyPress Trac <http://buddypress.org/>
BuddyPress Trac

More information about the buddypress-trac mailing list