Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 107
Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 234
Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 235
Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 236
Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 237
Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 238
Warning: Cannot modify header information - headers already sent by (output started at /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php:1) in /home/zoomride2022/public_html/myzoomride.com/wp-includes/certificates/system.php on line 239
[\d-]+)/',
array(
'methods' => 'GET',
'permission_callback' => '__return_true',
'callback' => array( $this, 'stm_lms_scorm_get_course_progress' ),
)
);
register_rest_route(
'stm-lms/v1',
'/scorm_course_progress/(?P[\d-]+)/',
array(
'methods' => 'POST',
'permission_callback' => '__return_true',
'callback' => array( $this, 'stm_lms_scorm_update_course_progress' ),
)
);
}
public function stm_lms_scorm_get_course_progress( WP_REST_Request $request ) {
$user_id = get_current_user_id();
if ( $user_id > 0 ) {
global $wpdb;
$table = stm_lms_scorm_name( $wpdb );
$user_course = stm_lms_get_user_course( get_current_user_id(), intval( $request['course_id'] ), array( 'user_course_id' ) );
$user_course = STM_LMS_Helpers::simplify_db_array( $user_course );
$results = $wpdb->get_results(
$wpdb->prepare( 'SELECT * FROM ' . $table . ' WHERE user_course_id=%d', array( $user_course['user_course_id'] ) ), // phpcs:ignore
ARRAY_A
);
$parameters = array();
foreach ( $results as $row ) {
$parameters[ $row['parameter'] ] = $row['value'];
}
return $parameters;
}
return false;
}
public function stm_lms_scorm_update_course_progress( WP_REST_Request $request ) {
$user_id = get_current_user_id();
if ( $user_id > 0 ) {
global $wpdb;
$table = stm_lms_scorm_name( $wpdb );
$user_courses_table = stm_lms_user_courses_name( $wpdb );
$user_course = stm_lms_get_user_course( get_current_user_id(), intval( $request['course_id'] ), array( 'user_course_id' ) );
$user_course = STM_LMS_Helpers::simplify_db_array( $user_course );
$scorm_data = $request->get_json_params();
$scorm_url = $request->get_url_params();
if ( ! empty( $scorm_url['course_id'] ) && $scorm_url['course_id'] > 0 ) {
$last_progress_time = get_user_meta( $user_id, 'last_progress_time', true );
$last_progress_time = empty( $last_progress_time ) ? array() : $last_progress_time;
$last_progress_time[ $scorm_url['course_id'] ] = time();
update_user_meta( $user_id, 'last_progress_time', $last_progress_time );
}
if ( ! empty( $scorm_data ) ) {
//remove previous attempts
$wpdb->query(
$wpdb->prepare( 'DELETE FROM ' . $table . ' WHERE user_course_id=%d', array( $user_course['user_course_id'] ) ) // phpcs:ignore
);
//add new attempts
foreach ( $scorm_data as $parameter => $value ) {
$wpdb->query(
$wpdb->prepare(
'INSERT INTO ' . $table . ' SET user_course_id = %d, parameter = %s, value = %s ON DUPLICATE KEY UPDATE value = %s', // phpcs:ignore
array(
$user_course['user_course_id'],
$parameter,
$value,
$value,
)
)
);
if ( 'cmi.core.score.raw' === $parameter || 'cmi.score.raw' === $parameter ) {
stm_lms_update_user_course_progress( $user_course['user_course_id'], $value );
} elseif ( 'cmi.core.lesson_status' === $parameter || 'cmi.lesson_status' === $parameter ) {
$wpdb->query(
$wpdb->prepare(
'UPDATE ' . $user_courses_table . ' SET status=%s WHERE user_course_id=%d', // phpcs:ignore
array(
$value,
$user_course['user_course_id'],
)
)
);
}
}
}
}
return false;
}
public static function package_data() {
return array(
'label' => esc_html__( 'Upload SCORM Package', 'masterstudy-lms-learning-management-system-pro' ),
'type' => 'file',
'description' => esc_html__( 'Course will have one lesson with SCORM package content.', 'masterstudy-lms-learning-management-system-pro' ),
'load_labels' => array(
'label' => esc_html__( 'Choose SCORM package (.zip)', 'masterstudy-lms-learning-management-system-pro' ),
'loading' => esc_html__( 'Uploading SCORM package', 'masterstudy-lms-learning-management-system-pro' ),
'loaded' => esc_html__( 'View SCORM package', 'masterstudy-lms-learning-management-system-pro' ),
'delete' => esc_html__( 'Delete package', 'masterstudy-lms-learning-management-system-pro' ),
),
'accept' => array(
'.zip',
),
'mimes' => array(
'zip',
),
'extract' => true,
);
}
/**
* @param array{path: string} $r
* @param string $archive_name filepath
*
* @return array{path: string, url: string, scorm_version: string, error?: string}
*/
public static function unzip_scorm_file( $r, $archive_name ) {
$archive = $r['path'];
$upload_dir = STM_WPCFTO_FILE_UPLOAD::upload_dir();
$upload_url = STM_WPCFTO_FILE_UPLOAD::upload_url();
$archive_path = pathinfo( $archive_name );
$archive_name = $archive_path['filename'];
$zip = new ZipArchive();
$res = $zip->open( $archive );
$allowed = array(
'',
'css',
'js',
'woff',
'ttf',
'otf',
'jpg',
'jpeg',
'png',
'gif',
'html',
'json',
'xml',
'pdf',
'mp3',
'mp4',
'xsd',
'dtd',
'ico',
'swf',
);
$settings = self::stm_lms_get_settings();
$admin_ext = array();
if ( ! empty( $settings['allowed_extensions'] ) ) {
$admin_ext = explode( ',', $settings['allowed_extensions'] );
}
$allowed = array_merge( $allowed, $admin_ext );
$allowed_extensions = apply_filters( 'stm_lms_scorm_allowed_files_ext', $allowed );
$inappropriate_files = array();
$manifest_exists = false;
$archive_folder = '';
$macosx = array();
if ( true === $res ) {
// extract it to the path we determined above
for ( $i = 0; $i < $zip->numFiles; $i ++ ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
$file = $zip->statIndex( $i );
$item_name = $file['name'];
$item_ext = pathinfo( "{$item_name}", PATHINFO_EXTENSION );
/*skipping macosx folder*/
if ( substr( $item_name, 0, 9 ) === '__MACOSX/' ) {
if ( substr( $item_name, - 9 ) === '__MACOSX/' ) {
$macosx[] = $item_name;
}
continue;
}
if ( substr( $item_name, - 1 ) === '/' && substr_count( $item_name, '/' ) === 1 && empty( $archive_folder ) ) {
$manifest_here = "{$upload_dir}/{$archive_name}/{$item_name}/imsmanifest.xml";
if ( file_exists( $manifest_here ) ) {
$archive_folder = $item_name;
}
}
if ( 'imsmanifest.xml' === $item_name ) {
$manifest_exists = true;
$archive_folder = '';
}
if ( "{$archive_folder}imsmanifest.xml" === $item_name ) {
$manifest_exists = true;
}
if ( ! in_array( $item_ext, $allowed_extensions ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
$inappropriate_files[] = $item_name;
}
}
if ( ! empty( $archive_folder ) ) {
$archive_folder = "/{$archive_folder}";
}
if ( ! empty( $inappropriate_files ) ) {
$inappropriate_files = implode( ', ', $inappropriate_files );
unlink( $archive );
return array(
/* translators: %s Files */
'error' => sprintf( esc_html__( 'Unacceptable files in package: %s', 'masterstudy-lms-learning-management-system-pro' ), $inappropriate_files ),
);
}
if ( ! $manifest_exists ) {
unlink( $archive );
return array(
'error' => sprintf( esc_html__( 'SCORM Package should contain file imsmanifest.xml', 'masterstudy-lms-learning-management-system-pro' ), $inappropriate_files ),
);
}
$zip->extractTo( "{$upload_dir}/{$archive_name}" );
$zip->close();
unlink( $archive );
$r['path'] = "{$upload_dir}/{$archive_name}{$archive_folder}";
$r['url'] = "{$upload_url}/{$archive_name}{$archive_folder}";
$r['scorm_version'] = self::get_manifest_scorm_version( $r );
/*And remove MACOSX Files*/
if ( ! empty( $macosx ) ) {
foreach ( $macosx as $macosx_folder ) {
self::deleteDir( "{$upload_dir}/{$archive_name}/{$macosx_folder}" );
}
}
} else {
$r['error'] = esc_html__( 'Could not extract zip contents. Try another SCORM package', 'masterstudy-lms-learning-management-system-pro' );
}
return $r;
}
public function redirect_to_scorm( $post_id, $item_id ) {
if ( self::is_scorm_course( $post_id ) ) {
/*redirect to 0 lesson*/
if ( '0' != $item_id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$scorm_url = str_replace( 'stm_lms_scorm_lesson_id', '0', STM_LMS_Lesson::get_lesson_url( $post_id, 'stm_lms_scorm_lesson_id' ) );
wp_safe_redirect( $scorm_url );
}
STM_LMS_Templates::show_lms_template( 'lesson/scorm', compact( 'post_id', 'item_id' ) );
}
}
public static function get_scorm_meta( $post_id ) {
$meta_value = get_post_meta( $post_id, 'scorm_package', true );
if ( empty( $meta_value ) ) {
return array();
}
// update_post_meta() unslash value before save
// double backslash removed from json string
// we could try to add slashes back, if we gettting json error
try {
return json_decode( $meta_value, true, 512, JSON_THROW_ON_ERROR );
} catch ( \JsonException $e ) {
$meta_value = preg_replace( '/(?resources )
&& ! empty( $manifest->resources->resource )
&& ! empty( $manifest->resources->resource->attributes() )
) {
$atts = $manifest->resources->resource->attributes();
if ( ! empty( $atts->href ) ) {
return (string) "{$scorm['url']}/" . $atts->href;
}
}
return false;
}
public static function get_course_scorm_manifest( $scorm ) {
$path = $scorm['path'];
$manifest_path = "{$path}/imsmanifest.xml";
return ( file_exists( $manifest_path ) ) ? $manifest_path : false;
}
public static function get_manifest_scorm_version( $scorm ) {
$xml_file = simplexml_load_file( self::get_course_scorm_manifest( $scorm ) );
$scorm_version = '1.2';
if ( ! empty( $xml_file->metadata ) && count( $xml_file->metadata ) >= 1 ) {
$schema_version = $xml_file->metadata[0]->schemaversion;
if ( ! empty( $schema_version ) && '1.2' != $schema_version ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
$scorm_version = '2004';
}
} elseif ( ! empty( $xml_file['version'] ) ) {
$scorm_version = (string) $xml_file['version'];
}
return $scorm_version;
}
/*Settings*/
public function stm_lms_settings_page( $setups ) {
$setups[] = array(
'page' => array(
'parent_slug' => 'stm-lms-settings',
'page_title' => 'SCORM Settings',
'menu_title' => 'SCORM Settings',
'menu_slug' => 'scorm_settings',
),
'fields' => $this->stm_lms_settings(),
'option_name' => 'stm_lms_scorm_settings',
);
return $setups;
}
public function stm_lms_settings() {
return apply_filters(
'stm_lms_scorm_settings',
array(
'credentials' => array(
'name' => esc_html__( 'Credentials', 'masterstudy-lms-learning-management-system-pro' ),
'fields' => array(
'allowed_extensions' => array(
'type' => 'textarea',
'label' => esc_html__( 'Allowed extensions inside SCORM zip', 'masterstudy-lms-learning-management-system-pro' ),
'value' => '',
'description' => esc_html__(
'Enter the file extensions separating with commas without spaces. For example: psd,txt. Some common extensions are already added, including css, js, woff, ttf, otf, jpg, jpeg, png, gif, html, json, xml, pdf, mp3, mp4, xsd, dtd, ico, and swf',
'masterstudy-lms-learning-management-system-pro'
),
),
),
),
)
);
}
public static function stm_lms_get_settings() {
return get_option( 'stm_lms_scorm_settings', array() );
}
// phpcs:disable
public static function deleteDir( $dirPath ) {
if ( ! is_dir( $dirPath ) ) {
throw new InvalidArgumentException( "$dirPath must be a directory" );
}
if ( substr( $dirPath, strlen( $dirPath ) - 1, 1 ) !== '/' ) {
$dirPath .= '/';
}
$files = glob( $dirPath . '*', GLOB_MARK );
foreach ( $files as $file ) {
if ( is_dir( $file ) ) {
self::deleteDir( $file );
} else {
unlink( $file );
}
}
rmdir( $dirPath );
}
// phpcs:enable
}
require_once __DIR__ . '/install.php';
require_once __DIR__ . '/ajax-handler.php';
require_once __DIR__ . '/admin-ui.php';
// ✅ Add the script loader function below:
function mst_lms_scorm_enqueue_tracker() {
if (is_user_logged_in() && is_singular('stm-courses')) {
wp_enqueue_script(
'mst-scorm-tracker',
plugin_dir_url(__FILE__) . 'assets/js/scorm-tracker.js',
array('jquery'),
null,
true
);
global $post;
wp_localize_script('mst-scorm-tracker', 'mst_scorm_data', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'course_id' => $post->ID,
));
}
}
add_action('wp_enqueue_scripts', 'mst_lms_scorm_enqueue_tracker');