You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							417 lines
						
					
					
						
							17 KiB
						
					
					
				
			
		
		
	
	
							417 lines
						
					
					
						
							17 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
/* For licensing terms, see /license.txt */
 | 
						|
 | 
						|
use Chamilo\CourseBundle\Component\CourseCopy\CourseBuilder;
 | 
						|
use Chamilo\CourseBundle\Component\CourseCopy\CourseRestorer;
 | 
						|
use Chamilo\CourseBundle\Component\CourseCopy\CourseSelectForm;
 | 
						|
use ChamiloSession as Session;
 | 
						|
 | 
						|
/**
 | 
						|
 * Copy resources from one course in a session to another one.
 | 
						|
 *
 | 
						|
 * @author Christian Fasanando
 | 
						|
 * @author Julio Montoya <gugli100@gmail.com> Lots of bug fixes/improvements
 | 
						|
 */
 | 
						|
$cidReset = true;
 | 
						|
require_once __DIR__.'/../inc/global.inc.php';
 | 
						|
$current_course_tool = TOOL_COURSE_MAINTENANCE;
 | 
						|
 | 
						|
api_protect_admin_script();
 | 
						|
api_protect_limit_for_session_admin();
 | 
						|
api_set_more_memory_and_time_limits();
 | 
						|
 | 
						|
$xajax = new xajax();
 | 
						|
$xajax->registerFunction('search_courses');
 | 
						|
 | 
						|
if (!api_is_allowed_to_edit() && !api_is_session_admin()) {
 | 
						|
    api_not_allowed(true);
 | 
						|
}
 | 
						|
 | 
						|
$action = isset($_POST['action']) ? $_POST['action'] : '';
 | 
						|
$this_section = SECTION_PLATFORM_ADMIN;
 | 
						|
 | 
						|
$nameTools = get_lang('CopyCourse');
 | 
						|
$interbreadcrumb[] = [
 | 
						|
    'url' => api_get_path(WEB_CODE_PATH).'admin/index.php',
 | 
						|
    'name' => get_lang('PlatformAdmin'),
 | 
						|
];
 | 
						|
 | 
						|
// Database Table Definitions
 | 
						|
$tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
 | 
						|
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
 | 
						|
 | 
						|
/**
 | 
						|
 * @param string $name
 | 
						|
 * @param array  $sessions
 | 
						|
 * @param array  $attr
 | 
						|
 *
 | 
						|
 * @return string
 | 
						|
 */
 | 
						|
