%PDF- %PDF-
Direktori : /var/www/html/ceaa/wp-content/plugins/learnpress/inc/user-item/ |
Current File : /var/www/html/ceaa/wp-content/plugins/learnpress/inc/user-item/class-lp-user-item.php |
<?php /** * Class LP_User_Item * @since 3.0.0 */ class LP_User_Item extends LP_Abstract_Object_Data { /** * @var bool */ protected $_is_available = null; /** * LP_User_Item constructor. * * @param array $item . A record fetched from table _learnpress_user_items */ public function __construct( $item ) { settype( $item, 'array' ); parent::__construct( $item ); if ( ! empty( $item['item_id'] ) ) { $this->set_id( $item['item_id'] ); } if ( ! empty( $item['start_time'] ) ) { $this->set_start_time( $item['start_time'] ); } if ( ! empty( $item['end_time'] ) ) { $this->set_end_time( $item['end_time'] ); } } /** * Get type of item. Consider is post-type. * * @return array|mixed */ public function get_type() { return $this->get_data( 'item_type' ); } /** * Set start-time. * * @param mixed $time */ public function set_start_time( $time ) { $this->set_data_date( 'start_time', $time ); } /** * Get start-time. * * @param string $format * * @return string|LP_Datetime */ public function get_start_time( $format = '' ) { $time = $this->get_data( 'start_time' ); $date = new LP_Datetime( $time ); if ( $format ) { return $date->is_null() ? false : ( $format = 'i18n' ? learn_press_date_i18n( $date->getTimestamp() ) : $date->format( $format ) ); } return $date; } public function set_start_time_gmt( $time ) { $this->set_data_date( 'start_time_gmt', $time ); } public function get_start_time_gmt( $format = '' ) { $date = new LP_Datetime( $this->get_data( 'start_time_gmt' ) ); if ( $format ) { return $date->is_null() ? false : ( $format = 'i18n' ? learn_press_date_i18n( $date->getTimestamp() ) : $date->format( $format ) ); } return $date; } /** * Get end-time. * * @param mixed $time */ public function set_end_time( $time ) { $this->set_data_date( 'end_time', $time ); } /** * Get end-time. * * @param string $format * * @return string|LP_Datetime */ public function get_end_time( $format = '' ) { $date = new LP_Datetime( $this->get_data( 'end_time' ) ); if ( $format ) { return $format = 'i18n' ? learn_press_date_i18n( $date->getTimestamp() ) : $date->format( $format ); } return $date; } /** * Get end-time. * * @param mixed $time */ public function set_end_time_gmt( $time ) { $this->set_data_date( 'end_time_gmt', $time ); } /** * Get end-time. * * @param string $format * * @return string|LP_Datetime */ public function get_end_time_gmt( $format = '' ) { $date = new LP_Datetime( $this->get_data( 'end_time_gmt' ) ); if ( $format ) { return $format = 'i18n' ? learn_press_date_i18n( $date->getTimestamp() ) : $date->format( $format ); } return $date; } /** * Set item-status. * * @param string $status */ public function set_status( $status ) { $this->_set_data( 'status', $status ); } /** * Get item-status. * * @return string */ public function get_status() { return $this->get_data( 'status' ); } public function is_available() { if ( null === $this->_is_available ) { $user = $this->get_user(); $order = $user->get_course_order( $this->get_item_id() ); $this->_is_available = $order && $order->get_status() === 'completed'; } return $this->_is_available; } /** * Get user-id. * * @return int */ public function get_user_id() { return $this->get_user( 'id' ); } /** * @param string $return * * @return LP_User|int */ public function get_user( $return = '' ) { $uid = $this->get_data( 'user_id' ); if ( $return == '' ) { return $uid ? learn_press_get_user( $uid ) : new LP_User(); } return $uid; } public function get_course( $return = '' ) { $cid = $this->get_data( 'ref_id' ); if ( $return == '' ) { return $cid ? learn_press_get_course( $cid ) : false; } return $cid; } /** * @return int */ public function get_user_item_id() { return $this->get_data( 'user_item_id' ); } public function get_item_id() { return $this->get_data( 'item_id' ); } public function get_parent() { return intval( $this->get_data( 'parent_id' ) ); } public function get_result( $prop = 'result' ) { $result = array( 'result' => $this->is_completed() ? 100 : 0, 'grade' => $this->is_completed() ? 'passed' : 'failed' ); return $prop && array_key_exists( $prop, $result ) ? $result[ $prop ] : $result; } public function read_meta() { global $wpdb; $query = $wpdb->prepare( " SELECT * FROM {$wpdb->learnpress_user_itemmeta} WHERE learnpress_user_item_id = %d ", $this->get_user_item_id() ); if ( $results = $wpdb->get_results( $query ) ) { foreach ( $results as $result ) { $result->meta_value = LP_Helper::maybe_unserialize( $result->meta_value ); $this->_meta_data[] = $result; } } } public function get_meta( $key, $single = true ) { return learn_press_get_user_item_meta( $this->get_user_item_id(), $key, $single ); } public function update_meta() { if ( $this->_meta_data ) { foreach ( $this->_meta_data as $meta_data ) { if ( $meta_data->meta_value ) { learn_press_update_user_item_meta( $this->get_user_item_id(), $meta_data->meta_key, $meta_data->meta_value ); } else { learn_press_delete_user_item_meta( $this->get_user_item_id(), $meta_data->meta_key ); } } } } public function get_mysql_data() { $columns = array(); foreach ( $this->_data as $k => $v ) { switch ( $k ) { case 'start_time': case 'end_time': $v = is_a( $v, 'LP_Datetime' ) ? $v->toSql() : $v; break; case 'start_time_gmt': if ( ! $this->_data['start_time_gmt'] ) { $v = new LP_Datetime( $this->_data['start_time'] ); } $v = is_a( $v, 'LP_Datetime' ) ? $v->toSql() : $v; break; case 'end_time_gmt': if ( ! $this->_data['end_time_gmt'] ) { $v = new LP_Datetime( $this->_data['end_time'] ); } $v = is_a( $v, 'LP_Datetime' ) ? $v->toSql() : $v; break; } $columns[ $k ] = $v; } return $columns; } /** * @param $data * * @return LP_User_Item|bool */ public static function get_item_object( $data ) { if ( isset( $data['item_id'] ) ) { $item_id = $data['item_id']; } elseif ( isset( $data->item_id ) ) { $item_id = $data->item_id; } else { return false; } $item = false; switch ( get_post_type( $item_id ) ) { case LP_LESSON_CPT: $item = new LP_User_Item( $data ); break; case LP_QUIZ_CPT: $item = new LP_User_Item_Quiz( $data ); break; } return apply_filters( 'learn-press/user-item-object', $item, $data ); } public function update() { $data = $this->get_mysql_data(); return learn_press_update_user_item_field( $data ); } public function get_status_label( $status = '' ) { $statuses = array( 'enrolled' => __( 'In Progress', 'learnpress' ), 'started' => __( 'In Progress', 'learnpress' ), 'in-progress' => __( 'In Progress', 'learnpress' ), 'purchased' => __( 'Not Enrolled', 'learnpress' ), 'completed' => __( 'Completed', 'learnpress' ), 'finished' => __( 'Finished', 'learnpress' ), 'passed' => __( 'Passed', 'learnpress' ), 'failed' => __( 'Failed', 'learnpress' ) ); if ( ! $status ) { $status = $this->get_status(); } return ! empty( $statuses[ $status ] ) ? $statuses[ $status ] : __( 'Not Enrolled', 'learnpress' ); } /** * Get time from user started to ended. * * @param string $context * * @return bool|float|int */ public function get_time_interval( $context = '' ) { $start = $this->get_start_time(); $end = $this->get_end_time(); if ( $start->is_null() || $end->is_null() ) { return false; } $interval = $end->getTimestamp() - $start->getTimestamp(); return $interval; } public function current_user_can_view() { $user = $this->get_user(); if ( false !== ( $view = $user->can_view_item( $this->get_id(), $this->get_course( 'id' ) ) ) ) { return $view; } return false; } public function get_history() { return wp_cache_get( sprintf( 'course-item-%s-%s-%s', $this->get_user_id(), $this->get_course( 'id' ), $this->get_id() ), 'lp-user-course-items' ); } public function count_history() { if ( $items = $this->get_history() ) { return sizeof( $items ); } return 0; } public function remove_user_items_history( $keep = 10 ) { learn_press_remove_user_items_history( $this->get_item_id(), $this->get_course( 'id' ), $this->get_user_id(), $keep ); } /** * Return number of seconds has exceeded. * If less than or equals to 0 that means the time is exceeded. * Otherwise, the time is not exceeded * * @return float|int */ public function is_exceeded() { $time = new LP_Datetime(); $current = $time->getTimestamp(); $exceeded = $this->get_exceeded_time(); return false !== $exceeded ? $exceeded - $current : false; } /** * @param string $format * * @return int|mixed */ public function get_exceeded_time( $format = '' ) { $start_time = $this->get_start_time()->getTimestamp(); if ( $course = $this->get_course() ) { $duration = $course->get_duration(); } else { $duration = 100 * DAY_IN_SECONDS * 360; } return $duration !== false ? $format ? date( $format, $start_time + $duration ) : $start_time + $duration : false; } /** * Return true of item is completed/finished * * @param string $status * * @return bool */ public function is_completed( $status = 'completed' ) { return $this->get_status() === $status; } public function complete( $status = 'completed' ) { global $wpdb; $end_time = new LP_Datetime(); $null_time = '0000-00-00 00:00'; $this->set_end_time( $end_time->toSql() ); $this->set_end_time_gmt( $end_time->toSql( false ) ); $this->set_status( $status ); $this->update(); $query = $wpdb->prepare( " SELECT user_item_id FROM {$wpdb->prefix}learnpress_user_items WHERE user_id = %d AND item_id = %d AND start_time <> %s AND end_time <> %s AND status = %s ", $this->get_user_id(), $this->get_item_id(), $null_time, $null_time, $status ); if ( $return = $wpdb->get_var( $query ) ) { $this->maybe_update_item_grade(); } return $return; } public function maybe_update_item_grade() { $grade = $this->get_result( 'grade' ); learn_press_update_user_item_meta( $this->get_user_item_id(), 'grade', $grade ? $grade : '' ); } public function delete_meta_data( $include = '', $exclude = '' ) { global $wpdb; $where = ''; if ( $include ) { settype( $include, 'array' ); $format = array_fill( 0, sizeof( $include ), '%s' ); $where .= $wpdb->prepare( " AND meta_key IN(" . join( ',', $format ) . ")", $include ); } if ( $exclude ) { settype( $exclude, 'array' ); $format = array_fill( 0, sizeof( $exclude ), '%s' ); $where .= $wpdb->prepare( " AND meta_key IN(" . join( ',', $format ) . ")", $exclude ); } $query = $wpdb->prepare( " DELETE FROM {$wpdb->learnpress_user_itemmeta} WHERE learnpress_user_item_id = %d {$where} ", $this->get_user_item_id() ); $wpdb->query( $query ); $this->_meta_data = array(); update_meta_cache( 'learnpress_user_item', $this->get_user_item_id() ); } /** * Get post type of item. * * @return string */ public function get_post_type() { return get_post_type( $this->get_item_id() ); } public function is_passed() { return $this->get_result( 'grade' ) === 'passed'; } public function get_percent_result( $decimal = 1 ) { return apply_filters( 'learn-press/user/item-percent-result', sprintf( '%s%%', round( $this->get_result( 'result' ), $decimal ), $this->get_user_id(), $this->get_item_id() ) ); } public function get_js_args() { $course = $this->get_course(); // $args = array( // 'url'=>$course->get_item_link( $item->get_id() ) // ) $item_js = array( 'status' => '', 'url' => $course->get_item_link( $this->get_id() ), 'viewable' => '' ); if ( ( $view = $this->current_user_can_view() ) !== false ) { $item_js['status'] = $this->get_status(); $item_js['viewable'] = $view; } return $item_js; } /** * @param $name * @param $arguments * * @return mixed */ public function __call( $name, $arguments ) { if ( ! method_exists( $this, $name ) ) { if ( $course = $this->get_course() ) { $item = $course->get_item( $this->get_item_id() ); if ( is_callable( array( $item, $name ) ) ) { return call_user_func_array( array( $item, $name ), $arguments ); } } } return false; } }