862 lines
38 KiB
PHP
862 lines
38 KiB
PHP
<?php
|
|
/**
|
|
* This file contains all general functions for admin menu
|
|
*
|
|
* @package teachpress\core\admin
|
|
* @license http://www.gnu.org/licenses/gpl-2.0.html GPLv2 or later
|
|
*/
|
|
|
|
/**
|
|
* This class contains general functions for teachpress admin menus
|
|
* @since 5.0.0
|
|
* @package teachpress\core\admin
|
|
*/
|
|
class TP_Admin {
|
|
|
|
/**
|
|
* Tests if the database needs an update. If this is available a message will be displayed.
|
|
* @param $before This will be displayed before the message
|
|
* @param $after This will be displayed after the message
|
|
* @since 5.0.0
|
|
*/
|
|
public static function database_test($before = '', $after = '') {
|
|
$test = get_tp_option('db-version');
|
|
|
|
// Don't use !== operator here
|
|
if ($test != '') {
|
|
$version = get_tp_version();
|
|
if ($test !== $version) {
|
|
echo $before;
|
|
get_tp_message( __('A database update is necessary','teachpress') . '. <a href="options-general.php?page=teachpress/settings.php&up=1">' . __('Update to','teachpress') . ' ' . $version . '</a>.', 'orange' );
|
|
echo $after;
|
|
}
|
|
}
|
|
else {
|
|
echo $before;
|
|
get_tp_message( '<a href="options-general.php?page=teachpress/settings.php&ins=1">' . __('Install database','teachpress') . '</a>', 'orange' );
|
|
echo $after;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Extracts checkbox data for meta data fields and returns an array with the saved values.
|
|
*
|
|
* A string for checkbox data has the following structure:
|
|
* {value1},{value2},{value3}
|
|
*
|
|
* @param string $input
|
|
* @return array
|
|
* @since 5.0.0
|
|
*/
|
|
public static function extract_checkbox_data($input) {
|
|
$values = array();
|
|
$array_values = explode(',', $input);
|
|
foreach( $array_values as $element ) {
|
|
$element = str_replace(array('{','}'), array('',''), $element);
|
|
array_push($values, $element);
|
|
}
|
|
return $values;
|
|
}
|
|
|
|
/**
|
|
* Returns a select field for assessment types
|
|
* @param string $field_name The name of the field
|
|
* @param string $value The value of the field
|
|
* @param string $tabindex The tabindex number
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_assessment_type_field($field_name, $value, $tabindex = ''){
|
|
$return = '';
|
|
$return .= '<select name="' . $field_name . '" id="' . $field_name . '" tabindex="' . $tabindex . '">';
|
|
$options = array(
|
|
array( 'value' => 'grade', 'title' => __('Grade','teachpress') ),
|
|
array( 'value' => 'percentage', 'title' => __('Percentage','teachpress') ),
|
|
array( 'value' => 'points', 'title' => __('Points','teachpress') )
|
|
);
|
|
foreach ($options as $opt) {
|
|
$selected = ( $value == $opt['value'] ) ? 'selected="selected"' : '';
|
|
$return .= '<option value="' . stripslashes($opt['value']) . '" ' . $selected . '>' . stripslashes($opt['title']) . '</option>';
|
|
}
|
|
$return .= '</select>';
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Returns a select field for assessment_passed
|
|
* @param string $field_name The name of the field
|
|
* @param string $value the value of the field
|
|
* @param string $tabindex The tabindex number
|
|
* @return string
|
|
*/
|
|
public static function get_assessment_passed_field($field_name, $value, $tabindex = '') {
|
|
$return = '';
|
|
$return .= '<select name="' . $field_name . '" id="' . $field_name . '" tabindex="' . $tabindex . '">';
|
|
$options = array(
|
|
array( 'value' => '0', 'title' => __('not passed','teachpress') ),
|
|
array( 'value' => '1', 'title' => __('passed','teachpress') )
|
|
);
|
|
foreach ($options as $opt) {
|
|
$selected = ( $value == $opt['value'] ) ? 'selected="selected"' : '';
|
|
$return .= '<option value="' . stripslashes($opt['value']) . '" ' . $selected . '>' . stripslashes($opt['title']) . '</option>';
|
|
}
|
|
$return .= '</select>';
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Returns checkbox fields for admin form
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param string $checked value for the field
|
|
* @param boolean $readonly true or false, default is false
|
|
* @param boolean $required true or false, default is false
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_checkbox_field ($field_name, $label, $checked, $readonly = false, $required = false) {
|
|
global $wpdb;
|
|
$return = '';
|
|
$options = $wpdb->get_results("SELECT * FROM " . TEACHPRESS_SETTINGS . " WHERE `category` = '" . esc_sql($field_name) . "' ORDER BY value ASC");
|
|
$ro = ( $readonly === true ) ? 'readonly="true" ' : '' ;
|
|
$rq = ( $required === true ) ? 'required="required"' : '';
|
|
|
|
// extrakt checkbox_values
|
|
$array_checked = self::extract_checkbox_data($checked);
|
|
$return .= '<p><label for="' . $field_name . '"><b>' . stripslashes($label) . '</b></label></p>';
|
|
$i = 1;
|
|
$max = count($options);
|
|
foreach ($options as $opt) {
|
|
$checked = ( in_array($opt->value, $array_checked) ) ? 'checked="checked"' : '';
|
|
$rq = ( $max === 1 ) ? $rq : ''; // The required option is only available for single checkboxes
|
|
$return .= '<input name="' . $field_name . '[]" type="checkbox" id="' . $field_name . '_' . $i . '" value="' . stripslashes($opt->value) . '" ' . $checked . ' ' . $ro . ' ' . $rq . '/> <label for="' . $field_name . '_' . $i . '">' . stripslashes($opt->value) . '</label><br/>';
|
|
$i++;
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Returns date select fields for admin form
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param string $value value for the field
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_date_field ($field_name, $label, $value) {
|
|
if ( $value != '' ) {
|
|
$b = tp_datesplit($value);
|
|
}
|
|
$day = ( $value != '' ) ? $b[0][2] : '01';
|
|
$month = ( $value != '' ) ? $b[0][1] : '01';
|
|
$year = ( $value != '' ) ? $b[0][0] : '19xx';
|
|
$months = array (
|
|
__('Jan','teachpress'),
|
|
__('Feb','teachpress'),
|
|
__('Mar','teachpress'),
|
|
__('Apr','teachpress'),
|
|
__('May','teachpress'),
|
|
__('Jun','teachpress'),
|
|
__('Jul','teachpress'),
|
|
__('Aug','teachpress'),
|
|
__('Sep','teachpress'),
|
|
__('Oct','teachpress'),
|
|
__('Nov','teachpress'),
|
|
__('Dec','teachpress') );
|
|
$return = '';
|
|
$return .= '<p><b>' . stripslashes($label) . '</b></p>';
|
|
$return .= '<input name="' . $field_name . '_day" id="' . $field_name . '_day" type="text" title="Day" size="2" value="' . $day . '"/>';
|
|
$return .= '<select name="' . $field_name . '_month" id="' . $field_name . '_month" title="' . __('Month','teachpress') . '">';
|
|
for ( $i = 1; $i <= 12; $i++ ) {
|
|
$m = ( $i < 10 ) ? '0' . $i : $i;
|
|
$selected = ($month == $m) ? 'selected="selected"' : '';
|
|
$return .= '<option value="' . $m . '" ' . $selected . '>' . $months[$i-1] . '</option>';
|
|
}
|
|
$return .= '</select>';
|
|
$return .= '<input name="' . $field_name . '_year" id="' . $field_name . '_year" type="text" title="' . __('Year','teachpress') . '" size="4" value="' . $year . '"/>';
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Returns a number field for admin form
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param int $value value for the field
|
|
* @param int $min default is 0
|
|
* @param int $max default is 999
|
|
* @param int $step default is 1
|
|
* @param boolean $readonly true or false, default is false
|
|
* @param boolean $required true or false, default is false
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_int_field($field_name, $label, $value, $min = 0, $max = 999, $step = 1, $readonly = false, $required = false){
|
|
$ro = ( $readonly === true ) ? 'readonly="true" ' : '' ;
|
|
$r = ( $required === true ) ? 'required="required"' : '';
|
|
return '<p><label for="' . $field_name . '"><b>' . stripslashes($label) . '</b></label></p>
|
|
<input name="' . $field_name . '" type="number" id="' . $field_name . '" value="' . $value . '" size="50" ' . $ro . ' ' . $r . ' min="' . $min . '" max="' . $max . '" step="' . $step . '"/>';
|
|
}
|
|
|
|
/**
|
|
* Returns radio fields for admin form
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param string $value current value for the field
|
|
* @param boolean $readonly true or false, default is false
|
|
* @param boolean $required true or false, default is false
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_radio_field ($field_name, $label, $value, $readonly = false, $required = false) {
|
|
global $wpdb;
|
|
$return = '';
|
|
$options = $wpdb->get_results("SELECT * FROM " . TEACHPRESS_SETTINGS . " WHERE `category` = '" . esc_sql($field_name) . "' ORDER BY value ASC");
|
|
$ro = ( $readonly === true ) ? 'readonly="true" ' : '' ;
|
|
$rq = ( $required === true ) ? 'required="required"' : '';
|
|
$return .= '<p><label for="' . $field_name . '"><b>' . stripslashes($label) . '</b></label></p>';
|
|
$i = 1;
|
|
foreach ($options as $opt) {
|
|
$checked = ( $value == $opt->value ) ? 'checked="checked"' : '';
|
|
$return .= '<input name="' . $field_name . '" type="radio" id="' . $field_name . '_' . $i . '" value="' . stripslashes($opt->value) . '" ' . $checked . ' ' . $ro . ' ' . $rq . '/> <label for="' . $field_name . '_' . $i . '">' . stripslashes($opt->value) . '</label><br/>';
|
|
$i++;
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Returns a select field for admin/settings screens
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param string $value value for the field
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_select_field ($field_name, $label, $value) {
|
|
global $wpdb;
|
|
$return = '';
|
|
$return .= '<p><label for="' . $field_name . '"><b>' . stripslashes($label) . '</b></label></p>';
|
|
$return .= '<select name="' . $field_name . '" id="' . $field_name . '">';
|
|
$options = $wpdb->get_results("SELECT * FROM " . TEACHPRESS_SETTINGS . " WHERE `category` = '" . esc_sql($field_name) . "' ORDER BY value ASC");
|
|
if ( $value == '' ) {
|
|
$return .= '<option value="">- ' . __('none','teachpress') . ' -</option>';
|
|
}
|
|
foreach ($options as $opt) {
|
|
$return .= TP_Admin::get_select_option(stripslashes($opt->value), stripslashes($opt->value), $value);
|
|
}
|
|
$return .= '</select>';
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Returns a single option for a select field
|
|
* @param string $value The option value
|
|
* @param string $label The option label
|
|
* @param string $match If $match is the same as $value the option is set as selected
|
|
* @return string
|
|
* @since 7.1.0
|
|
*/
|
|
public static function get_select_option($value, $label, $match) {
|
|
$s = ( $match == $value ) ? 'selected="selected"' : '';
|
|
return '<option value="' . $value . '" ' . $s . '>' . $label . '</option>';
|
|
}
|
|
|
|
/**
|
|
* Returns a text field for admin/settings screens
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param string $value value for the field
|
|
* @param boolean $readonly
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_text_field($field_name, $label, $value, $readonly = false) {
|
|
$ro = ( $readonly === false ) ? '' : 'readonly="true" ';
|
|
return '<p><label for="' . $field_name . '"><b>' . stripslashes($label) . '</b></label></p>
|
|
<input name="' . $field_name . '" type="text" id="' . $field_name . '" value="' . stripslashes($value) . '" size="50" ' . $ro . '/>';
|
|
}
|
|
|
|
/**
|
|
* Returns a textarea field for admin/settings screens
|
|
* @param string $field_name name/id of the field
|
|
* @param string $label label for the field
|
|
* @param string $value value for the field
|
|
* @return string
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_textarea_field ($field_name, $label, $value) {
|
|
return '<p><label for="' . $field_name . '"><b>' . stripslashes($label) . '</b></label><p>
|
|
<textarea name="' . $field_name . '" id="' . $field_name . '" style="width:100%; height:80px;">' . stripslashes($value) . '</textarea>';
|
|
}
|
|
|
|
/**
|
|
* Returns a form field for the add_publication_page()
|
|
* @param array $atts {
|
|
* @type string $name field name
|
|
* @type string $title field title
|
|
* @type string $label field label
|
|
* @type string $field_type field type (textarea|input)
|
|
* @type string $field_value field value of the current/visible entry
|
|
* @type int $tabindex the tab index
|
|
* @type string $display defines if the field is visible or not (block|none)
|
|
* @type string $style css style attributes
|
|
* @type string $container_misc used for custom attributes of the enclosing div container
|
|
* }
|
|
* @return string
|
|
* @since 5.0.0
|
|
* @version 2
|
|
*/
|
|
public static function get_form_field ($atts) {
|
|
$param = shortcode_atts(array(
|
|
'name' => '',
|
|
'title' => '',
|
|
'label' => '',
|
|
'type' => '',
|
|
'value' => '',
|
|
'tabindex' => '',
|
|
'display' => 'block',
|
|
'style' => ''
|
|
), $atts);
|
|
|
|
if ( $param['type'] === 'textarea' ) {
|
|
$field = '<textarea name="' . $param['name'] . '" id="' . $param['name'] . '" wrap="virtual" style="' . $param['style'] . '" tabindex="' . $param['tabindex'] . '" title="' . stripslashes($param['title']) . '">' . stripslashes($param['value']) . '</textarea>';
|
|
}
|
|
else {
|
|
$field = '<input name="' . $param['name'] . '" id="' . $param['name']. '" type="text" title="' . stripslashes($param['title']) . '" style="' . $param['style'] . '" value="' . stripslashes($param['value']) . '" tabindex="' . $param['tabindex'] . '" />';
|
|
}
|
|
|
|
$a = '<div id="div_' . $param['name'] . '" style="display:' . $param['display']. '">
|
|
<p><label for="' . $param['name'] . '" title="' . stripslashes($param['title']) . '"><strong>' . stripslashes($param['label']) . '</strong></label></p>
|
|
' . $field . '</div>';
|
|
return $a;
|
|
}
|
|
|
|
/**
|
|
* Returns a checkbox for admin/settings screens
|
|
* @param string $name The field name of the checkbox
|
|
* @param string $label The label text for the checkbox
|
|
* @param string $value The checkbox value
|
|
* @param description A text which is displayed as hover over the label text
|
|
* @param boolean $disabled
|
|
* @return string
|
|
* @since 5.0.0
|
|
* @version 2
|
|
*/
|
|
public static function get_checkbox($name, $label, $value, $description = '', $disabled = false) {
|
|
$checked = ( $value == '1' ) ? 'checked="checked"' : '';
|
|
$dis = ( $disabled === true ) ? ' disabled="disabled"' : '';
|
|
$descr = ( $description != '' ) ? 'title="' . $description . '"' : '';
|
|
return '<input name="' . $name . '" id="' . $name . '" type="checkbox" value="1" ' . $checked . $dis .'/> <label for="' . $name . '" ' . $descr . '>' . stripslashes($label) . '</label>';
|
|
}
|
|
|
|
/**
|
|
* Displays a box for editing some options (terms|type|studies) for courses
|
|
* @param string $title
|
|
* @param string $type
|
|
* @param array $options (element_title|add_title|delete_title|count_title|tab)
|
|
* @since 5.0.0
|
|
*/
|
|
public static function get_course_option_box ( $title, $type, $options = array() ) {
|
|
global $wpdb;
|
|
echo '<h3>' . $title . '</h3>';
|
|
echo '<table border="0" cellspacing="0" cellpadding="0" class="widefat">';
|
|
echo '<thead>';
|
|
echo '<tr>';
|
|
echo '<th width="10"></th>';
|
|
echo '<th>' . $options['element_title'] . '</th>';
|
|
if ( $type === 'term' || $type === 'course_of_studies' || $type === 'type' ) {
|
|
echo '<th width="150">' . $options['count_title'] . '</th>';
|
|
}
|
|
echo '</tr>';
|
|
echo '</thead>';
|
|
echo '<tbody>';
|
|
|
|
if ( $type === 'term' ) {
|
|
$sql = "SELECT number, value, setting_id FROM ( SELECT COUNT(v.semester) as number, e.variable AS value, e.setting_id as setting_id, e.category as category FROM " . TEACHPRESS_SETTINGS . " e LEFT JOIN " . TEACHPRESS_COURSES . " v ON e.variable = v.semester GROUP BY e.variable ORDER BY number DESC ) AS temp WHERE category = 'semester' ORDER BY setting_id";
|
|
}
|
|
elseif ( $type === 'type' ) {
|
|
$sql = "SELECT number, value, setting_id FROM ( SELECT COUNT(v.type) as number, e.value AS value, e.setting_id as setting_id, e.category as category FROM " . TEACHPRESS_SETTINGS . " e LEFT JOIN " . TEACHPRESS_COURSES . " v ON e.value = v.type GROUP BY e.value ORDER BY number DESC ) AS temp WHERE category = 'course_type' ORDER BY value";
|
|
}
|
|
elseif ( $type === 'course_of_studies' ) {
|
|
$sql = "SELECT number, value, setting_id FROM ( SELECT COUNT(m.meta_value) as number, e.value AS value, e.setting_id as setting_id, e.category as category FROM " . TEACHPRESS_SETTINGS . " e LEFT JOIN " . TEACHPRESS_STUD_META . " m ON e.value = m.meta_value GROUP BY e.value ORDER BY number DESC ) AS temp WHERE category = 'course_of_studies' ORDER BY value";
|
|
}
|
|
else {
|
|
$sql = "SELECT * FROM " . TEACHPRESS_SETTINGS . " WHERE `category` = '" . esc_sql($type) . "' ORDER BY value ASC";
|
|
}
|
|
|
|
$row = $wpdb->get_results($sql);
|
|
$class_alternate = true;
|
|
foreach ($row as $row) {
|
|
if ( $class_alternate === true ) {
|
|
$tr_class = 'class="alternate"';
|
|
$class_alternate = false;
|
|
}
|
|
else {
|
|
$tr_class = '';
|
|
$class_alternate = true;
|
|
}
|
|
echo '<tr ' . $tr_class . '>';
|
|
echo '<td><a title="' . $options['delete_title'] . '" href="options-general.php?page=teachpress/settings.php&delete=' . $row->setting_id . '&tab=' . $options['tab'] . '" class="teachpress_delete">X</a></td>';
|
|
echo '<td>' . stripslashes($row->value) . '</td>';
|
|
if ( $type === 'term' || $type === 'course_of_studies' || $type === 'type' ) {
|
|
echo '<td>' . $row->number . '</td>';
|
|
}
|
|
echo '</tr>';
|
|
}
|
|
|
|
echo '<tr>';
|
|
echo '<td></td>';
|
|
echo '<td colspan="2"><input name="new_' . $type . '" type="text" id="new_' . $type . '" size="30" value="' . $options['add_title'] . '" onblur="if(this.value==' . "''" .') this.value='. "'" . $options['add_title'] . "'" . ';" onfocus="if(this.value=='. "'" . $options['add_title'] . "'" . ') this.value=' . "''" . ';"/> <input name="add_' . $type . '" type="submit" class="button-secondary" value="' . __('Create','teachpress') . '"/></td>';
|
|
echo '</tr>';
|
|
|
|
echo '</tbody>';
|
|
echo '</table>';
|
|
}
|
|
|
|
/**
|
|
* Displays the meta data section of publications / courses in admin menus
|
|
* @param array $fields
|
|
* @param array $meta_input
|
|
* @since 5.0.0
|
|
*/
|
|
public static function display_meta_data($fields, $meta_input) {
|
|
|
|
echo '<div class="postbox">';
|
|
echo '<h3 class="tp_postbox"><span>' . __('Custom meta data','teachpress') . '</span></h3>';
|
|
|
|
echo '<div class="inside">';
|
|
foreach ($fields as $row) {
|
|
$col_data = TP_DB_Helpers::extract_column_data($row['value']);
|
|
$required = ( $col_data['required'] === 'true' ) ? true : false;
|
|
$value = '';
|
|
foreach ( $meta_input as $row_meta ) {
|
|
if ( $row['variable'] === $row_meta['meta_key'] ) {
|
|
$value = $row_meta['meta_value'];
|
|
break;
|
|
}
|
|
}
|
|
if ( $col_data['type'] === 'SELECT' ) {
|
|
echo TP_Admin::get_select_field($row['variable'], $col_data['title'], $value);
|
|
}
|
|
elseif ( $col_data['type'] === 'DATE' ) {
|
|
echo TP_Admin::get_date_field($row['variable'], $col_data['title'], $value);
|
|
}
|
|
elseif ( $col_data['type'] === 'RADIO' ) {
|
|
echo TP_Admin::get_radio_field($row['variable'], $col_data['title'], $value, false, $required);
|
|
}
|
|
elseif ( $col_data['type'] === 'CHECKBOX' ) {
|
|
echo TP_Admin::get_checkbox_field($row['variable'], $col_data['title'], $value, false, $required);
|
|
}
|
|
elseif ( $col_data['type'] === 'TEXTAREA' ) {
|
|
echo TP_Admin::get_textarea_field($row['variable'], $col_data['title'], $value);
|
|
}
|
|
elseif ( $col_data['type'] === 'INT' ) {
|
|
$col_data['min'] = ( $col_data['min'] !== 'false' ) ? intval($col_data['min']) : 0;
|
|
$col_data['max'] = ( $col_data['max'] !== 'false' ) ? intval($col_data['max']) : 999;
|
|
$col_data['step'] = ( $col_data['step'] !== 'false' ) ? intval($col_data['step']) : 1;
|
|
echo TP_Admin::get_int_field($row['variable'], $col_data['title'], $value, $col_data['min'], $col_data['max'], $col_data['step'], false, $required);
|
|
}
|
|
else {
|
|
echo TP_Admin::get_text_field($row['variable'], $col_data['title'], $value);
|
|
}
|
|
}
|
|
echo '</div>';
|
|
echo '</div>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This class contains functions for copying courses via admin menu
|
|
* @since 5.0.15
|
|
*/
|
|
class tp_copy_course {
|
|
|
|
/**
|
|
* This function copies courses
|
|
* @param array $checkbox An array of the course IDs you want to copy
|
|
* @param string $copysem The target semester
|
|
* @since 5.0.15
|
|
*/
|
|
public static function init ($checkbox, $copysem) {
|
|
$max = count( $checkbox );
|
|
|
|
// read course data
|
|
for( $i = 0; $i < $max; $i++ ) {
|
|
$original_course_id = intval($checkbox[$i]);
|
|
$new_courses[$i]['orig_id'] = $original_course_id;
|
|
$new_courses[$i]['new_id'] = 0;
|
|
$new_courses[$i]['data'] = TP_Courses::get_course($original_course_id, ARRAY_A);
|
|
$new_courses[$i]['meta'] = TP_Courses::get_course_meta($original_course_id);
|
|
$new_courses[$i]['orig_semester'] = $new_courses[$i]['data']['semester'];
|
|
$new_courses[$i]['data']['semester'] = $copysem;
|
|
|
|
// if is a normal course: copy
|
|
if ( $new_courses[$i]['data']['parent'] == 0 ) {
|
|
$new_courses[$i]['new_id'] = self::add_course($new_courses[$i]['data'], $new_courses[$i]['meta']);
|
|
}
|
|
}
|
|
|
|
// For sub courses
|
|
for( $i = 0; $i < $max; $i++ ) {
|
|
if ( $new_courses[$i]['data']['parent'] == 0 ) {
|
|
continue;
|
|
}
|
|
|
|
// Find parent course
|
|
$new_parent = self::find_parent($new_courses, $max, $new_courses[$i]['data']['parent']);
|
|
echo $new_parent;
|
|
if ( $new_courses[$i]['orig_semester'] === $copysem && $new_parent === 0 ) {
|
|
// use the old parent
|
|
}
|
|
else {
|
|
// set a new parent
|
|
$new_courses[$i]['data']['parent'] = $new_parent;
|
|
}
|
|
|
|
self::add_course($new_courses[$i]['data'], $new_courses[$i]['meta']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds a course based on data of an old course
|
|
* @param array $data
|
|
* @param array $meta_data
|
|
* @return int The ID of the created course
|
|
* @access private
|
|
* @since 5.0.15
|
|
*/
|
|
private static function add_course ($data, $meta_data) {
|
|
|
|
// reset data
|
|
$data['rel_page_alter'] = 0;
|
|
$data['start_hour'] = '00';
|
|
$data['start_minute'] = '00';
|
|
$data['end_hour'] = '00';
|
|
$data['end_minute'] = '00';
|
|
$data['start'] = '00';
|
|
$data['end'] = '00';
|
|
|
|
// add data
|
|
$new_id = TP_Courses::add_course($data, array('number' => 0));
|
|
foreach ( $meta_data as $meta_row ) {
|
|
TP_Courses::add_course_meta($new_id, $meta_row['meta_key'], $meta_row['meta_value']);
|
|
}
|
|
return $new_id;
|
|
}
|
|
|
|
/**
|
|
* Checks if a parent course was in the selection for copying courses and returns the new id of his copy
|
|
* @param array $new_courses The new courses array
|
|
* @param int $max The length of the new courses array
|
|
* @param int $parent_id The ID your searching for
|
|
* @return int Returns the new ID or 0 if there was nothing found
|
|
* @access private
|
|
* @since 5.0.15
|
|
*/
|
|
private static function find_parent ($new_courses, $max, $parent_id) {
|
|
$new_parent_id = 0;
|
|
|
|
for( $i = 0; $i < $max; $i++ ) {
|
|
if ( $new_courses[$i]['orig_id'] == $parent_id ) {
|
|
$new_parent_id = $new_courses[$i]['new_id'];
|
|
break;
|
|
}
|
|
}
|
|
return $new_parent_id;
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets all drafts of a post type as options for select menus
|
|
* @param string $post_type
|
|
* @param string $post_status Default is "publish"
|
|
* @param string $sort_column Default is "menu_order"
|
|
* @param string $sort_order Defalut is "ASC"
|
|
* @since 5.0.0
|
|
*/
|
|
function get_tp_wp_drafts($post_type, $post_status = 'publish', $sort_column = 'menu_order', $sort_order = 'ASC') {
|
|
global $wpdb;
|
|
echo "\n\t<option value='0'>" . __('none','teachpress') . "</option>";
|
|
$items = $wpdb->get_results( "SELECT `ID`, `post_title` FROM $wpdb->posts WHERE `post_type` = '" . esc_sql($post_type) . "' AND `post_status` = '" . esc_sql($post_status) . "' ORDER BY " . esc_sql($sort_column) . " " . esc_sql($sort_order) );
|
|
foreach ( $items as $item ) {
|
|
echo "\n\t<option value='$item->ID'>" . get_the_title($item->ID) . "</option>";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This function handles document uploads in teachPress
|
|
* @since 5.0.0
|
|
*/
|
|
function tp_handle_document_uploads(){
|
|
check_ajax_referer('document-upload');
|
|
$course_id = ( isset ($_POST['course_id']) ) ? intval($_POST['course_id']) : 0;
|
|
$status = tp_handle_upload($_FILES['async-upload'], array('action' => 'tp_document_upload'), $course_id);
|
|
// print_r($status);
|
|
if ( isset($status['error']) ) {
|
|
echo htmlspecialchars($status['error']);
|
|
exit;
|
|
}
|
|
$doc_id = TP_Documents::add_document($status['filename'], $status['path'], $status['size'], $course_id);
|
|
$upload_dir = wp_upload_dir();
|
|
echo $doc_id . ' | ' . $course_id . ' | ' . esc_url($upload_dir['baseurl'] . $status['path']);
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Handle PHP uploads in teachPress, sanitizing file names, checking extensions for mime type,
|
|
* and moving the file to the appropriate directory within the uploads directory. The function is a modified copy
|
|
* of wp_handle_upload(), but uses the teachpress upload directory
|
|
*
|
|
* @since 5.0.0
|
|
*
|
|
* @param array $file Reference to a single element of $_FILES. Call the function once for each uploaded file.
|
|
* @param array $overrides Optional. An associative array of names=>values to override default variables with extract( $overrides, EXTR_OVERWRITE ).
|
|
* @param int $course_id ID of a teachPress course.
|
|
* @return array On success, returns an associative array of file attributes. On failure, returns $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ).
|
|
*/
|
|
function tp_handle_upload( &$file, $overrides = false, $course_id = 0 ) {
|
|
// The default error handler.
|
|
if ( ! function_exists( 'wp_handle_upload_error' ) ) {
|
|
/**
|
|
* Returns an upload error message
|
|
* @param array $file
|
|
* @param string $message
|
|
* @return array
|
|
* @since 5.0.0
|
|
*/
|
|
function wp_handle_upload_error( &$file, $message ) {
|
|
return array( 'error'=>$message );
|
|
}
|
|
}
|
|
|
|
$file = apply_filters( 'wp_handle_upload_prefilter', $file );
|
|
|
|
// You may define your own function and pass the name in $overrides['upload_error_handler']
|
|
$upload_error_handler = 'wp_handle_upload_error';
|
|
|
|
// You may have had one or more 'wp_handle_upload_prefilter' functions error out the file. Handle that gracefully.
|
|
if ( isset( $file['error'] ) && !is_numeric( $file['error'] ) && $file['error'] ) {
|
|
return $upload_error_handler( $file, $file['error'] );
|
|
}
|
|
|
|
// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
|
|
$upload_error_strings = array( false,
|
|
__( "The uploaded file exceeds the upload_max_filesize directive in php.ini." ),
|
|
__( "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form." ),
|
|
__( "The uploaded file was only partially uploaded." ),
|
|
__( "No file was uploaded." ),
|
|
'',
|
|
__( "Missing a temporary folder." ),
|
|
__( "Failed to write file to disk." ),
|
|
__( "File upload stopped by extension." ));
|
|
|
|
// All tests are on by default. Most can be turned off by $overrides[{test_name}] = false;
|
|
$test_size = true;
|
|
$test_upload = true;
|
|
|
|
// If you override this, you must provide $ext and $type!!!!
|
|
$test_type = true;
|
|
$mimes = false;
|
|
|
|
// Install user overrides. Did we mention that this voids your warranty?
|
|
if ( is_array( $overrides ) ) {
|
|
extract( $overrides, EXTR_OVERWRITE );
|
|
}
|
|
|
|
// A successful upload will pass this test. It makes no sense to override this one.
|
|
if ( isset( $file['error'] ) && $file['error'] > 0 ) {
|
|
return call_user_func( $upload_error_handler, $file, $upload_error_strings[ $file['error'] ] );
|
|
}
|
|
|
|
// A non-empty file will pass this test.
|
|
if ( $test_size && !($file['size'] > 0 ) ) {
|
|
$error_msg = __( 'File is empty. Please upload something more substantial.' );
|
|
return call_user_func($upload_error_handler, $file, $error_msg);
|
|
}
|
|
|
|
// A properly uploaded file will pass this test. There should be no reason to override this one.
|
|
if ( $test_upload && ! @ is_uploaded_file( $file['tmp_name'] ) ) {
|
|
return call_user_func($upload_error_handler, $file, __( 'Specified file failed upload test.' ));
|
|
}
|
|
|
|
// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.
|
|
if ( $test_type ) {
|
|
$wp_filetype = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'], $mimes );
|
|
|
|
extract( $wp_filetype );
|
|
|
|
// Check to see if wp_check_filetype_and_ext() determined the filename was incorrect
|
|
if ( $proper_filename ) {
|
|
$file['name'] = $proper_filename;
|
|
}
|
|
if ( ( !$type || !$ext ) && !current_user_can( 'unfiltered_upload' ) ) {
|
|
return call_user_func($upload_error_handler, $file, __( 'Sorry, this file type is not permitted for security reasons.' ));
|
|
}
|
|
if ( !$ext ) {
|
|
$ext = ltrim(strrchr($file['name'], '.'), '.');
|
|
}
|
|
if ( !$type ) {
|
|
$type = $file['type'];
|
|
}
|
|
} else {
|
|
$type = '';
|
|
}
|
|
|
|
// If there is a course_id use it in the file path
|
|
$extra_directory_part = '';
|
|
if ( $course_id !== 0 ) {
|
|
$extra_directory_part = "/course_$course_id";
|
|
}
|
|
|
|
// A writable uploads dir will pass this test. Again, there's no point overriding this one.
|
|
if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) ) {
|
|
return call_user_func($upload_error_handler, $file, $uploads['error'] );
|
|
}
|
|
$filename = wp_unique_filename( $uploads['basedir'] . "/teachpress$extra_directory_part", $file['name'] );
|
|
|
|
// Move the file to the uploads dir
|
|
wp_mkdir_p($uploads['basedir'] . "/teachpress$extra_directory_part");
|
|
$new_file = $uploads['basedir'] . "/teachpress$extra_directory_part/$filename";
|
|
if ( false === @ move_uploaded_file( $file['tmp_name'], $new_file ) ) {
|
|
if ( 0 === strpos( $uploads['basedir'], ABSPATH ) ) {
|
|
$error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . "/teachpress$extra_directory_part/$filename";
|
|
}
|
|
else {
|
|
$error_path = basename( $uploads['basedir'] ) . "/teachpress$extra_directory_part/$filename";
|
|
}
|
|
return $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $error_path ) );
|
|
}
|
|
|
|
// Set correct file permissions
|
|
$stat = stat( dirname( $new_file ));
|
|
$perms = $stat['mode'] & 0000666;
|
|
@ chmod( $new_file, $perms );
|
|
|
|
// Compute the URL
|
|
$url = $uploads['url'] . "/$filename";
|
|
|
|
if ( is_multisite() ) {
|
|
delete_transient( 'dirsize_cache' );
|
|
}
|
|
/**
|
|
* Filter the data array for the uploaded files
|
|
*
|
|
* @param array $upload {
|
|
* Array of upload data.
|
|
*
|
|
* @type string $file Filename of the newly-uploaded file.
|
|
* @type string $url URL of the uploaded file.
|
|
* @type string $path The directory path of the uploaded file, file name included.
|
|
* @type string $type File type.
|
|
* @type int $size File size.
|
|
* @type string $filename File name.
|
|
* }
|
|
* @param string $context The type of upload action. Accepts 'upload' or 'sideload'.
|
|
*/
|
|
return apply_filters( 'wp_handle_upload', array( 'file' => $new_file,
|
|
'url' => $url,
|
|
'path' => "/teachpress$extra_directory_part/$filename",
|
|
'type' => $type,
|
|
'size' => $file['size'],
|
|
'filename' => $filename ), 'upload' );
|
|
}
|
|
|
|
/**
|
|
* Get WordPress pages
|
|
* adapted from Flexi Pages Widget Plugin
|
|
* @param string $sort_column Default is "menu_order"
|
|
* @param string $sort_order Default is "ASC"
|
|
* @param string $selected
|
|
* @param string $post_type Default is "page"
|
|
* @param int $parent Default is 0
|
|
* @param int $level Default is 0
|
|
* @since 1.0.0
|
|
*/
|
|
function get_tp_wp_pages($sort_column = "menu_order", $sort_order = "ASC", $selected = '', $post_type = 'page', $parent = 0, $level = 0 ) {
|
|
global $wpdb;
|
|
if ( $level == 0 ) {
|
|
$pad = isset ($pad) ? $pad : '';
|
|
if ( $selected == '0' ) {
|
|
$current = ' selected="selected"';
|
|
}
|
|
elseif (is_array($selected)) {
|
|
if ( in_array(0, $selected) ) {
|
|
$current = ' selected="selected"';
|
|
}
|
|
}
|
|
else {
|
|
$current = '';
|
|
}
|
|
echo "\n\t<option value='0'$current>$pad " . __('none','teachpress') . "</option>";
|
|
}
|
|
$items = $wpdb->get_results( "SELECT `ID`, `post_parent`, `post_title` FROM $wpdb->posts WHERE `post_parent` = '" . intval($parent) . "' AND `post_type` = '" . esc_sql($post_type) . "' AND `post_status` = 'publish' ORDER BY " . esc_sql($sort_column) . " " . esc_sql($sort_order) );
|
|
if ( $items ) {
|
|
foreach ( $items as $item ) {
|
|
$pad = str_repeat( ' ', $level * 3 );
|
|
if ( $item->ID == $selected ) {
|
|
$current = ' selected="selected"';
|
|
}
|
|
elseif ( is_array($selected) ) {
|
|
$current = ( in_array($item->ID, $selected) ) ? ' selected="selected"' : '';
|
|
}
|
|
else {
|
|
$current = '';
|
|
}
|
|
echo "\n\t<option value='$item->ID'$current>$pad " . get_the_title($item->ID) . "</option>";
|
|
get_tp_wp_pages( $sort_column, $sort_order, $selected, $post_type, $item->ID, $level + 1 );
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add publication as post
|
|
* @param string $title
|
|
* @param string $bibtex_key
|
|
* @param string $date
|
|
* @param string $post_type (default is "post")
|
|
* @param string $tags (separated by comma)
|
|
* @param array $category
|
|
* @return int
|
|
* @since 4.2.0
|
|
*/
|
|
function tp_add_publication_as_post ($title, $bibtex_key, $date, $post_type = 'post', $tags = '', $category = array()) {
|
|
$content = str_replace('[key]', 'key="' . $bibtex_key . '"', get_tp_option('rel_content_template') );
|
|
|
|
$post_id = wp_insert_post(array(
|
|
'post_title' => $title,
|
|
'post_content' => $content,
|
|
'tags_input' => $tags,
|
|
'post_date' => $date . " 12:00:00",
|
|
'post_date_gmt' => $date . " 12:00:00",
|
|
'post_type' => $post_type,
|
|
'post_status' => 'publish',
|
|
'post_category' => $category,
|
|
));
|
|
return $post_id;
|
|
}
|
|
|
|
/**
|
|
* Set screen options
|
|
* @param string $status
|
|
* @param string $option
|
|
* @param string $value
|
|
* @since 4.2.0
|
|
*/
|
|
function tp_set_screen_option($status, $option, $value) {
|
|
// For custom values: tp_authors_sorting
|
|
if ( isset( $_POST['tp_authors_sorting'] ) ) {
|
|
TP_Authors_Page::save_screen_options();
|
|
}
|
|
|
|
// For default per_page values
|
|
if ( 'tp_pubs_per_page' == $option ||
|
|
'tp_tags_per_page' == $option ||
|
|
'tp_authors_per_page' == $option ||
|
|
'tp_authors_sorting' == $option ||
|
|
'tp_courses_per_page' == $option ) {
|
|
return $value;
|
|
}
|
|
}
|
|
add_filter('set-screen-option', 'tp_set_screen_option', 10, 3); |