/** * Enqueues JavaScript files. * * @since 2.0 * @global object $bp BuddyPress global settings */ function dpa_add_js() { global $bp; if (!bp_is_current_component($bp->achievements->slug)) { return; } if (DPA_SLUG_CREATE == $bp->current_action && dpa_permission_can_user_create() || DPA_SLUG_ACHIEVEMENT_EDIT == $bp->current_action && dpa_permission_can_user_edit() || DPA_SLUG_ACHIEVEMENT_CHANGE_PICTURE == $bp->current_action && dpa_permission_can_user_change_picture() || DPA_SLUG_ACHIEVEMENT_GRANT == $bp->current_action && dpa_permission_can_user_grant()) { nxt_enqueue_script('achievements-admin-js', plugins_url('/js/admin.js', __FILE__), array(), ACHIEVEMENTS_VERSION); } if ($bp->is_single_item) { nxt_enqueue_script('achievements-detail-js', plugins_url('/js/detail.js', __FILE__), array(), ACHIEVEMENTS_VERSION); } else { nxt_enqueue_script('achievements-directory-js', plugins_url('/js/directory.js', __FILE__), array(), ACHIEVEMENTS_VERSION); } }
?> <span class="highlight"><?php _e('Award', 'dpa'); ?> </span> <?php } ?> <span class="highlight"><?php printf(_n("%s point", "%s points", bp_core_number_format(dpa_get_achievement_points()), 'dpa'), bp_core_number_format(dpa_get_achievement_points())); ?> </span> <?php if (!dpa_get_achievement_is_active() && dpa_permission_can_user_edit()) { ?> <span class="highlight"><?php _e('Inactive Achievement', 'dpa'); ?> </span> <?php } ?> <span class="activity"><?php printf(_n('Only %s person has unlocked this Achievement', '%s people have unlocked this Achievement', bp_core_number_format(dpa_get_achievement_unlocked_count()), 'dpa'), bp_core_number_format(dpa_get_achievement_unlocked_count())); ?> </span> </p>
/** * Returns the on-hover Quick Admin controls which appear for admin users on the Directory pages * * @since 2.0 * @global object $bp BuddyPress global settings * @return string */ function dpa_get_achievements_quickadmin() { global $bp; $items = array(); if (!dpa_is_directory_page()) { return apply_filters('dpa_get_achievements_quickadmin', '', $items); } $url = dpa_get_achievement_slug_permalink(); if (dpa_permission_can_user_change_picture()) { $items[] = sprintf('<a href="%1$s">%2$s</a>', $url . DPA_SLUG_ACHIEVEMENT_CHANGE_PICTURE, __('Change Picture', 'dpa')); } if (dpa_permission_can_user_delete()) { $items[] = sprintf('<a href="%1$s">%2$s</a>', $url . DPA_SLUG_ACHIEVEMENT_DELETE, __('Delete', 'dpa')); } if (dpa_permission_can_user_edit()) { $items[] = sprintf('<a href="%1$s">%2$s</a>', $url . DPA_SLUG_ACHIEVEMENT_EDIT, __('Edit', 'dpa')); } if (dpa_permission_can_user_grant()) { $items[] = sprintf('<a href="%1$s">%2$s</a>', $url . DPA_SLUG_ACHIEVEMENT_GRANT, __('Give', 'dpa')); } if (!$items) { return apply_filters('dpa_get_achievements_quickadmin', '', $items); } return apply_filters('dpa_get_achievements_quickadmin', '<span>' . implode('</span> | <span>', $items) . '</span>', $items); }
/** * Get the Achievement from the database * * @access public * @global object $bp BuddyPress global settings * @global nxtdb $nxtdb NXTClass database object * @param string|array $args See DPA_Achievement_Template::DPA_Achievement_Template() inline documentation for explanation of this argument * @return array The Achievements found matching the criteria (and the total number of, for pagination) * @see DPA_Achievement_Template::DPA_Achievement_Template * @since 2.0 * @static */ function get($args) { global $bp, $nxtdb; $defaults = array('skip_detail_page_result' => true, 'limit' => 0, 'page' => 1, 'per_page' => 20, 'populate_extras' => true, 'search_terms' => '', 'id' => '', 'slug' => '', 'type' => 'all', 'user_id' => 0, 'action' => ''); $r = nxt_parse_args($args, $defaults); extract($r, EXTR_SKIP); // Single page may have already had a DB query if (!$skip_detail_page_result && $bp->achievements->current_achievement->id) { return array('total' => 1, 'achievements' => array($bp->achievements->current_achievement)); } $select_vals = 'id, a.action_id, a.picture_id, a.action_count, a.name, a.description, a.points, a.is_active, a.slug, a.site_id, a.group_id'; $extras = ''; if ($populate_extras && $user_id && 'locked' != $type) { $extras .= sprintf("LEFT JOIN {$bp->achievements->table_unlocked} as u ON a.id = u.achievement_id AND u.user_id = %d ", $user_id); $select_vals .= ', achieved_at'; } switch ($type) { case 'unlocked': $populate_extras = true; $sql = $nxtdb->prepare("SELECT a.{$select_vals}, achieved_at FROM {$bp->achievements->table_achievements} as a, {$bp->achievements->table_unlocked} as u WHERE a.id = u.achievement_id AND u.user_id = %d AND (is_active = 1 OR is_active = 2)", $user_id); $sql_total_count = $nxtdb->prepare("SELECT COUNT(a.id) FROM {$bp->achievements->table_achievements} as a, {$bp->achievements->table_unlocked} as u WHERE a.id = u.achievement_id AND u.user_id = %d AND (is_active = 1 OR is_active = 2)", $user_id); break; case 'locked': $populate_extras = false; $sql = $nxtdb->prepare("SELECT a.{$select_vals}, achieved_at FROM {$bp->achievements->table_achievements} as a LEFT JOIN {$bp->achievements->table_unlocked} as u ON a.id = u.achievement_id AND u.user_id = %d WHERE is_active = 1 AND achieved_at IS NULL", $user_id); $sql_total_count = $nxtdb->prepare("SELECT COUNT(a.id) FROM {$bp->achievements->table_achievements} as a LEFT JOIN {$bp->achievements->table_unlocked} as u ON a.id = u.achievement_id AND u.user_id = %d WHERE is_active = 1 AND achieved_at IS NULL", $user_id); break; case 'active_by_action': $sql = $nxtdb->prepare("SELECT a.{$select_vals} FROM {$bp->achievements->table_actions} as action, {$bp->achievements->table_achievements} as a {$extras}WHERE (is_active = 1 OR is_active = 2) AND action.id = a.action_id AND action.name = %s", $action); $sql_total_count = $nxtdb->prepare("SELECT COUNT(a.id) FROM {$bp->achievements->table_actions} as action, {$bp->achievements->table_achievements} as a {$extras}WHERE (is_active = 1 OR is_active = 2) AND action.id = a.action_id AND action.name = %s", $action); break; case 'active': $sql = $nxtdb->prepare("SELECT a.{$select_vals} FROM {$bp->achievements->table_achievements} as a {$extras}WHERE is_active = 1"); $sql_total_count = $nxtdb->prepare("SELECT COUNT(a.id) FROM {$bp->achievements->table_achievements} as a {$extras}WHERE is_active = 1"); break; case 'inactive': $sql = $nxtdb->prepare("SELECT a.{$select_vals} FROM {$bp->achievements->table_achievements} as a {$extras}WHERE is_active = 0"); $sql_total_count = $nxtdb->prepare("SELECT COUNT(a.id) FROM {$bp->achievements->table_achievements} as a {$extras}WHERE is_active = 0"); break; case 'single': if (!$id) { $sql = $nxtdb->prepare("SELECT a.{$select_vals} FROM {$bp->achievements->table_achievements} as a {$extras}WHERE slug = %s", $slug); } else { $sql = $nxtdb->prepare("SELECT a.{$select_vals} FROM {$bp->achievements->table_achievements} as a {$extras}WHERE id = %d", $id); } $sql_total_count = ''; break; default: case 'all': case 'eventcount': case 'newest': case 'points': $sql = $nxtdb->prepare("SELECT a.{$select_vals} FROM {$bp->achievements->table_achievements} as a {$extras}"); $sql_total_count = $nxtdb->prepare("SELECT COUNT(a.id) FROM {$bp->achievements->table_achievements} as a {$extras}"); break; } $sql = apply_filters('dpa_achievement_get_type_sql', $sql, $limit, $page, $per_page, $populate_extras, $search_terms, $id, $slug, $type, $user_id, $action); $sql_total_count = apply_filters('dpa_achievement_get_type_count_sql', $sql_total_count, $limit, $page, $per_page, $populate_extras, $search_terms, $id, $slug, $type, $user_id, $action); if ($search_terms) { $search_terms = like_escape($nxtdb->escape($search_terms)); if (in_array($type, array('all', 'alphabetical', 'eventcount', 'newest', 'points'))) { $search_sql = " WHERE"; } else { $search_sql = " AND"; } $search_sql .= " ( name LIKE '%%{$search_terms}%%' OR description LIKE '%%{$search_terms}%%' )"; $sql .= $search_sql; $sql_total_count .= $search_sql; } // Filters if ('single' != $type) { // Only admins see inactive Achievements in the Directory. if (!dpa_permission_can_user_edit()) { if ($search_terms) { $admin_sql = $nxtdb->prepare(" AND is_active=1"); $sql .= $admin_sql; $sql_total_count .= $admin_sql; } elseif (in_array($type, array('all', 'alphabetical', 'eventcount', 'newest', 'points'))) { $admin_sql .= " WHERE is_active=1"; $sql .= $admin_sql; $sql_total_count .= $admin_sql; } } if ('unlocked' == $type && 'newest' == $action) { $sql .= " ORDER BY u.achieved_at DESC"; } elseif ('newest' == $type || 'newest' == $action) { $sql .= " ORDER BY a.id DESC"; } elseif ('points' == $type || 'points' == $action) { $sql .= " ORDER BY a.points DESC"; } elseif ('alphabetical' == $type || 'alphabetical' == $action) { $sql .= " ORDER BY a.name ASC"; } elseif ('eventcount' == $type || 'eventcount' == $action) { $sql .= " ORDER BY a.action_count DESC"; } elseif ('unlocked' == $type) { // This must be the penultimate item $sql .= " ORDER BY u.achieved_at DESC"; } else { // This must be the last item $sql .= " ORDER BY a.name ASC"; } $sql = apply_filters('dpa_achievement_get_order_by_sql', $sql, $limit, $page, $per_page, $populate_extras, $search_terms, $id, $slug, $type, $user_id, $action); } else { $limit = 1; } if ('active_by_action' != $type) { if ($per_page && $page && !$limit) { $sql .= $nxtdb->prepare(" LIMIT %d, %d", intval(($page - 1) * $per_page), intval($per_page)); } elseif ($limit) { $sql .= " LIMIT {$limit}"; $sql_total_count .= " LIMIT {$limit}"; } } $results = $nxtdb->get_results($sql); if ('single' == $type) { $total_count = 1; } else { $total_count = $nxtdb->get_var($sql_total_count); } return array('total' => $total_count, 'achievements' => $results); }
/** * Set up navigation and register pages * * @global object $bp BuddyPress global settings * @global bool $is_member_page If we are under anything with a members slug * @since 2.0 * @uses DPA_Achievement */ function dpa_setup_nav() { global $bp, $is_member_page; $url = dpa_get_achievements_permalink() . '/'; if (bp_is_current_component($bp->achievements->slug) && ($bp->achievements->current_achievement = new DPA_Achievement(array('type' => 'single', 'slug' => apply_filters('dpa_get_achievement_slug', $bp->current_action))))) { if (isset($bp->achievements->current_achievement->is_active) && !$bp->achievements->current_achievement->is_active && !dpa_permission_can_user_edit()) { // Require edit permission to view an inactive Achievement's pages bp_core_redirect(dpa_get_achievements_permalink()); return; } else { if ($bp->achievements->current_achievement->id) { $bp->is_single_item = true; } $bp->is_item_admin = 0; if ($bp->loggedin_user->is_super_admin) { $bp->is_item_admin = 1; } // Possibly redundant since BP 1.1, but left for compatibility just in case } } // Add 'Achievements' to the main navigation bp_core_new_nav_item(array('name' => sprintf(__('Achievements <span>%s</span>', 'dpa'), dpa_get_total_achievement_count_for_user()), 'slug' => $bp->achievements->slug, 'position' => 80, 'screen_function' => 'dpa_screen_my_achievements', 'default_subnav_slug' => DPA_SLUG_MY_ACHIEVEMENTS, 'item_css_id' => $bp->achievements->id)); $subnav_url = $bp->loggedin_user->domain . DPA_SLUG . '/'; bp_core_new_subnav_item(array('name' => sprintf(__('My Achievements <span>%s</span>', 'dpa'), dpa_get_total_achievement_count_for_user()), 'slug' => DPA_SLUG_MY_ACHIEVEMENTS, 'parent_url' => $subnav_url, 'parent_slug' => $bp->achievements->slug, 'screen_function' => 'dpa_screen_my_achievements', 'position' => 10, 'item_css_id' => 'achievements_my')); if (bp_is_current_component($bp->achievements->slug)) { if (bp_is_my_profile() && !$bp->is_single_item) { $bp->bp_options_title = __('My Achievements', 'dpa'); } elseif (!bp_is_my_profile() && !$bp->is_single_item) { $bp->bp_options_title = $bp->displayed_user->fullname; } elseif ($bp->is_single_item) { // When in a single listing, the first action is bumped down one because of the listing ID, so we need to adjust this and set the listing name to current_item. $bp->current_item = $bp->current_action; if (isset($bp->action_variables[0])) { $bp->current_action = $bp->action_variables[0]; } else { $bp->current_action = ''; } array_shift($bp->action_variables); $bp->bp_options_title = apply_filters('dpa_get_achievement_name', $bp->achievements->current_achievement->name); $achievement_link = $url . $bp->achievements->current_achievement->slug . '/'; $parent_slug = $bp->achievements->current_achievement->slug; // Add to the main navigation $main_nav = array('name' => __('Home', 'dpa'), 'slug' => $bp->achievements->current_achievement->slug, 'position' => -1, 'screen_function' => 'dpa_screen_achievement_activity', 'default_subnav_slug' => DPA_SLUG_ACHIEVEMENT_ACTIVITY, 'item_css_id' => $bp->achievements->id); bp_core_new_nav_item($main_nav); /** * Setup the subnav items */ // Add the "Home" subnav item, as this will always be present $sub_nav[] = array('name' => __('Home', 'dpa'), 'slug' => DPA_SLUG_ACHIEVEMENT_ACTIVITY, 'parent_url' => $achievement_link, 'parent_slug' => $parent_slug, 'screen_function' => 'dpa_screen_achievement_activity', 'position' => 20, 'item_css_id' => 'achievements_activity'); $sub_nav[] = array('name' => sprintf(__('Unlocked By <span>%s</span>', 'dpa'), dpa_get_achievement_unlocked_count($bp->achievements->current_achievement->id)), 'slug' => DPA_SLUG_ACHIEVEMENT_UNLOCKED_BY, 'parent_url' => $achievement_link, 'parent_slug' => $parent_slug, 'screen_function' => 'dpa_screen_achievement_unlocked_by', 'position' => 40, 'item_css_id' => 'achievements_unlockedby'); if (dpa_permission_can_user_change_picture()) { $sub_nav[] = array('name' => __('Change Picture', 'dpa'), 'slug' => DPA_SLUG_ACHIEVEMENT_CHANGE_PICTURE, 'parent_url' => $achievement_link, 'parent_slug' => $parent_slug, 'screen_function' => 'dpa_screen_achievement_change_picture', 'position' => 50, 'item_css_id' => 'achievements_changepicture'); } if (dpa_permission_can_user_delete()) { $sub_nav[] = array('name' => __('Delete', 'dpa'), 'slug' => DPA_SLUG_ACHIEVEMENT_DELETE, 'parent_url' => $achievement_link, 'parent_slug' => $parent_slug, 'screen_function' => 'dpa_screen_achievement_delete', 'position' => 50, 'user_has_access' => dpa_permission_can_user_delete(), 'item_css_id' => 'achievements_delete'); } if (dpa_permission_can_user_delete()) { $sub_nav[] = array('name' => __('Edit', 'dpa'), 'slug' => DPA_SLUG_ACHIEVEMENT_EDIT, 'parent_url' => $achievement_link, 'parent_slug' => $parent_slug, 'screen_function' => 'dpa_screen_achievement_edit', 'position' => 60, 'user_has_access' => dpa_permission_can_user_edit(), 'item_css_id' => 'achievements_edit'); } if (dpa_permission_can_user_grant()) { $sub_nav[] = array('name' => __('Grant', 'dpa'), 'slug' => DPA_SLUG_ACHIEVEMENT_GRANT, 'parent_url' => $achievement_link, 'parent_slug' => $parent_slug, 'screen_function' => 'dpa_screen_achievement_grant', 'position' => 70, 'user_has_access' => dpa_permission_can_user_grant(), 'item_css_id' => 'achievements_grant'); } // initialize the subnav items foreach ($sub_nav as $nav) { bp_core_new_subnav_item($nav); } } } }