<?php
/**
* bbPress BuddyPress Component Class
*
* bbPress and BuddyPress are designed to connect together seamlessly and
* invisibly, and this is the hunk of code necessary to make that happen.
*
* The code in this BuddyPress Extension does some pretty complicated stuff,
* far outside the realm of the simplicity bbPress is traditionally known for.
*
* While the rest of bbPress serves as an example of how to write pretty, simple
* code, what's in these files is pure madness. It should not be used as an
* example of anything other than successfully juggling chainsaws and puppy-dogs.
*
* @package bbPress
* @subpackage BuddyPress
*/
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) exit;
if ( !class_exists( 'BBP_Forums_Component' ) ) :
/**
* Loads Forums Component
*
* @since bbPress (r3552)
*
* @package bbPress
* @subpackage BuddyPress
*/
class BBP_Forums_Component extends BP_Component {
/**
* Start the forums component creation process
*
* @since bbPress (r3552)
*/
public function __construct() {
parent::start(
'forums',
__( 'Forums', 'bbpress' ),
BP_PLUGIN_DIR
);
$this->includes();
$this->setup_globals();
$this->setup_actions();
$this->setup_nav();
$this->fully_loaded();
}
/**
* Include BuddyPress classes and functions
*/
public function includes() {
// Helper BuddyPress functions
require( bbpress()->includes_dir . 'extend/buddypress/functions.php' );
// Members modifications
require( bbpress()->includes_dir . 'extend/buddypress/members.php' );
// BuddyPress Activity Extension class
if ( bp_is_active( 'activity' ) ) {
require( bbpress()->includes_dir . 'extend/buddypress/activity.php' );
}
// BuddyPress Group Extension class
if ( bbp_is_group_forums_active() && bp_is_active( 'groups' ) ) {
require( bbpress()->includes_dir . 'extend/buddypress/group.php' );
}
}
/**
* Setup globals
*
* The BP_FORUMS_SLUG constant is deprecated, and only used here for
* backwards compatibility.
*
* @since bbPress (r3552)
*/
public function setup_globals() {
$bp = buddypress();
// Define the parent forum ID
if ( !defined( 'BP_FORUMS_PARENT_FORUM_ID' ) )
define( 'BP_FORUMS_PARENT_FORUM_ID', 1 );
// Define a slug, if necessary
if ( !defined( 'BP_FORUMS_SLUG' ) )
define( 'BP_FORUMS_SLUG', $this->id );
// All globals for messaging component.
$globals = array(
'path' => BP_PLUGIN_DIR,
'slug' => BP_FORUMS_SLUG,
'root_slug' => isset( $bp->pages->forums->slug ) ? $bp->pages->forums->slug : BP_FORUMS_SLUG,
'has_directory' => false,
'notification_callback' => 'messages_format_notifications',
'search_string' => __( 'Search Forums...', 'bbpress' ),
);
parent::setup_globals( $globals );
}
/**
* Instantiate classes for BuddyPress integration
*
* @since bbPress (r3395)
*/
public function setup_components() {
// Always load the members component
bbpress()->extend->buddypress->members = new BBP_BuddyPress_Members;
// Create new activity class
if ( bp_is_active( 'activity' ) ) {
bbpress()->extend->buddypress->activity = new BBP_BuddyPress_Activity;
}
// Register the group extension only if groups are active
if ( bbp_is_group_forums_active() && bp_is_active( 'groups' ) ) {
bp_register_group_extension( 'BBP_Forums_Group_Extension' );
}
}
/**
* Setup the actions
*
* @since bbPress (r3395)
* @access private
* @uses add_filter() To add various filters
* @uses add_action() To add various actions
*/
public function setup_actions() {
// Setup the components
add_action( 'bp_init', array( $this, 'setup_components' ) );
parent::setup_actions();
}
/**
* Allow the variables, actions, and filters to be modified by third party
* plugins and themes.
*
* @since bbPress (r3902)
*/
private function fully_loaded() {
do_action_ref_array( 'bbp_buddypress_loaded', array( $this ) );
}
/**
* Setup BuddyBar navigation
*
* @since bbPress (r3552)
*/
public function setup_nav() {
// Stop if there is no user displayed or logged in
if ( !is_user_logged_in() && !bp_displayed_user_id() )
return;
// Define local variable(s)
$sub_nav = array();
$user_domain = '';
// Add 'Forums' to the main navigation
$main_nav = array(
'name' => __( 'Forums', 'bbpress' ),
'slug' => $this->slug,
'position' => 80,
'screen_function' => 'bbp_member_forums_screen_topics',
'default_subnav_slug' => 'topics',
'item_css_id' => $this->id
);
// Determine user to use
if ( bp_displayed_user_id() )
$user_domain = bp_displayed_user_domain();
elseif ( bp_loggedin_user_domain() )
$user_domain = bp_loggedin_user_domain();
else
return;
// User link
$forums_link = trailingslashit( $user_domain . $this->slug );
// Topics started
$sub_nav[] = array(
'name' => __( 'Topics Started', 'bbpress' ),
'slug' => 'topics',
'parent_url' => $forums_link,
'parent_slug' => $this->slug,
'screen_function' => 'bbp_member_forums_screen_topics',
'position' => 20,
'item_css_id' => 'topics'
);
// Replies to topics
$sub_nav[] = array(
'name' => __( 'Replies Created', 'bbpress' ),
'slug' => 'replies',
'parent_url' => $forums_link,
'parent_slug' => $this->slug,
'screen_function' => 'bbp_member_forums_screen_replies',
'position' => 40,
'item_css_id' => 'replies'
);
// Favorite topics
$sub_nav[] = array(
'name' => __( 'Favorites', 'bbpress' ),
'slug' => 'favorites',
'parent_url' => $forums_link,
'parent_slug' => $this->slug,
'screen_function' => 'bbp_member_forums_screen_favorites',
'position' => 60,
'item_css_id' => 'favorites'
);
// Subscribed topics (my profile only)
if ( bp_is_my_profile() ) {
$sub_nav[] = array(
'name' => __( 'Subscriptions', 'bbpress' ),
'slug' => 'subscriptions',
'parent_url' => $forums_link,
'parent_slug' => $this->slug,
'screen_function' => 'bbp_member_forums_screen_subscriptions',
'position' => 60,
'item_css_id' => 'subscriptions'
);
}
parent::setup_nav( $main_nav, $sub_nav );
}
/**
* Set up the admin bar
*
* @since bbPress (r3552)
*/
public function setup_admin_bar() {
// Prevent debug notices
$wp_admin_nav = array();
// Menus for logged in user
if ( is_user_logged_in() ) {
// Setup the logged in user variables
$user_domain = bp_loggedin_user_domain();
$forums_link = trailingslashit( $user_domain . $this->slug );
// Add the "My Account" sub menus
$wp_admin_nav[] = array(
'parent' => buddypress()->my_account_menu_id,
'id' => 'my-account-' . $this->id,
'title' => __( 'Forums', 'bbpress' ),
'href' => trailingslashit( $forums_link )
);
// Topics
$wp_admin_nav[] = array(
'parent' => 'my-account-' . $this->id,
'id' => 'my-account-' . $this->id . '-topics',
'title' => __( 'Topics Started', 'bbpress' ),
'href' => trailingslashit( $forums_link . 'topics' )
);
// Replies
$wp_admin_nav[] = array(
'parent' => 'my-account-' . $this->id,
'id' => 'my-account-' . $this->id . '-replies',
'title' => __( 'Replies Created', 'bbpress' ),
'href' => trailingslashit( $forums_link . 'replies' )
);
// Favorites
$wp_admin_nav[] = array(
'parent' => 'my-account-' . $this->id,
'id' => 'my-account-' . $this->id . '-favorites',
'title' => __( 'Favorite Topics', 'bbpress' ),
'href' => trailingslashit( $forums_link . 'favorites' )
);
// Subscriptions
$wp_admin_nav[] = array(
'parent' => 'my-account-' . $this->id,
'id' => 'my-account-' . $this->id . '-subscriptions',
'title' => __( 'Subscribed Topics', 'bbpress' ),
'href' => trailingslashit( $forums_link . 'subscriptions' )
);
}
parent::setup_admin_bar( $wp_admin_nav );
}
/**
* Sets up the title for pages and <title>
*
* @since bbPress (r3552)
*/
public function setup_title() {
$bp = buddypress();
// Adjust title based on view
if ( bp_is_forums_component() ) {
if ( bp_is_my_profile() ) {
$bp->bp_options_title = __( 'Forums', 'bbpress' );
} elseif ( bp_is_user() ) {
$bp->bp_options_avatar = bp_core_fetch_avatar( array(
'item_id' => bp_displayed_user_id(),
'type' => 'thumb'
) );
$bp->bp_options_title = bp_get_displayed_user_fullname();
}
}
parent::setup_title();
}
}
endif;