ReportsGenerator
Report generator class
Description
Source
File: bp-integrations/learndash/library/ReportsGenerator.php
class ReportsGenerator { public $completed_table_title; public $incompleted_table_title; protected $activityQuery = null; protected $results = []; protected $pager = []; protected $params = []; protected $defaults = [ 'user' => null, 'step' => 'all', 'course' => null, 'group' => null, 'completed' => true, 'order' => null, 'page' => 1, 'per_page' => 10, 'date_format' => 'Y-m-d', ]; /** * Constructor * * @since BuddyBoss 1.0.0 */ public function __construct() { $this->args = apply_filters( 'bp_ld_sync/reports_generator_args', wp_parse_args(bp_ld_sync()->getRequest(), $this->defaults) ); if ($_POST) { $this->setupParams(); $this->includeCourseTitle(); $this->includeCourseTimeSpent(); } } /** * Get the table columns * * @since BuddyBoss 1.0.0 */ public function getColumns() { $columns = array_map(function($column) { $column = apply_filters('bp_ld_sync/report_column', $column, $this->args); return apply_filters("bp_ld_sync/report_column/step={$this->args['step']}", $column, $this->args); }, $this->columns()); $columns = apply_filters('bp_ld_sync/report_columns', $columns, $this->args); return apply_filters("bp_ld_sync/report_columns/step={$this->args['step']}", $columns, $this->args); } /** * Get the results data * * @since BuddyBoss 1.0.0 */ public function getData() { $results = array_map( [ $this, 'formatData' ], $this->results ); if ( $this->hasArg( 'display' ) && $this->args['display'] ) { $results = array_map( [ $this, 'formatDataForDisplay' ], $results, $this->results ); } if ( $this->hasArg( 'export' ) && $this->args['export'] ) { $results = array_map( [ $this, 'formatDataForExport' ], $results, $this->results ); } $results = array_map( function ( $result, $activity ) { $result = apply_filters( 'bp_ld_sync/report_data', $result, $this->args, $activity ); return apply_filters( "bp_ld_sync/report_data/step={$this->args['step']}", $result, $this->args, $activity ); }, $results, array_values( $this->results ) ); $results = apply_filters( 'bp_ld_sync/report_datas', $results, $this->args ); return apply_filters( "bp_ld_sync/report_datas/step={$this->args['step']}", $results, $this->args ); } /** * Get the pagination info * * @since BuddyBoss 1.0.0 */ public function getPager() { return $this->pager; } /** * Fetch the data from the database * * @since BuddyBoss 1.0.0 */ public function fetch() { add_filter( 'learndash_get_activity_query_args', array( $this, 'remove_post_ids_param' ), 10, 1 ); $this->activityQuery = learndash_reports_get_activity($this->params); remove_filter( 'learndash_get_activity_query_args', array( $this, 'remove_post_ids_param' ), 10 ); // print_r($this->activityQuery);die(); $this->results = $this->activityQuery['results']; $this->pager = $this->activityQuery['pager']; } /** * Remove post ids param from sql query * * @since BuddyBoss 1.0.0 * * @param array $query_args * * @return array $query_args */ public function remove_post_ids_param( $query_args ) { if ( isset( $query_args['post_ids'] ) ) { unset( $query_args['post_ids'] ); } return $query_args; } /** * Prepare the export data * * @since BuddyBoss 1.0.0 */ public function export() { $hash = $this->hasArg('hash')? $this->args['hash'] : md5(microtime()); $exports = get_transient($hash) ?: []; $columns = apply_filters('bp_ld_sync/export_report_column', $this->columns(), $this, $this->args); $data = apply_filters('bp_ld_sync/export_report_data', $this->getData(), $this, $this->args); foreach ($data as $result) { $data = []; foreach (array_keys($columns) as $key) { $data[$key] = $result[$key]; } $exports[] = $data; } set_transient($hash, $exports, HOUR_IN_SECONDS); set_transient("{$hash}_info", [ 'filename' => 'learndash-report-export-group-' . $this->args['group'] . '.csv', 'columns' => $columns ], HOUR_IN_SECONDS); wp_send_json_success([ 'page' => $this->args['start'] / $this->args['length'] + 1, 'total' => $this->pager['total_pages'], 'has_more' => $this->pager['total_pages'] > $this->args['start'] / $this->args['length'] + 1, 'url' => add_query_arg([ 'hash' => $hash, 'action' => 'download_bp_ld_reports', ], admin_url('admin-ajax.php')), 'hash' => $hash ]); } /** * Returns the columns and their settings * * @since BuddyBoss 1.0.0 */ protected function columns() { return []; } /** * Format the activity results for each column * * @since BuddyBoss 1.0.0 */ protected function formatData($activity) { return $activity; } /** * Overwrite results value for display * * @since BuddyBoss 1.0.0 */ protected function formatDataForDisplay($data, $activity) { return wp_parse_args([ 'course' => sprintf( '<a href="%s" target="_blank">%s</a>', get_permalink($activity->activity_course_id), $activity->activity_course_title ) ], $data); } /** * Overwrite results value for export * * @since BuddyBoss 1.0.0 */ protected function formatDataForExport($data, $activity) { return $data; } /** * Add addition sql statement when fetching course reports * * @since BuddyBoss 1.0.0 */ protected function includeCourseTitle() { add_filter('bp_ld_sync/reports/activity_fields', [$this, 'addCourseTitleActivityFields'], 10, 2); add_filter('bp_ld_sync/reports/activity_joins', [$this, 'addCourseTitleActivityTables'], 10, 2); add_filter('bp_ld_sync/reports/activity_wheres', [$this, 'addCourseTitleActivityWhere'], 10, 2); add_filter('bp_ld_sync/reports/activity_groups', [$this, 'addCourseTitleActivityGroup'], 10, 2); add_filter('learndash_user_activity_query_str', [$this, 'maybeAddActivityGroupBy'], 10, 2); } /** * Add course name to sql fields * * @since BuddyBoss 1.0.0 */ public function addCourseTitleActivityFields($strFields, $queryArgs) { return $strFields .= ', courses.post_title as activity_course_title'; } /** * Add course table to sql joins * * @since BuddyBoss 1.0.0 */ public function addCourseTitleActivityTables($strJoins, $queryArgs) { global $wpdb; return $strJoins .= " LEFT JOIN {$wpdb->posts} as courses ON courses.ID=ld_user_activity.course_id "; } /** * Add activity check on sql where * * @since BuddyBoss 1.0.0 */ public function addCourseTitleActivityWhere($strWheres, $queryArgs) { return $strWheres .= " AND activity_id IS NOT NULL "; } /** * Add placeholder where statement * * @since BuddyBoss 1.0.0 */ public function addCourseTitleActivityGroup($strWheres, $queryArgs) { return $strWheres .= " AND 2=2 "; // we gonna conditionaly replace this for group_by // return $strWheres .= " GROUP BY activity_id "; } /** * Replace placeholder where with gorup by statement * * @since BuddyBoss 1.0.0 */ public function maybeAddActivityGroupBy($strSql, $queryArgs) { return str_replace('AND 2=2', 'GROUP BY activity_id', $strSql); } /** * Add course time spent to sql statement * * @since BuddyBoss 1.0.0 */ protected function includeCourseTimeSpent() { add_filter('bp_ld_sync/reports/activity_fields', [$this, 'addCourseTimeSpentActivityFields'], 10, 2); } /** * Remove course time spent to sql statement * * @since BuddyBoss 1.0.0 */ protected function excludeCourseTimeSpent() { remove_filter('bp_ld_sync/reports/activity_fields', [$this, 'addCourseTimeSpentActivityFields'], 10, 2); } /** * Add course time spent to sql fields statement * * @since BuddyBoss 1.0.0 */ public function addCourseTimeSpentActivityFields($strFields, $queryArgs) { return $strFields .= ', IF(activity_status = 1, activity_completed - activity_started, 0) as activity_time_spent'; } /** * Get the built-in column setting by name reference * * @since BuddyBoss 1.0.0 */ public function column($name) { $builtInColumns = [ 'course_id' => [ 'label' => __( 'Course ID', 'buddyboss' ), 'sortable' => false, 'order_key' => '', ], 'course' => [ 'label' => __( 'Course', 'buddyboss' ), 'sortable' => true, 'order_key' => 'activity_course_title', ], 'user_id' => [ 'label' => __( 'User ID', 'buddyboss' ), 'sortable' => false, 'order_key' => '', ], 'user' => [ 'label' => __( 'User', 'buddyboss' ), 'sortable' => true, 'order_key' => 'user_display_name', ], 'step' => [ 'label' => __( 'Step', 'buddyboss' ), 'sortable' => true, 'order_key' => 'post_type', ], 'start_date' => [ 'label' => __( 'Start Date', 'buddyboss' ), 'sortable' => true, 'order_key' => 'activity_started', ], 'completion_date' => [ 'label' => __( 'Completion Date', 'buddyboss' ), 'sortable' => true, 'order_key' => 'activity_completed', ], 'updated_date' => [ 'label' => __( 'Updated Date', 'buddyboss' ), 'sortable' => true, 'order_key' => 'activity_updated', ], 'time_spent' => [ 'label' => __( 'Time Spent', 'buddyboss' ), 'sortable' => true, 'order_key' => 'activity_time_spent', ], 'points' => [ 'label' => __( 'Points Earned', 'buddyboss' ), 'sortable' => false, 'order_key' => '', ], 'status' => [ 'label' => __( 'Status', 'buddyboss' ), 'sortable' => false, 'order_key' => '', ], ]; return $builtInColumns[$name]; } /** * Setup ld activity query params * * @since BuddyBoss 1.0.0 */ protected function setupParams() { // includes/ld-reports.php:882 learndash_reports_get_activity only allowd leader if group_id is passed // $this->params['group_ids'] = $this->args['group']; $ldGroupId = bp_ld_sync('buddypress')->sync->generator($this->args['group'])->getLdGroupId(); if ($this->hasArg('date_format')) { $this->params['date_format'] = $this->args['date_format'] ?: 'Y-m-d'; } $this->params['course_ids'] = learndash_group_enrolled_courses($ldGroupId); if ($this->hasArg('step')) { $this->params['post_types'] = $this->args['step'] == 'all'? $this->allSteps() : $this->args['step']; } // if ($this->hasArg('user')) { $this->params['user_ids'] = $this->args['user'] ?: learndash_get_groups_user_ids($ldGroupId); // } if ($this->hasArg('completed')) { $this->params['activity_status'] = $this->args['completed']? 'COMPLETED' : 'IN_PROGRESS'; } if ($this->hasArg('order')) { $columns = $this->columns(); $columnIndex = $this->args['order'][0]['column']; $column = $columns[$this->args['columns'][$columnIndex]['name']]; $oldOrder = isset($this->params['orderby_order'])? ", {$this->params['orderby_order']}" : ''; $this->params['orderby_order'] = "{$column['order_key']} {$this->args['order'][0]['dir']} {$oldOrder}"; } if ($this->hasArg('start')) { $this->params['paged'] = $this->args['start'] / $this->args['length'] + 1; } if ($this->hasArg('length')) { $this->params['per_page'] = $this->args['length']; } // print_r($this->params);die(); $this->params = apply_filters('bp_ld_sync/reports_generator_params', $this->params, $this->args); } /** * Check if the given argument is passed from request * * @since BuddyBoss 1.0.0 */ protected function hasArg($key) { return isset($this->args[$key]) && ! is_null($this->args[$key]); } /** * Get all the learndash post type except groups * * @since BuddyBoss 1.0.0 */ protected function allSteps() { global $learndash_post_types; return array_diff($learndash_post_types, ['groups']); } /** * Format secons to human readable teim spent * * @since BuddyBoss 1.0.0 */ protected function timeSpent($activity) { $seconds = intval($activity->activity_time_spent); if ($seconds < 60) { return sprintf('%ds', $seconds); } $minutes = floor($seconds/60); $seconds = $seconds % 60; if ($minutes < 60) { return sprintf( '%d%s', $minutes, _n('min', 'mins', $minutes, 'buddyboss') ); } $hours = floor($minutes / 60 * 10) / 10; if ($hours < 24) { return sprintf( '%d %s', $hours, _n('hr', 'hrs', $hours, 'buddyboss') ); } } /** * Format completed date * * @since BuddyBoss 1.0.0 */ protected function completionDate($activity) { return $activity->activity_completed? $activity->activity_completed_formatted : '-'; } /** * Convert completed date * * @since BuddyBoss 1.0.0 */ protected function updatedDate($activity) { return $activity->activity_completed? '-' : $activity->activity_updated_formatted; } /** * Format points earned if enabled * * @since BuddyBoss 1.0.0 */ protected function coursePointsEarned($activity) { if ($activity->activity_type !== 'course') { return '-'; } return $activity->activity_status? get_post_meta($activity->activity_course_id, 'course_points', true) : '0'; } }
Changelog
Version | Description |
---|---|
BuddyBoss 1.0.0 | Introduced. |
Methods
- __construct — Constructor
- addCourseTimeSpentActivityFields — Add course time spent to sql fields statement
- addCourseTitleActivityFields — Add course name to sql fields
- addCourseTitleActivityGroup — Add placeholder where statement
- addCourseTitleActivityTables — Add course table to sql joins
- addCourseTitleActivityWhere — Add activity check on sql where
- allSteps — Get all the learndash post type except groups
- column — Get the built-in column setting by name reference
- columns — Returns the columns and their settings
- completionDate — Format completed date
- coursePointsEarned — Format points earned if enabled
- excludeCourseTimeSpent — Remove course time spent to sql statement
- export — Prepare the export data
- fetch — Fetch the data from the database
- formatData — Format the activity results for each column
- formatDataForDisplay — Overwrite results value for display
- formatDataForExport — Overwrite results value for export
- getColumns — Get the table columns
- getData — Get the results data
- getPager — Get the pagination info
- hasArg — Check if the given argument is passed from request
- includeCourseTimeSpent — Add course time spent to sql statement
- includeCourseTitle — Add addition sql statement when fetching course reports
- maybeAddActivityGroupBy — Replace placeholder where with gorup by statement
- remove_post_ids_param — Remove post ids param from sql query
- setupParams — Setup ld activity query params
- timeSpent — Format secons to human readable teim spent
- updatedDate — Convert completed date
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.