function make_select_session_list($name, $sessions, $attr = [])
 | 
						|
{
 | 
						|
    $attributes = '';
 | 
						|
    if (count($attr) > 0) {
 | 
						|
        foreach ($attr as $key => $value) {
 | 
						|
            $attributes .= ' '.$key.'="'.$value.'"';
 | 
						|
        }
 | 
						|
    }
 | 
						|
    $output = '<select id="session" class="form-control" name="'.$name.'" '.$attributes.'>';
 | 
						|
 | 
						|
    if (count($sessions) == 0) {
 | 
						|
        $output .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option>';
 | 
						|
    } else {
 | 
						|
        $output .= '<option value = "0">'.get_lang('SelectASession').'</option>';
 | 
						|
    }
 | 
						|
 | 
						|
    if (is_array($sessions)) {
 | 
						|
        foreach ($sessions as $session) {
 | 
						|
            $categoryName = '';
 | 
						|
            if (!empty($session['category_name'])) {
 | 
						|
                $categoryName = ' ('.$session['category_name'].')';
 | 
						|
            }
 | 
						|
 | 
						|
            $output .= '<option value="'.$session['id'].'">'.
 | 
						|
                $session['name'].' '.$categoryName.
 | 
						|
            '</option>';
 | 
						|
        }
 | 
						|
    }
 | 
						|
    $output .= '</select>';
 | 
						|
 | 
						|
    return $output;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @return string
 | 
						|
 */
 | 
						|
function display_form()
 | 
						|
{
 | 
						|
    $html = '';
 | 
						|
    $sessions = SessionManager::get_sessions_list([], ['name', 'ASC']);
 | 
						|
 | 
						|
    // Link back to the documents overview
 | 
						|
    $actionsLeft = '<a href="../admin/index.php">'.
 | 
						|
        Display::return_icon('back.png', get_lang('BackTo').' '.get_lang('PlatformAdmin'), '', ICON_SIZE_MEDIUM).
 | 
						|
        '</a>';
 | 
						|
 | 
						|
    $html .= Display::toolbarAction('toolbar-copysession', [$actionsLeft]);
 | 
						|
 | 
						|
    $html .= Display::return_message(get_lang('CopyCourseFromSessionToSessionExplanation'), 'warning');
 | 
						|
 | 
						|
    $html .= '<form class="form-horizontal" name="formulaire" method="post" action="'.api_get_self().'" >';
 | 
						|
    $html .= '<div class="form-group">';
 | 
						|
 | 
						|
    // origin
 | 
						|
    $html .= '<label class="col-sm-2 control-label">'.get_lang('OriginCoursesFromSession').': </label>';
 | 
						|
    $html .= '<div class="col-sm-5">';
 | 
						|
    $html .= make_select_session_list(
 | 
						|
        'sessions_list_origin',
 | 
						|
        $sessions,
 | 
						|
        ['onchange' => 'javascript: xajax_search_courses(this.value,\'origin\');']
 | 
						|
    );
 | 
						|
    $html .= '</div>';
 | 
						|
    $html .= '<div class="col-sm-5" id="ajax_list_courses_origin">';
 | 
						|
    $html .= '<select id="origin" class="form-control" name="SessionCoursesListOrigin[]" ></select>';
 | 
						|
    $html .= '</div></div>';
 | 
						|
 | 
						|
    //destination
 | 
						|
    $html .= '<div class="form-group">';
 | 
						|
    $html .= '<label class="col-sm-2 control-label">'.get_lang('DestinationCoursesFromSession').': </label>';
 | 
						|
    $html .= '<div class="col-sm-5" id="ajax_sessions_list_destination">';
 | 
						|
    $html .= '<select class="form-control" name="sessions_list_destination" onchange="javascript: xajax_search_courses(this.value,\'destination\');">';
 | 
						|
    $html .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option></select ></div>';
 | 
						|
 | 
						|
    $html .= '<div class="col-sm-5" id="ajax_list_courses_destination">';
 | 
						|
    $html .= '<select id="destination" class="form-control" name="SessionCoursesListDestination[]" ></select>';
 | 
						|
    $html .= '</div></div>';
 | 
						|
 | 
						|
    $options = '<div class="radio"><label><input type="radio" id="copy_option_1" name="copy_option" value="full_copy" checked="checked"/>';
 | 
						|
    $options .= get_lang('FullCopy').'</label></div>';
 | 
						|
    /*$options .= '<div class="radio"><label><input type="radio" id="copy_option_2" name="copy_option" value="select_items" disabled="disabled"/>';
 | 
						|
    $options .= ' '.get_lang('LetMeSelectItems').'</label></div>';*/
 | 
						|
 | 
						|
    $options .= '<div class="checkbox"><label><input type="checkbox" id="copy_base_content_id" name="copy_only_session_items" />'.get_lang('CopyOnlySessionItems').'</label></div>';
 | 
						|
 | 
						|
    $html .= Display::panel($options, get_lang('TypeOfCopy'));
 | 
						|
 | 
						|
    $html .= '<div class="form-group"><div class="col-sm-12">';
 | 
						|
    $html .= '<button class="btn btn-success" type="submit" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;"><em class="fa fa-files-o"></em> '.get_lang('CopyCourse').'</button>';
 | 
						|
 | 
						|
    // Add Security token
 | 
						|
    $html .= '<input type="hidden" value="'.Security::get_token().'" name="sec_token">';
 | 
						|
    $html .= '</div></div>';
 | 
						|
    $html .= '</form>';
 | 
						|
 | 
						|
    echo $html;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param int    $id_session
 | 
						|
 * @param string $type
 | 
						|
 *
 | 
						|
 * @return xajaxResponse
 | 
						|
 */
 | 
						|
function search_courses($id_session, $type)
 | 
						|
{
 | 
						|
    global $tbl_course, $tbl_session_rel_course;
 | 
						|
    $xajax_response = new xajaxResponse();
 | 
						|
    $select_destination = '';
 | 
						|
    $return = null;
 | 
						|
 | 
						|
    if (!empty($type)) {
 | 
						|
        $id_session = (int) $id_session;
 | 
						|
        if ($type == 'origin') {
 | 
						|
            $course_list = SessionManager::get_course_list_by_session_id($id_session);
 | 
						|
            $temp_course_list = [];
 | 
						|
            $return .= '<select id="origin" name="SessionCoursesListOrigin[]" class="form-control" onclick="javascript: checkSelected(this.id,\'copy_option_2\',\'title_option2\',\'destination\');">';
 | 
						|
 | 
						|
            foreach ($course_list as $course) {
 | 
						|
                $temp_course_list[] = "'{$course['code']}'";
 | 
						|
                $return .= '<option value="'.$course['code'].'" title="'.@htmlspecialchars($course['title'].' ('.$course['visual_code'].')', ENT_QUOTES, api_get_system_encoding()).'">'.$course['title'].' ('.$course['visual_code'].')</option>';
 | 
						|
            }
 | 
						|
 | 
						|
            $return .= '</select>';
 | 
						|
            Session::write('course_list', $temp_course_list);
 | 
						|
            Session::write('session_origin', $id_session);
 | 
						|
 | 
						|
            // Build select for destination sessions where is not included current session from select origin
 | 
						|
            if (!empty($id_session)) {
 | 
						|
                $sessions = SessionManager::get_sessions_list([], ['name', 'ASC']);
 | 
						|
                $select_destination .= '<select name="sessions_list_destination" class="form-control" onchange = "javascript: xajax_search_courses(this.value,\'destination\');">';
 | 
						|
                $select_destination .= '<option value = "0">-- '.get_lang('SelectASession').' --</option>';
 | 
						|
                foreach ($sessions as $session) {
 | 
						|
                    if ($id_session == $session['id']) {
 | 
						|
                        continue;
 | 
						|
                    }
 | 
						|
                    if (!empty($session['category_name'])) {
 | 
						|
                        $session['category_name'] = ' ('.$session['category_name'].') ';
 | 
						|
                    }
 | 
						|
                    $select_destination .= '<option value="'.$session['id'].'">'.$session['name'].' '.$session['category_name'].'</option>';
 | 
						|
                }
 | 
						|
                $select_destination .= '</select>';
 | 
						|
                $xajax_response->addAssign('ajax_sessions_list_destination', 'innerHTML', api_utf8_encode($select_destination));
 | 
						|
            } else {
 | 
						|
                $select_destination .= '<select name="sessions_list_destination" class="form-control" onchange = "javascript: xajax_search_courses(this.value,\'destination\');">';
 | 
						|
                $select_destination .= '<option value = "0">'.get_lang('ThereIsNotStillASession').'</option>';
 | 
						|
                $select_destination .= '</select>';
 | 
						|
                $xajax_response->addAssign('ajax_sessions_list_destination', 'innerHTML', api_utf8_encode($select_destination));
 | 
						|
            }
 | 
						|
 | 
						|
            // Select multiple destination empty
 | 
						|
            $select_multiple_empty = '<select id="destination" name="SessionCoursesListDestination[]" class="form-control"></select>';
 | 
						|
 | 
						|
            // Send response by ajax
 | 
						|
            $xajax_response->addAssign('ajax_list_courses_origin', 'innerHTML', api_utf8_encode($return));
 | 
						|
            $xajax_response->addAssign('ajax_list_courses_destination', 'innerHTML', api_utf8_encode($select_multiple_empty));
 | 
						|
        } else {
 | 
						|
            // Search courses by id_session where course codes is include en courses list destination
 | 
						|
            $sql = "SELECT c.code, c.visual_code, c.title, src.session_id
 | 
						|
                    FROM $tbl_course c, $tbl_session_rel_course src
 | 
						|
                    WHERE src.c_id = c.id
 | 
						|
                    AND src.session_id = '".intval($id_session)."'";
 | 
						|
            //AND c.code IN ($list_courses_origin)";
 | 
						|
            $rs = Database::query($sql);
 | 
						|
 | 
						|
            $course_list_destination = [];
 | 
						|
            $return .= '<select id="destination" name="SessionCoursesListDestination[]" class="form-control">';
 | 
						|
            while ($course = Database::fetch_array($rs)) {
 | 
						|
                $course_list_destination[] = $course['code'];
 | 
						|
                $return .= '<option value="'.$course['code'].'" title="'.@htmlspecialchars($course['title'].' ('.$course['visual_code'].')', ENT_QUOTES, api_get_system_encoding()).'">'.$course['title'].' ('.$course['visual_code'].')</option>';
 | 
						|
            }
 | 
						|
            $return .= '</select>';
 | 
						|
 | 
						|
            Session::write('course_list_destination', $course_list_destination);
 | 
						|
 | 
						|
            // Send response by ajax
 | 
						|
            $xajax_response->addAssign(
 | 
						|
                'ajax_list_courses_destination',
 | 
						|
                'innerHTML',
 | 
						|
                api_utf8_encode($return)
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return $xajax_response;
 | 
						|
}
 | 
						|
$xajax->processRequests();
 | 
						|
 | 
						|
/* HTML head extra */
 | 
						|
$htmlHeadXtra[] = $xajax->getJavascript(api_get_path(WEB_LIBRARY_PATH).'xajax/');
 | 
						|
$htmlHeadXtra[] = '<script>
 | 
						|
function checkSelected(id_select,id_radio,id_title,id_destination) {
 | 
						|
   var num=0;
 | 
						|
   obj_origin = document.getElementById(id_select);
 | 
						|
   obj_destination = document.getElementById(id_destination);
 | 
						|
 | 
						|
   for (x=0;x<obj_origin.options.length;x++) {
 | 
						|
      if (obj_origin.options[x].selected) {
 | 
						|
            if (obj_destination.options.length > 0) {
 | 
						|
                for (y=0;y<obj_destination.options.length;y++) {
 | 
						|
                        if (obj_origin.options[x].value == obj_destination.options[y].value) {
 | 
						|
                            obj_destination.options[y].selected = true;
 | 
						|
                        }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            num++;
 | 
						|
        } else {
 | 
						|
            if (obj_destination.options.length > 0) {
 | 
						|
                for (y=0;y<obj_destination.options.length;y++) {
 | 
						|
                    if (obj_origin.options[x].value == obj_destination.options[y].value) {
 | 
						|
                        obj_destination.options[y].selected = false;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
   }
 | 
						|
}
 | 
						|
</script>';
 | 
						|
 | 
						|
Display::display_header($nameTools);
 | 
						|
 | 
						|
$with_base_content = true;
 | 
						|
if (isset($_POST['copy_only_session_items']) && $_POST['copy_only_session_items']) {
 | 
						|
    $with_base_content = false;
 | 
						|
}
 | 
						|
 | 
						|
/*  MAIN CODE  */
 | 
						|
if (Security::check_token('post') && (
 | 
						|
        ($action === 'course_select_form') || (
 | 
						|
            isset($_POST['copy_option']) &&
 | 
						|
            $_POST['copy_option'] == 'full_copy'
 | 
						|
        )
 | 
						|
    )
 | 
						|
) {
 | 
						|
    // Clear token
 | 
						|
    Security::clear_token();
 | 
						|
    $destination_course = $origin_course = $destination_session = $origin_session = '';
 | 
						|
    if ($action === 'course_select_form') {
 | 
						|
        $destination_course = $_POST['destination_course'];
 | 
						|
        $origin_course = $_POST['origin_course'];
 | 
						|
        $destination_session = $_POST['destination_session'];
 | 
						|
        $origin_session = $_POST['origin_session'];
 | 
						|
 | 
						|
        if ($course_code != $origin_course) {
 | 
						|
            $course = CourseSelectForm::get_posted_course(
 | 
						|
                'copy_course',
 | 
						|
                $origin_session,
 | 
						|
                $origin_course
 | 
						|
            );
 | 
						|
 | 
						|
            $cr = new CourseRestorer($course);
 | 
						|
            //$cr->set_file_option($_POST['same_file_name_option']);
 | 
						|
            $cr->restore($destination_course, $destination_session);
 | 
						|
            echo Display::return_message(get_lang('CopyFinished'), 'confirmation');
 | 
						|
            display_form();
 | 
						|
        } else {
 | 
						|
            echo Display::return_message(get_lang('PleaseSelectACourse'), 'confirm');
 | 
						|
            display_form();
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
        $arr_course_origin = [];
 | 
						|
        $arr_course_destination = [];
 | 
						|
        $destination_session = '';
 | 
						|
        $origin_session = '';
 | 
						|
 | 
						|
        if (isset($_POST['SessionCoursesListOrigin'])) {
 | 
						|
            $arr_course_origin = $_POST['SessionCoursesListOrigin'];
 | 
						|
        }
 | 
						|
        if (isset($_POST['SessionCoursesListDestination'])) {
 | 
						|
            $arr_course_destination = $_POST['SessionCoursesListDestination'];
 | 
						|
        }
 | 
						|
        if (isset($_POST['sessions_list_destination'])) {
 | 
						|
            $destination_session = $_POST['sessions_list_destination'];
 | 
						|
        }
 | 
						|
        if (isset($_POST['sessions_list_origin'])) {
 | 
						|
            $origin_session = $_POST['sessions_list_origin'];
 | 
						|
        }
 | 
						|
 | 
						|
        if ((is_array($arr_course_origin) && count($arr_course_origin) > 0) && !empty($destination_session)) {
 | 
						|
            //We need only one value
 | 
						|
            if (count($arr_course_origin) > 1 || count($arr_course_destination) > 1) {
 | 
						|
                echo Display::return_message(get_lang('YouMustSelectACourseFromOriginalSession'), 'error');
 | 
						|
            } else {
 | 
						|
                //first element of the array
 | 
						|
                $course_code = $arr_course_origin[0];
 | 
						|
                $course_destinatination = $arr_course_destination[0];
 | 
						|
 | 
						|
                if ($course_code != $course_destinatination) {
 | 
						|
                    $course_origin = api_get_course_info($course_code);
 | 
						|
                    $cb = new CourseBuilder('', $course_origin);
 | 
						|
                    $course = $cb->build($origin_session, $course_code, $with_base_content);
 | 
						|
                    $cr = new CourseRestorer($course);
 | 
						|
                    $cr->restore($course_destinatination, $destination_session);
 | 
						|
 | 
						|
                    echo Display::return_message(get_lang('CopyFinished'), 'confirm');
 | 
						|
                    display_form();
 | 
						|
                } else {
 | 
						|
                    echo Display::return_message(get_lang('PleaseSelectACourse'), 'confirm');
 | 
						|
                    display_form();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            echo Display::return_message(get_lang('YouMustSelectACourseFromOriginalSession'), 'error');
 | 
						|
            display_form();
 | 
						|
        }
 | 
						|
    }
 | 
						|
} elseif (Security::check_token('post') && (
 | 
						|
        isset($_POST['copy_option']) &&
 | 
						|
        $_POST['copy_option'] == 'select_items'
 | 
						|
    )
 | 
						|
) {
 | 
						|
    // Clear token
 | 
						|
    Security::clear_token();
 | 
						|
 | 
						|
    // Else, if a CourseSelectForm is requested, show it
 | 
						|
    if (api_get_setting('show_glossary_in_documents') != 'none') {
 | 
						|
        echo Display::return_message(get_lang('ToExportDocumentsWithGlossaryYouHaveToSelectGlossary'), 'normal');
 | 
						|
    }
 | 
						|
 | 
						|
    $arr_course_origin = [];
 | 
						|
    $arr_course_destination = [];
 | 
						|
    $destination_session = '';
 | 
						|
    $origin_session = '';
 | 
						|
 | 
						|
    if (isset($_POST['SessionCoursesListOrigin'])) {
 | 
						|
        $arr_course_origin = $_POST['SessionCoursesListOrigin'];
 | 
						|
    }
 | 
						|
    if (isset($_POST['SessionCoursesListDestination'])) {
 | 
						|
        $arr_course_destination = $_POST['SessionCoursesListDestination'];
 | 
						|
    }
 | 
						|
    if (isset($_POST['sessions_list_destination'])) {
 | 
						|
        $destination_session = $_POST['sessions_list_destination'];
 | 
						|
    }
 | 
						|
    if (isset($_POST['sessions_list_origin'])) {
 | 
						|
        $origin_session = $_POST['sessions_list_origin'];
 | 
						|
    }
 | 
						|
 | 
						|
    if ((is_array($arr_course_origin) && count($arr_course_origin) > 0) && !empty($destination_session)) {
 | 
						|
        echo Display::return_message(get_lang('ToExportLearnpathWithQuizYouHaveToSelectQuiz'), 'normal');
 | 
						|
        $course_origin = api_get_course_info($arr_course_origin[0]);
 | 
						|
        $cb = new CourseBuilder('', $course_origin);
 | 
						|
        $course = $cb->build($origin_session, $arr_course_origin[0], $with_base_content);
 | 
						|
        $hiddenFields['destination_course'] = $arr_course_destination[0];
 | 
						|
        $hiddenFields['origin_course'] = $arr_course_origin[0];
 | 
						|
        $hiddenFields['destination_session'] = $destination_session;
 | 
						|
        $hiddenFields['origin_session'] = $origin_session;
 | 
						|
        // Add token to Course select form
 | 
						|
        $hiddenFields['sec_token'] = Security::get_token();
 | 
						|
        CourseSelectForm::display_form($course, $hiddenFields, true);
 | 
						|
        echo '<div style="float:right"><a href="javascript:window.history.go(-1);">'.
 | 
						|
            Display::return_icon(
 | 
						|
                'back.png',
 | 
						|
                get_lang('Back').' '.get_lang('To').' '.get_lang('PlatformAdmin'),
 | 
						|
                ['style' => 'vertical-align:middle']
 | 
						|
            ).
 | 
						|
            get_lang('Back').'</a></div>';
 | 
						|
    } else {
 | 
						|
        echo Display::return_message(
 | 
						|
            get_lang('You must select a course from original session and select a destination session'),
 | 
						|
            'error'
 | 
						|
        );
 | 
						|
        display_form();
 | 
						|
    }
 | 
						|
} else {
 | 
						|
    display_form();
 | 
						|
}
 | 
						|
 | 
						|
Display::display_footer();
 | 
						|
 |