* @package Achievements
* @subpackage templatetags
*
* $Id: achievements-templatetags.php 1012 2011-10-07 18:50:04Z DJPaul $
*/
/**
* The template loop class for Achievements
*
* @since 2.0
* @package Achievements
* @subpackage templatetags
*/
class DPA_Achievement_Template {
/**
* The current position in the loop
*
* @access public
* @var integer
* @see DPA_Achievement_Template
* @since 2.0
*/
var $current_achievement = -1;
/**
* An array containing all the Achievement objects, fetched from the database
*
* @access public
* @var array
* @see DPA_Achievement_Template
* @see DPA_Achievement::get()
* @since 2.0
*/
var $achievements;
/**
* The current Achievement in the loop
*
* @access public
* @var DPA_Achievement
* @see DPA_Achievement_Template
* @since 2.0
*/
var $achievement;
/**
* The number of Achievements to loop through (affected by pagination)
*
* @access public
* @var integer
* @see DPA_Achievement_Template
* @since 2.0
*/
var $achievement_count;
/**
* The total number of Achievements to loop through (NOT affected by pagination)
*
* @access public
* @var integer
* @see DPA_Achievement_Template
* @since 2.0
*/
var $total_achievement_count;
/**
* Are we currently in the Achievements loops?
*
* @access public
* @var bool
* @see DPA_Achievement_Template
* @since 2.0
*/
var $in_the_loop;
/**
* What number page are we on for pagination?
*
* @access public
* @var integer
* @see DPA_Achievement_Template
* @since 2.0
*/
var $pag_page;
/**
* How many Achievements are we showing per-page for pagination?
*
* @access public
* @var integer
* @see DPA_Achievement_Template
* @since 2.0
*/
var $pag_num;
/**
* Retrieve paginated links for Achievement pages
*
* @access public
* @var array|string String of page links or array of page links
* @see DPA_Achievement_Template
* @see paginate_links()
* @since 2.0
*/
var $pag_links;
/**
* Constructor
*
* The Achievements template tag loop. It will retrieve results per the criteria passed from the database, apply pagination (if required)
* and populate the class variables required for the template tag loop to work in the page templates.
*
* @access public
* @global object $bp BuddyPress global settings
* @param integer $user_id = '0'. User ID
* @param string $type = 'all'. Either: all | active | inactive | unlocked | locked | single | active_by_action | eventcount
* @param integer $page = '1'. Which page of results are we on, for pagination? Also, $page = 1 without a per_page will result in no pagination being applied to the results
* @param integer $per_page = '20'. How many Achievements per page, for pagination?
* @param integer $max = '0'. How many Achievements to return as a maximum?
* @param string $slug = ''. The slug of an Achievement. Only required when $type is 'single'
* @param string $action = ''. Only get Achievements with this action. Only required when $type is 'active_by_action' and $user_id != 0 and $populate_extras is true
* @param string $search_terms = ''. Search query
* @param bool $populate_extras = true. If true, fetch additional information about when or if $user_id had unlocked each Achievement
* @param bool $skip_detail_page_result = true. On a single Achievement page, dpa_setup_nav() will setup the Achievement template objects appropiately. Set this to skip that prefetched value.
* @see DPA_Achievement::get()
* @see dpa_setup_nav()
* @since 2.0
* @todo Wrap all these arguments into an array, $args. Change bools to strings to better describe what variable is used for.
* @uses DPA_Achievement_Template
*/
function DPA_Achievement_Template( $user_id, $type, $page, $per_page, $max, $slug, $action, $search_terms, $populate_extras, $skip_detail_page_result ) {
global $bp;
$this->pag_page = !empty( $_REQUEST['xpage'] ) ? intval( $_REQUEST['xpage'] ) : $page;
$this->pag_num = !empty( $_GET['num'] ) ? intval( $_GET['num'] ) : $per_page;
$args = array( 'limit' => $max, 'page' => $this->pag_page, 'per_page' => $this->pag_num, 'populate_extras' => $populate_extras, 'search_terms' => $search_terms, 'skip_detail_page_result' => $skip_detail_page_result, 'slug' => $slug, 'action' => $action, 'type' => $type, 'user_id' => $user_id );
$this->achievements = DPA_Achievement::get( $args );
// Item Requests
if ( !$max || $max >= (int)$this->achievements['total'] )
$this->total_achievement_count = (int)$this->achievements['total'];
else
$this->total_achievement_count = (int)$max;
$this->achievements = $this->achievements['achievements'];
if ( $max ) {
if ( $max >= count( $this->achievements ) )
$this->achievement_count = count( $this->achievements );
else
$this->achievement_count = (int)$max;
} else {
$this->achievement_count = count( $this->achievements );
}
if ( (int)$this->total_achievement_count && (int)$this->pag_num ) {
$this->pag_links = paginate_links( array(
'base' => add_query_arg( array( 'xpage' => '%#%', 'num' => $this->pag_num, 's' => $search_terms ) ),
'format' => '',
'total' => ceil( (int)$this->total_achievement_count / (int)$this->pag_num ),
'current' => (int)$this->pag_page,
'prev_text' => '←',
'next_text' => '→',
'mid_size' => 1
) );
}
}
/**
* Returns true if we have Achievements matching the retrieval critera
*
* @access public
* @since 2.0
* @return bool
*/
function has_achievements() {
if ( $this->achievement_count )
return true;
return false;
}
/**
* Returns the next Achievement object in the template tag loop
*
* @access public
* @since 2.0
* @uses DPA_Achievement
* @return DPA_Achievement
*/
function next_achievement() {
$this->current_achievement++;
$this->achievement = $this->achievements[$this->current_achievement];
return $this->achievement;
}
/**
* Rewinds the template tag loop back to the beginning
*
* @access public
* @since 2.0
*/
function rewind_achievements() {
$this->current_achievement = -1;
if ( $this->achievement_count > 0 ) {
$this->achievement = $this->achievements[0];
}
}
/**
* Returns true if there is another Achievement to go through the template tag loop
*
* @access public
* @since 2.0
* @return bool
*/
function user_achievements() {
if ( $this->current_achievement + 1 < $this->achievement_count ) {
return true;
} elseif ( $this->current_achievement + 1 == $this->achievement_count ) {
do_action( 'achievements_loop_end' );
// Do some cleaning up after the loop
$this->rewind_achievements();
}
$this->in_the_loop = false;
return false;
}
/**
* Sets the current Achievement in the template tag loop
*
* @access public
* @global object $bp BuddyPress global settings
* @since 2.0
*/
function the_achievement() {
global $bp;
$this->in_the_loop = true;
$this->achievement = $this->next_achievement();
if ( 0 == $this->current_achievement ) // loop has just started
do_action( 'achievements_loop_start' );
}
}
/**
* The main template tag function that starts it all. Take criteria, queries the databases and paginates it
*
* @since 2.0
* @param array|string $args See DPA_Achievement_Template
* @uses DPA_Achievement_Template
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @global object $bp BuddyPress global settings
* @return bool Did any Achievements match critera?
*/
function dpa_has_achievements( $args = '' ) {
global $achievements_template, $bp;
$search_terms = '';
$slug = '';
$type = 'all';
$user_id = 0;
// User filtering
if ( !empty( $bp->displayed_user->id ) )
$user_id = $bp->displayed_user->id;
elseif ( !empty( $bp->loggedin_user->id ) )
$user_id = $bp->loggedin_user->id;
// Type
if ( $bp->is_single_item ) {
// This might be redundant.
$type = 'single';
$slug = $bp->achievements->current_achievement->slug;
}
if ( dpa_is_member_my_achievements_page() && 'all' == $type )
$type = 'newest';
if ( !empty( $_REQUEST['s'] ) )
$search_terms = stripslashes( $_REQUEST['s'] );
$defaults = array(
'skip_detail_page_result' => true,
'max' => 0,
'page' => 1,
'per_page' => 20,
'populate_extras' => true,
'search_terms' => $search_terms, //Pass search terms to return only matching Achievements
'slug' => $slug, //Pass an Achievement slug to only return that Achievement
'type' => $type,
'user_id' => $user_id,
'action' => ''
);
$r = wp_parse_args( $args, $defaults );
extract( $r );
if ( 'single' != $type && dpa_is_member_my_achievements_page() || dpa_is_achievements_component() && !dpa_is_member_my_achievements_page() && $bp->loggedin_user->id && ( !empty( $_COOKIE['bp-achievements-scope'] ) && 'personal' == stripslashes( $_COOKIE['bp-achievements-scope'] ) ) )
$type = 'unlocked';
$achievements_template = new DPA_Achievement_Template( (int)$user_id, $type, (int)$page, (int)$per_page, (int)$max, $slug, $action, $search_terms, (bool)$populate_extras, (bool)$skip_detail_page_result );
return apply_filters( 'dpa_has_achievements', $achievements_template->has_achievements() );
}
/**
* Sets the current Achievement in the template tag loop
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
*/
function dpa_the_achievement() {
global $achievements_template;
return $achievements_template->the_achievement();
}
/**
* Returns true if there is another Achievement to go through the template tag loop
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return bool
*/
function dpa_achievements() {
global $achievements_template;
return $achievements_template->user_achievements();
}
/**
* Template tag version of dpa_get_achievements_pagination_links()
*
* @uses dpa_get_achievements_pagination_links()
* @since 2.0
*/
function dpa_achievements_pagination_links() {
echo dpa_get_achievements_pagination_links();
}
/**
* Pagination links for template tag loop
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievements_pagination_links() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_pagination_links', $achievements_template->pag_links );
}
/**
* Pagination link text for template tag loop
*
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @global object $bp BuddyPress global settings
* @since 2.0
*/
function dpa_achievements_pagination_count() {
global $achievements_template, $bp;
$start_num = intval( ( $achievements_template->pag_page - 1 ) * $achievements_template->pag_num ) + 1;
$from_num = bp_core_number_format( $start_num );
$to_num = bp_core_number_format( ( $start_num + ( $achievements_template->pag_num - 1 ) > $achievements_template->total_achievement_count ) ? $achievements_template->total_achievement_count : $start_num + ( $achievements_template->pag_num - 1 ) );
$total = bp_core_number_format( $achievements_template->total_achievement_count );
$pagination = sprintf( __( 'Viewing Achievements %1$s to %2$s (of %3$s Achievements)', 'dpa' ), $from_num, $to_num, $total );
if ( !empty( $_REQUEST['search_terms'] ) && 'false' != $_REQUEST['search_terms'] )
$pagination .= sprintf( __( ' matching “%s”', 'dpa' ), apply_filters( 'dpa_get_achievements_search_query', stripslashes( $_REQUEST['search_terms'] ) ) );
echo $pagination;
?> achievement->id );
}
/**
* Template tag version of dpa_get_achievement_name()
*
* @uses dpa_get_achievement_name()
* @since 2.0
*/
function dpa_achievement_name() {
echo dpa_get_achievement_name();
}
/**
* Returns Achievement name
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_name() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_name', $achievements_template->achievement->name );
}
/**
* Template tag version of dpa_get_achievement_slug()
*
* @uses dpa_get_achievement_slug()
* @since 2.0
*/
function dpa_achievement_slug() {
echo dpa_get_achievement_slug();
}
/**
* Returns Achievement slug
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_slug() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_slug', $achievements_template->achievement->slug );
}
/**
* Template tag version of dpa_get_achievement_slug_permalink()
*
* @uses dpa_get_achievement_slug_permalink()
* @since 2.0
*/
function dpa_achievement_slug_permalink() {
echo dpa_get_achievement_slug_permalink();
}
/**
* Returns Achievement permalink
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_slug_permalink() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_slug_permalink', dpa_get_achievements_permalink() . '/' . $achievements_template->achievement->slug . '/' );
}
/**
* Template tag version of dpa_get_achievement_description_excerpt()
*
* @uses dpa_get_achievement_description_excerpt()
* @since 2.0
*/
function dpa_achievement_description_excerpt() {
echo dpa_get_achievement_description_excerpt();
}
/**
* Returns Achievement description excerpt
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_description_excerpt() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_description', bp_create_excerpt( $achievements_template->achievement->description ) );
}
/**
* Template tag version of dpa_get_achievement_description()
*
* @uses dpa_get_achievement_description()
* @since 2.0
*/
function dpa_achievement_description() {
echo dpa_get_achievement_description();
}
/**
* Returns Achievement description
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_description() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_description', $achievements_template->achievement->description );
}
/**
* Template tag version of dpa_achievement_points()
*
* @uses dpa_get_achievement_points()
* @since 2.0
*/
function dpa_achievement_points() {
echo bp_core_number_format( dpa_get_achievement_points() );
}
/**
* Returns Achievement points
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_points() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_points', (int)$achievements_template->achievement->points );
}
/**
* Returns Achievement picture ID
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string Achievement picture id (WP Media Library)
*/
function dpa_get_achievement_picture_id() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_picture_id', (int)$achievements_template->achievement->picture_id );
}
/**
* Returns Achievement site ID (only used in multisite installs)
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
*/
function dpa_get_achievement_site_id() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_site_id', $achievements_template->achievement->site_id );
}
/**
* Returns Achievement group ID
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
*/
function dpa_get_achievement_group_id() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_group_id', (int)$achievements_template->achievement->group_id );
}
/**
* Does this Achievement picture need to be thumbnail sized?
*
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return bool
*/
function dpa_get_achievement_picture_is_thumbnail() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_picture_is_thumbnail', ( dpa_is_create_achievement_page() || dpa_is_directory_page() || ( $achievements_template->in_the_loop && ( !dpa_is_achievement_edit_page() && !dpa_is_achievement_change_picture_page() && !dpa_is_achievement_delete_page() && !dpa_is_achievement_unlocked_by_page() && !dpa_is_achievement_activity_page() && !dpa_is_achievement_grant_page() ) ) ) );
}
/**
* Template tag version of dpa_get_achievement_picture()
*
* @uses dpa_get_achievement_picture()
* @param string $size Optional; set to "thumb" to fetch thumbnail-sized picture, and "activitystream" for a thumbnail-sized picture with width/height style tags.
* @since 2.0
*/
function dpa_achievement_picture( $size='thumb' ) {
echo dpa_get_achievement_picture( $size );
}
/**
* Returns Achievement's picture; takes into account size of image required
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @global int $blog_id Site ID
* @global object $bp BuddyPress global settings
* @param string $size Optional; set to "thumb" to fetch thumbnail-sized picture, and "activitystream" for a thumbnail-sized picture with width/height style tags.
* @return string HTML image tag
*/
function dpa_get_achievement_picture( $size='' ) {
global $achievements_template, $blog_id, $bp;
$achievement_slug = dpa_get_achievement_slug();
$achievement_id = dpa_get_achievement_id();
if ( 'thumb' == $size || 'activitystream' == $size )
$is_thumbnail = true;
else
$is_thumbnail = dpa_get_achievement_picture_is_thumbnail();
if ( ( $picture_id = dpa_get_achievement_picture_id() ) < 1 ) {
if ( empty( $bp->grav_default->user ) )
$default_grav = 'wavatar';
elseif ( 'mystery' == $bp->grav_default->user )
$default_grav = apply_filters( 'bp_core_mysteryman_src', BP_PLUGIN_URL . '/bp-core/images/mystery-man.jpg' );
else
$default_grav = $bp->grav_default->user;
if ( 'thumb' == $size )
$grav_size = apply_filters( 'dpa_get_achievement_picture_gravatar_width', BP_AVATAR_THUMB_WIDTH, 'thumb' );
elseif ( 'activitystream' == $size )
$grav_size = apply_filters( 'dpa_get_achievement_picture_gravatar_width', 20, 'activitystream' );
else
$grav_size = apply_filters( 'dpa_get_achievement_picture_gravatar_width', BP_AVATAR_FULL_WIDTH, 'full' );
$email = apply_filters( 'bp_core_gravatar_email', $achievement_slug . '@' . $bp->root_domain, $achievement_id, 'achievements' );
if ( is_ssl() )
$host = 'https://secure.gravatar.com/avatar/';
else
$host = 'http://www.gravatar.com/avatar/';
$avatar_url = apply_filters( 'bp_gravatar_url', $host ) . md5( $email ) . '?d=' . $default_grav . '&s=' . $grav_size;
} else {
if ( $cached_urls = wp_cache_get( 'dpa_achievement_picture_urls', 'dpa' ) && isset( $cached_urls ) &&
is_array( $cached_urls ) && isset( $cached_urls[$picture_id] ) && $cached_urls[$picture_id] ) {
$avatar_url = $cached_urls[$picture_id];
} else {
if ( $is_nonroot_multisite = ( is_multisite() && BP_ROOT_BLOG != $blog_id ) )
switch_to_blog( BP_ROOT_BLOG ); // Necessary evil
list( $avatar_url, $avatar_width, $avatar_height, $is_intermediate ) = image_downsize( $picture_id, 'large' );
if ( $is_nonroot_multisite )
restore_current_blog();
if ( !is_array( $cached_urls ) )
$cached_urls = array( $picture_id => $avatar_url );
else
$cached_urls[$picture_id] = $avatar_url;
$grav_size = 0;
wp_cache_set( 'dpa_achievement_picture_urls', $cached_urls, 'dpa' );
}
}
$style = '';
if ( 'activitystream' == $size && ( 'mystery' == $bp->grav_default->user || $picture_id > 0 ) )
$style = 'width="20" height="20"';
if ( $is_thumbnail )
$picture_type = "avatar-thumbnail";
else
$picture_type = "avatar-full";
$url = '';
return apply_filters( 'dpa_get_achievement_picture', $url, $achievement_id, $picture_id, $grav_size, $style );
}
/**
* Template tag version of dpa_get_achievement_picture_width()
*
* @uses dpa_get_achievement_picture_width()
* @since 2.0
*/
function dpa_achievement_picture_width() {
echo dpa_get_achievement_picture_width();
}
/**
* Returns width of the Achievement's picture
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return int
*/
function dpa_get_achievement_picture_width() {
$is_thumbnail = dpa_get_achievement_picture_is_thumbnail();
$picture_id = dpa_get_achievement_picture_id();
if ( $picture_id < 1 ) {
if ( $is_thumbnail )
$width = apply_filters( 'dpa_get_achievement_picture_gravatar_width', BP_AVATAR_THUMB_WIDTH, 'thumb' );
else
$width = apply_filters( 'dpa_get_achievement_picture_gravatar_width', BP_AVATAR_FULL_WIDTH, 'full' );
} else {
if ( $is_thumbnail ) {
$width = apply_filters( 'dpa_get_achievement_picture_width', BP_AVATAR_THUMB_WIDTH, 'thumb' );
} else {
list( $url, $width, $height ) = wp_get_attachment_image_src( $picture_id, 'full' );
$width = apply_filters( 'dpa_get_achievement_picture_width', $width, 'full' );
}
}
return apply_filters( 'dpa_get_achievement_picture_width', $width );
}
/**
* Is the current Achievement active?
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return bool
*/
function dpa_get_achievement_is_active() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_is_active', (bool) $achievements_template->achievement->is_active );
}
/**
* Is the current Achievement active but hidden?
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return bool
*/
function dpa_get_achievement_is_hidden() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_is_active', dpa_get_achievement_is_active() && 2 == $achievements_template->achievement->is_active );
}
/**
* Template tag version of dpa_get_achievement_unlocked_date()
*
* @uses dpa_get_achievement_unlocked_date()
* @since 2.0
*/
function dpa_achievement_unlocked_date() {
echo dpa_get_achievement_unlocked_date();
}
/**
* Returns the date of when this Achievement was unlocked. This may be null if the user hasn't unlocked it
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string|null Achievement Unlock Date
*/
function dpa_get_achievement_unlocked_date() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_unlocked_date', mysql2date( get_option( 'date_format' ), $achievements_template->achievement->achieved_at ) );
}
/**
* Template tag version of dpa_get_achievement_unlocked_ago()
*
* @uses dpa_get_achievement_unlocked_ago()
* @since 2.0
*/
function dpa_achievement_unlocked_ago() {
echo dpa_get_achievement_unlocked_ago();
}
/**
* Returns a Human-readable representation of when this Achievement was unlocked, i.e. "four days ago"
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_unlocked_ago() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_unlocked_date', sprintf( __( ' %s ago', 'dpa' ), bp_core_time_since( $achievements_template->achievement->achieved_at ) ) );
}
/**
* Template tag version of dpa_get_achievement_action_count()
*
* @uses dpa_get_achievement_action_count()
* @since 2.0
*/
function dpa_achievement_action_count() {
echo dpa_get_achievement_action_count();
}
/**
* Returns Achievement's Action count (how many times this Achievement has to be met before it is unlocked)
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return string
*/
function dpa_get_achievement_action_count() {
global $achievements_template;
return apply_filters( 'dpa_get_achievement_action_count', (int)$achievements_template->achievement->action_count );
}
/**
* Has this Achievement been unlocked by the user?
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return bool
*/
function dpa_is_achievement_unlocked() {
global $achievements_template;
if ( !bp_loggedin_user_id() )
return;
return ( !is_null( $achievements_template->achievement->achieved_at ) );
}
/**
* Is this Achievement a "badge" type? (i.e. associated with no action)
*
* @since 2.0
* @global DPA_Achievement_Template $achievements_template Achievements template tag object
* @return bool
*/
function dpa_is_achievement_a_badge() {
global $achievements_template;
return apply_filters( 'dpa_get_is_achievement_a_badge', ( -1 == $achievements_template->achievement->action_id ) ) ;
}
/**
* Template tag version of dpa_get_achievement_type()
*
* @since 2.0
* @uses dpa_get_achievement_type()
* @return bool
*/
function dpa_achievement_type() {
echo dpa_get_achievement_type();
}
/**
* Return the human-readable type of this Achievement
*
* @since 2.0
* @return string
*/
function dpa_get_achievement_type() {
if ( dpa_is_achievement_a_badge() ) {
if ( dpa_get_achievement_is_hidden() )
$type = __( "Award, hidden", 'dpa' );
else
$type = __( "Award", 'dpa' );
} else {
if ( dpa_get_achievement_is_hidden() )
$type = __( "Event, hidden", 'dpa' );
else
$type = __( "Event", 'dpa' );
}
return apply_filters( 'dpa_get_achievement_type', $type );
}
/**
* Template tag version of dpa_get_achievement_counter()
*
* @since 2.0
* @uses dpa_get_achievement_counter()
* @return bool
*/
function dpa_achievement_counter() {
echo dpa_get_achievement_counter();
}
/**
* Return the counter of this Achievement. Used to count progress towards an Achievement that happens a certain number of a repeated Action.
* If an Achievement is a "badge" type, or if the Achievement only requires an Action to happen once, no value is stored.
*
* @since 2.0
* @global object $bp BuddyPress global settings
* @return bool
*/
function dpa_get_achievement_counter() {
global $bp;
if ( !empty( $bp->displayed_user->id ) )
$user_id = $bp->displayed_user->id;
elseif ( !empty( $bp->loggedin_user->id ) )
$user_id = $bp->loggedin_user->id;
else
$user_id = 0;
$counters = get_user_meta( $user_id, 'achievements_counters', true );
return apply_filters( 'dpa_get_achievement_counter', !empty( $counters[dpa_get_achievement_id()] ) ? $counters[dpa_get_achievement_id()] : 0 );
}
/**
* Template tag version of dpa_get_achievement_progress_bar_width()
*
* @uses dpa_get_achievement_progress_bar_width()
* @since 2.0
*/
function dpa_achievement_progress_bar_width() {
echo dpa_get_achievement_progress_bar_width();
}
/**
* Returns the width of the progress bar for Achievements that are not "badge" type and which require
* an Achievement's Action to happen multiple times.
*
* @since 2.0
* @global object $bp BuddyPress global settings
* @return int
*/
function dpa_get_achievement_progress_bar_width() {
global $bp;
if ( !$bp->displayed_user->id && !$bp->loggedin_user->id )
return 0;
if ( dpa_is_achievement_unlocked() ) {
$percentage = 1;
} else {
$achievement_count = dpa_get_achievement_action_count();
if ( $achievement_count <= 1 ) {
$percentage = 0;
} else {
if ( !$counter = dpa_get_achievement_counter() )
$percentage = 0;
else {
$percentage = min( $counter / $achievement_count, 1 );
}
}
}
return apply_filters( 'dpa_get_achievement_progress_bar_width', intval( dpa_get_achievement_picture_width() * $percentage ), $percentage );
}
/**
* Adds form validation errors to the add/edit pages
*
* @since 2.0
* @global WP_Error $achievements_errors Achievement creation error object
* @see DPA_Achievement::validate_achievement_details()
* @param string $form_field Name of the form field
*/
function dpa_addedit_warning( $form_field ) {
global $achievements_errors;
if ( !is_wp_error( $achievements_errors ) || empty( $achievements_errors->errors[$form_field] ) )
return;
foreach ( (array) $achievements_errors->errors[$form_field] as $error ) : ?>
achievements->current_achievement->is_active ) { $value = 'checked="checked"'; } elseif ( 'is_hidden' == $form_field ) { if ( 2 == $bp->achievements->current_achievement->is_active ) $value = 'checked="checked"'; } else { $value = $bp->achievements->current_achievement->{$form_field}; } return apply_filters( 'dpa_get_addedit_value', $value ); } /** * Template tag version of dpa_get_addedit_achievement_type() * * @uses dpa_get_addedit_achievement_type() * @since 2.0 */ function dpa_addedit_achievement_type() { echo dpa_get_addedit_achievement_type(); } /** * Returns the HTML for the radio buttons on the create/edit pages * * @since 2.0 * @global object $bp BuddyPress global settings * @return string */ function dpa_get_addedit_achievement_type() { global $bp; if ( !empty( $_POST['achievement_type'] ) ) { if ( 'badge' == stripslashes( $_POST['achievement_type'] ) ) { $badge = ' checked="checked"'; $event = ''; } else { $badge = ''; $event = ' checked="checked"'; } } else { if ( $bp->achievements->current_achievement->action_id < 1 ) { $badge = ' checked="checked"'; $event = ''; } else { $badge = ''; $event = ' checked="checked"'; } } return apply_filters( 'dpa_get_addedit_achievement_type', ' ' ); } /** * Template tag version of dpa_get_addedit_achievement_type_value() * p.s. Possibly the worse function name ever. * * @uses dpa_get_addedit_achievement_type_value() * @since 2.0 */ function dpa_addedit_achievement_type_value() { echo dpa_get_addedit_achievement_type_value(); } /** * Returns the CSS classes of the "Award when...", "happens when...", "number of times..." boxes * on the create/edit Achievement pages. This is done so that, depending on what type of Achievement * is selected, the irrelevant form fields are hidden on page load. * * @since 2.0 * @global object $bp BuddyPress global settings * @return string */ function dpa_get_addedit_achievement_type_value() { global $bp; if ( !empty( $_POST['achievement_type'] ) ) if ( 'badge' == stripslashes( $_POST['achievement_type'] ) ) return 'initially_hidden'; else return ''; if ( $bp->achievements->current_achievement->action_id < 1 ) return 'initially_hidden'; return ''; } /** * Template tag version of dpa_get_addedit_action_groups() * * @uses dpa_get_addedit_action_groups() * @since 2.0 */ function dpa_addedit_action_groups() { echo dpa_get_addedit_action_groups(); } /** * Returns the HTML for the groups dropdown box on the create/edit Achievement pages. From experience with Welcome Pack, * BuddyPress' groups loop uses too much memory on large databases when we only need two pieces of data per record. * * @global object $bp BuddyPress global settings * @global wpdb $wpdb WordPress database object * @return string * @since 2.0 */ function dpa_get_addedit_action_groups() { global $bp, $wpdb; $groups = $wpdb->get_results( $wpdb->prepare( "SELECT id, name FROM {$bp->groups->table_name} ORDER BY name ASC" ) ); $current_group_id = $bp->achievements->current_achievement->group_id; $selected = ( $current_group_id < 1 ) ? 'selected="selected"' : ''; $options = array( sprintf( '', apply_filters( 'dpa_get_achievement_group_id', -1 ), $selected, __( '(All groups)', 'dpa' ) ) ); foreach ( $groups as $group ) { $selected = ( $current_group_id == $group->id ) ? 'selected="selected"' : ''; $options[] = sprintf( '', apply_filters( 'dpa_get_achievement_group_id', (int)$group->id ), $selected, apply_filters( 'bp_get_group_name', $group->name ) ); } return implode( '', apply_filters( 'dpa_get_addedit_action_multisites', $options ) ); } /** * Template tag version of dpa_get_grant_achievement_userlist() * * @uses dpa_get_grant_achievement_userlist() * @since 2.0 */ function dpa_grant_achievement_userlist() { echo dpa_get_grant_achievement_userlist(); } /** * Returns the HTML for the users dropdown box on the grant Achievement page. From experience with Welcome Pack, * BuddyPress' members loop uses too much memory on large databases when we only need two pieces of data per record. * * @global object $bp BuddyPress global settings * @global wpdb $wpdb WordPress database object * @return string * @since 2.0 */ function dpa_get_grant_achievement_userlist() { global $bp, $wpdb; $options = array(); if ( is_multisite() ) $column = "spam"; else $column = "user_status"; $members = $wpdb->get_results( $wpdb->prepare( "SELECT ID, display_name FROM {$wpdb->users} WHERE {$column} = 0 ORDER BY display_name ASC" ) ); foreach ( $members as $member ) $options[] = sprintf( '