parent
							
								
									44cd7956f5
								
							
						
					
					
						commit
						93f3f199db
					
				@ -1,400 +0,0 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
use Chamilo\CourseBundle\Entity\CToolIntro; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @deprecated | 
				
			||||
 * The INTRODUCTION MICRO MODULE is used to insert and edit | 
				
			||||
 * an introduction section on a Chamilo module or on the course homepage. | 
				
			||||
 * It can be inserted on any Chamilo module, provided the corresponding setting | 
				
			||||
 * is enabled in the administration section. | 
				
			||||
 * | 
				
			||||
 * The introduction content are stored in a table called "tool_intro" | 
				
			||||
 * in the course Database. Each module introduction has an Id stored in | 
				
			||||
 * the table, which matches a specific module. | 
				
			||||
 * | 
				
			||||
 * '(c_)tool_intro' table description | 
				
			||||
 *   c_id: int | 
				
			||||
 *   id : int | 
				
			||||
 *   intro_text :text | 
				
			||||
 *   session_id: int | 
				
			||||
 * | 
				
			||||
 * usage : | 
				
			||||
 * | 
				
			||||
 * $moduleId = 'XX'; // specifying the module tool (string value) | 
				
			||||
 * include(introductionSection.inc.php); | 
				
			||||
 * | 
				
			||||
 * This script is also used since Chamilo 1.9 to show course progress (from the | 
				
			||||
 * course_progress module) | 
				
			||||
 */ | 
				
			||||
$em = Database::getManager(); | 
				
			||||
$intro_editAllowed = $is_allowed_to_edit = api_is_allowed_to_edit(); | 
				
			||||
$session_id = api_get_session_id(); | 
				
			||||
$blogParam = isset($_GET['blog_id']) ? ('&blog_id='.(int) $_GET['blog_id']) : ''; | 
				
			||||
 | 
				
			||||
$introduction_section = ''; | 
				
			||||
 | 
				
			||||
global $charset; | 
				
			||||
$intro_cmdEdit = empty($_GET['intro_cmdEdit']) ? '' : $_GET['intro_cmdEdit']; | 
				
			||||
$intro_cmdUpdate = isset($_POST['intro_cmdUpdate']); | 
				
			||||
$intro_cmdDel = empty($_GET['intro_cmdDel']) ? '' : $_GET['intro_cmdDel']; | 
				
			||||
$intro_cmdAdd = empty($_GET['intro_cmdAdd']) ? '' : $_GET['intro_cmdAdd']; | 
				
			||||
$courseId = api_get_course_id(); | 
				
			||||
 | 
				
			||||
if (!empty($courseId)) { | 
				
			||||
    $form = new FormValidator( | 
				
			||||
        'introduction_text', | 
				
			||||
        'post', | 
				
			||||
        api_get_self().'?'.api_get_cidreq().$blogParam | 
				
			||||
    ); | 
				
			||||
} else { | 
				
			||||
    $form = new FormValidator('introduction_text'); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$config = [ | 
				
			||||
    'ToolbarSet' => 'IntroductionSection', | 
				
			||||
    'Width' => '100%', | 
				
			||||
    'Height' => '300', | 
				
			||||
]; | 
				
			||||
 | 
				
			||||
$form->addHtmlEditor('intro_content', null, false, false, $config, ['data-block' => true]); | 
				
			||||
$form->addButtonSave(get_lang('Save introductory text'), 'intro_cmdUpdate', false, ['data-block' => true]); | 
				
			||||
 | 
				
			||||
/* INTRODUCTION MICRO MODULE - COMMANDS SECTION (IF ALLOWED) */ | 
				
			||||
$course_id = api_get_course_int_id(); | 
				
			||||
 | 
				
			||||
if ($intro_editAllowed) { | 
				
			||||
    /** @var CToolIntro $toolIntro */ | 
				
			||||
    $toolIntro = $em | 
				
			||||
        ->getRepository('ChamiloCourseBundle:CToolIntro') | 
				
			||||
        ->findOneBy(['cId' => $course_id, 'id' => $moduleId, 'sessionId' => $session_id]); | 
				
			||||
 | 
				
			||||
    /* Replace command */ | 
				
			||||
    if ($intro_cmdUpdate) { | 
				
			||||
        if ($form->validate()) { | 
				
			||||
            $form_values = $form->exportValues(); | 
				
			||||
            $intro_content = $form_values['intro_content']; | 
				
			||||
 | 
				
			||||
            if (!empty($intro_content)) { | 
				
			||||
                if (!$toolIntro) { | 
				
			||||
                    $toolIntro = new CToolIntro(); | 
				
			||||
                    $toolIntro | 
				
			||||
                        ->setSessionId($session_id) | 
				
			||||
                        ->setCId($course_id) | 
				
			||||
                        ->setId($moduleId); | 
				
			||||
                } | 
				
			||||
 | 
				
			||||
                $toolIntro->setIntroText($intro_content); | 
				
			||||
 | 
				
			||||
                $em->persist($toolIntro); | 
				
			||||
                $em->flush(); | 
				
			||||
                Display::addFlash(Display::return_message(get_lang('Intro was updated'), 'confirmation', false)); | 
				
			||||
            } else { | 
				
			||||
                // got to the delete command | 
				
			||||
                $intro_cmdDel = true; | 
				
			||||
            } | 
				
			||||
        } else { | 
				
			||||
            $intro_cmdEdit = true; | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /* Delete Command */ | 
				
			||||
    if ($intro_cmdDel && $toolIntro) { | 
				
			||||
        $em->remove($toolIntro); | 
				
			||||
        $em->flush(); | 
				
			||||
 | 
				
			||||
        Display::addFlash(Display::return_message(get_lang('Intro was deleted'), 'confirmation')); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* INTRODUCTION MICRO MODULE - DISPLAY SECTION */ | 
				
			||||
 | 
				
			||||
/* Retrieves the module introduction text, if exist */ | 
				
			||||
// Getting course intro | 
				
			||||
/** @var CToolIntro $toolIntro */ | 
				
			||||
$toolIntro = $em | 
				
			||||
    ->getRepository('ChamiloCourseBundle:CToolIntro') | 
				
			||||
    ->findOneBy(['cId' => $course_id, 'id' => $moduleId, 'sessionId' => 0]); | 
				
			||||
 | 
				
			||||
$intro_content = $toolIntro ? $toolIntro->getIntroText() : ''; | 
				
			||||
if ($session_id) { | 
				
			||||
    /** @var CToolIntro $toolIntro */ | 
				
			||||
    $toolIntro = $em | 
				
			||||
        ->getRepository('ChamiloCourseBundle:CToolIntro') | 
				
			||||
        ->findOneBy(['cId' => $course_id, 'id' => $moduleId, 'sessionId' => $session_id]); | 
				
			||||
 | 
				
			||||
    $introSessionContent = $toolIntro && $toolIntro->getIntroText() ? $toolIntro->getIntroText() : ''; | 
				
			||||
    $intro_content = $introSessionContent ?: $intro_content; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// Default behaviour show iframes. | 
				
			||||
$userStatus = COURSEMANAGERLOWSECURITY; | 
				
			||||
 | 
				
			||||
// Allows to do a remove_XSS in course introduction with user status COURSEMANAGERLOWSECURITY | 
				
			||||
// Block embed type videos (like vimeo, wistia, etc) - see BT#12244 BT#12556 | 
				
			||||
if (api_get_configuration_value('course_introduction_html_strict_filtering')) { | 
				
			||||
    $userStatus = COURSEMANAGER; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// Ignore editor.css | 
				
			||||
$cssEditor = api_get_path(WEB_CSS_PATH).'editor.css'; | 
				
			||||
$linkToReplace = [ | 
				
			||||
    '<link href="'.$cssEditor.'" rel="stylesheet" type="text/css" />', | 
				
			||||
    '<link href="'.$cssEditor.'" media="screen" rel="stylesheet" type="text/css" />', | 
				
			||||
]; | 
				
			||||
$intro_content = str_replace($linkToReplace, '', $intro_content); | 
				
			||||
$intro_content = Security::remove_XSS($intro_content, $userStatus); | 
				
			||||
 | 
				
			||||
/* Determines the correct display */ | 
				
			||||
if ($intro_cmdEdit || $intro_cmdAdd) { | 
				
			||||
    $intro_dispDefault = false; | 
				
			||||
    $intro_dispForm = true; | 
				
			||||
    $intro_dispCommand = false; | 
				
			||||
} else { | 
				
			||||
    $intro_dispDefault = true; | 
				
			||||
    $intro_dispForm = false; | 
				
			||||
 | 
				
			||||
    if ($intro_editAllowed) { | 
				
			||||
        $intro_dispCommand = true; | 
				
			||||
    } else { | 
				
			||||
        $intro_dispCommand = false; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Executes the display */ | 
				
			||||
 | 
				
			||||
// display thematic advance inside a postit | 
				
			||||
if ($intro_dispForm) { | 
				
			||||
    $default['intro_content'] = $intro_content; | 
				
			||||
    $form->setDefaults($default); | 
				
			||||
    $introduction_section .= $form->returnForm(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$thematic_description_html = ''; | 
				
			||||
$thematicItemTwo = ''; | 
				
			||||
 | 
				
			||||
if (TOOL_COURSE_HOMEPAGE == $tool && !isset($_GET['intro_cmdEdit'])) { | 
				
			||||
    // Only show this if we're on the course homepage and we're not currently editing | 
				
			||||
    $thematic = new Thematic(); | 
				
			||||
    $displayMode = api_get_course_setting('display_info_advance_inside_homecourse'); | 
				
			||||
    $class1 = ''; | 
				
			||||
    if ('1' === $displayMode) { | 
				
			||||
        // Show only the current course progress step | 
				
			||||
        $last_done_advance = $thematic->get_last_done_thematic_advance($course, $session); | 
				
			||||
        $thematicAdvance = $thematic->getThematicAdvance($last_done_advance); | 
				
			||||
        $subTitle1 = get_lang('Current topic'); | 
				
			||||
        $class1 = ' current'; | 
				
			||||
    } elseif ('2' === $displayMode) { | 
				
			||||
        // Show only the two next course progress steps | 
				
			||||
        $last_done_advance = $thematic->get_next_thematic_advance_not_done(); | 
				
			||||
        $next_advance_not_done = $thematic->get_next_thematic_advance_not_done(2); | 
				
			||||
        $thematicAdvance = $thematic->getThematicAdvance($last_done_advance); | 
				
			||||
        $thematicAdvance2 = $thematic->getThematicAdvance($next_advance_not_done); | 
				
			||||
        $subTitle1 = $subTitle2 = get_lang('Next topic'); | 
				
			||||
    } elseif ('3' === $displayMode) { | 
				
			||||
        // Show the current and next course progress steps | 
				
			||||
        $last_done_advance = $thematic->get_last_done_thematic_advance($course, $session); | 
				
			||||
        $next_advance_not_done = $thematic->get_next_thematic_advance_not_done(); | 
				
			||||
        $thematicAdvance = $thematic->getThematicAdvance($last_done_advance); | 
				
			||||
        $thematicAdvance2 = $thematic->getThematicAdvance($next_advance_not_done); | 
				
			||||
        $subTitle1 = get_lang('Current topic'); | 
				
			||||
        $subTitle2 = get_lang('Next topic'); | 
				
			||||
        $class1 = ' current'; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    if (!empty($thematicAdvance)) { | 
				
			||||
        $thematic_advance = get_lang('Course progress'); | 
				
			||||
        $thematicScore = $thematic->get_total_average_of_thematic_advances().'%'; | 
				
			||||
        $thematicUrl = api_get_path(WEB_CODE_PATH).'course_progress/index.php?action=thematic_details&'.api_get_cidreq(); | 
				
			||||
        $thematic_info = $thematicAdvance->getThematic(); | 
				
			||||
        $startDate = $thematicAdvance->getStartDate(); | 
				
			||||
 | 
				
			||||
        //$thematicAdvance['start_date'] = api_get_local_time($startDate); | 
				
			||||
        //$thematicAdvance['start_date'] = api_format_date($startDate, DATE_TIME_FORMAT_LONG); | 
				
			||||
        $userInfo = api_get_user_info(); | 
				
			||||
        $courseInfo = api_get_course_info(); | 
				
			||||
        $titleThematic = $thematic_advance.' : '.$courseInfo['name'].' <b>( '.$thematicScore.' )</b>'; | 
				
			||||
 | 
				
			||||
        $infoUser = '<div class="thematic-avatar"><img src="'.$userInfo['avatar'].'" class="img-circle img-responsive"></div>'; | 
				
			||||
        $infoUser .= '<div class="progress"> | 
				
			||||
                        <div class="progress-bar progress-bar-primary" role="progressbar" style="width: '.$thematicScore.';"> | 
				
			||||
                        '.$thematicScore.' | 
				
			||||
                        </div> | 
				
			||||
                    </div>'; | 
				
			||||
 | 
				
			||||
        $thematicItemOne = ' | 
				
			||||
        <div class="col-md-6 items-progress"> | 
				
			||||
            <div class="thematic-cont '.$class1.'"> | 
				
			||||
            <div class="topics">'.$subTitle1.'</div> | 
				
			||||
            <h4 class="title-topics">'. | 
				
			||||
                Display::returnFontAwesomeIcon('book').strip_tags($thematic_info->getTitle()).'</h4> | 
				
			||||
            <p class="date">'. | 
				
			||||
                Display::returnFontAwesomeIcon('calendar-o').$thematicAdvance['start_date'].'</p> | 
				
			||||
            <div class="views">'. | 
				
			||||
                Display::returnFontAwesomeIcon('file-text-o').strip_tags($thematicAdvance->getContent()).'</div> | 
				
			||||
            <p class="time">'. | 
				
			||||
                Display::returnFontAwesomeIcon('clock-o').get_lang('Duration in hours').' : '.$thematicAdvance->getDuration().' - | 
				
			||||
                <a href="'.$thematicUrl.'">'.get_lang('See detail').'</a></p> | 
				
			||||
            </div> | 
				
			||||
        </div>'; | 
				
			||||
 | 
				
			||||
        if (!empty($thematicAdvance2)) { | 
				
			||||
            $thematic_info2 = $thematicAdvance2->getThematic(); | 
				
			||||
            //$thematicAdvance2['start_date'] = api_get_local_time($thematicAdvance2['start_date']); | 
				
			||||
            //$thematicAdvance2['start_date'] = api_format_date($thematicAdvance2['start_date'], DATE_TIME_FORMAT_LONG); | 
				
			||||
 | 
				
			||||
            $thematicItemTwo = ' | 
				
			||||
                <div class="col-md-6 items-progress"> | 
				
			||||
                    <div class="thematic-cont"> | 
				
			||||
                    <div class="topics">'.$subTitle2.'</div> | 
				
			||||
                    <h4 class="title-topics">'. | 
				
			||||
                        Display::returnFontAwesomeIcon('book').api_get_local_time($thematic_info2->getStartDate()).'</h4> | 
				
			||||
                    <p class="date">'. | 
				
			||||
                        Display::returnFontAwesomeIcon('calendar-o').api_get_local_time($thematicAdvance2->getStartDate()).'</p> | 
				
			||||
                    <div class="views">'. | 
				
			||||
                        Display::returnFontAwesomeIcon('file-text-o').strip_tags($thematicAdvance2->getContent()).'</div> | 
				
			||||
                    <p class="time">'. | 
				
			||||
                        Display::returnFontAwesomeIcon('clock-o').get_lang('Duration in hours').' : '.$thematicAdvance2->getDuration().' - | 
				
			||||
                        <a href="'.$thematicUrl.'">'.get_lang('See detail').'</a></p> | 
				
			||||
                    </div> | 
				
			||||
                </div>'; | 
				
			||||
        } | 
				
			||||
        $thematicPanel = '<div class="row">'; | 
				
			||||
        $thematicPanel .= '<div class="col-md-2">'.$infoUser.'</div>'; | 
				
			||||
        $thematicPanel .= '<div class="col-md-10"><div class="row">'.$thematicItemOne.$thematicItemTwo.'</div></div>'; | 
				
			||||
        $thematicPanel .= '</div>'; | 
				
			||||
        $thematicPanel .= '<div class="separate"> | 
				
			||||
                        <a href="'.$thematicUrl.'" class="btn btn-default btn-block">'.get_lang('Show course planning').'</a> | 
				
			||||
                    </div>'; | 
				
			||||
 | 
				
			||||
        $thematicProgress = Display::panelCollapse( | 
				
			||||
            $titleThematic, | 
				
			||||
            $thematicPanel, | 
				
			||||
            'thematic', | 
				
			||||
            null, | 
				
			||||
            'accordion-thematic', | 
				
			||||
            'collapse-thematic', | 
				
			||||
            false | 
				
			||||
        ); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$thematicSection = ''; | 
				
			||||
if (!empty($thematicAdvance)) { | 
				
			||||
    $thematicSection = $thematic_description_html; | 
				
			||||
    $thematicSection .= $thematicProgress; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$toolbar = []; | 
				
			||||
 | 
				
			||||
/*if (api_is_allowed_to_edit() && empty($session_id)) { | 
				
			||||
    $tool = [ | 
				
			||||
        'name' => get_lang('Customize icons'), | 
				
			||||
        'url' => api_get_path(WEB_CODE_PATH).'course_info/tools.php?'.api_get_cidreq(), | 
				
			||||
        'icon' => 'fas fa-cog', | 
				
			||||
    ]; | 
				
			||||
    $toolbar[] = $tool; | 
				
			||||
}*/ | 
				
			||||
 | 
				
			||||
if ($intro_dispCommand) { | 
				
			||||
    if (empty($intro_content)) { | 
				
			||||
        // Displays "Add intro" commands | 
				
			||||
 | 
				
			||||
        if (!empty($courseId)) { | 
				
			||||
            $tool = [ | 
				
			||||
                'name' => addslashes(get_lang('Add Intro')), | 
				
			||||
                'url' => api_get_self().'?'.api_get_cidreq().$blogParam.'&intro_cmdAdd=1', | 
				
			||||
                'icon' => 'fas fa-pencil-alt', | 
				
			||||
            ]; | 
				
			||||
            $toolbar[] = $tool; | 
				
			||||
        } else { | 
				
			||||
            $tool = [ | 
				
			||||
                'name' => get_lang('Add Intro'), | 
				
			||||
                'url' => api_get_self().'?intro_cmdAdd=1', | 
				
			||||
                'icon' => 'fas fa-pencil-alt', | 
				
			||||
            ]; | 
				
			||||
            $toolbar[] = $tool; | 
				
			||||
        } | 
				
			||||
    } else { | 
				
			||||
        // Displays "edit intro && delete intro" commands | 
				
			||||
 | 
				
			||||
        if (!empty($courseId)) { | 
				
			||||
            $tool = [ | 
				
			||||
                'name' => get_lang('Edit'), | 
				
			||||
                'url' => api_get_self().'?'.api_get_cidreq().$blogParam.'&intro_cmdEdit=1', | 
				
			||||
                'icon' => 'fas fa-pencil-alt', | 
				
			||||
            ]; | 
				
			||||
            $toolbar[] = $tool; | 
				
			||||
 | 
				
			||||
            $tool = [ | 
				
			||||
                'name' => addslashes(api_htmlentities(get_lang('Please confirm your choice'))), | 
				
			||||
                'url' => api_get_self()."?".api_get_cidreq().$blogParam."&intro_cmdDel=1", | 
				
			||||
                'icon' => 'fas fa-trash-alt', | 
				
			||||
                'class' => 'delete-swal', | 
				
			||||
            ]; | 
				
			||||
            $toolbar[] = $tool; | 
				
			||||
        } else { | 
				
			||||
            $tool = [ | 
				
			||||
                'name' => get_lang('Edit'), | 
				
			||||
                'url' => api_get_self().'?intro_cmdEdit=1', | 
				
			||||
                'icon' => 'fas fa-pencil-alt', | 
				
			||||
            ]; | 
				
			||||
            $toolbar[] = $tool; | 
				
			||||
 | 
				
			||||
            $tool = [ | 
				
			||||
                'name' => addslashes(api_htmlentities(get_lang('Please confirm your choice'))), | 
				
			||||
                'url' => api_get_self()."?".api_get_cidreq()."&intro_cmdDel=1", | 
				
			||||
                'icon' => 'fas fa-trash-alt', | 
				
			||||
                'class' => 'delete-swal', | 
				
			||||
            ]; | 
				
			||||
            $toolbar[] = $tool; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        // Fix for chrome XSS filter for videos in iframes - BT#7930 | 
				
			||||
        $browser = api_get_navigator(); | 
				
			||||
        if (false !== strpos($introduction_section, '<iframe') && 'Chrome' == $browser['name']) { | 
				
			||||
            header('X-XSS-Protection: 0'); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$nameSection = get_lang('Add an introduction to the course'); | 
				
			||||
$helpSection = get_lang('This course is already created! Now you can add a presentation or welcome text to your course in this section, ideal for your students.'); | 
				
			||||
if ('course_homepage' != $moduleId) { | 
				
			||||
    $nameSection = get_lang('Add an introduction to the tool'); | 
				
			||||
    $helpSection = get_lang('Add Custom Tools Intro'); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$textContent = []; | 
				
			||||
if ($intro_dispDefault) { | 
				
			||||
    if (!empty($intro_content)) { | 
				
			||||
        $textContent = [ | 
				
			||||
            'id' => 'introduction-tool', | 
				
			||||
            'name' => $nameSection, | 
				
			||||
            'help' => $helpSection, | 
				
			||||
            'text' => $intro_content, | 
				
			||||
        ]; | 
				
			||||
    } else { | 
				
			||||
        if (api_is_allowed_to_edit()) { | 
				
			||||
            $textContent = [ | 
				
			||||
                'id' => 'introduction-course', | 
				
			||||
                'name' => $nameSection, | 
				
			||||
                'help' => $helpSection, | 
				
			||||
                'text' => $intro_content, | 
				
			||||
            ]; | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$browser = api_get_navigator(); | 
				
			||||
 | 
				
			||||
if (false !== strpos($introduction_section, '<iframe') && 'Chrome' == $browser['name']) { | 
				
			||||
    header("X-XSS-Protection: 0"); | 
				
			||||
} | 
				
			||||
$data = null; | 
				
			||||
$tpl = new Template(null); | 
				
			||||
$tpl->assign('thematic', $thematicSection); | 
				
			||||
$tpl->assign('intro', $textContent); | 
				
			||||
$tpl->assign('toolbar', $toolbar); | 
				
			||||
$introduction_section .= $tpl->fetch($tpl->get_template('auth/introduction_section.html.twig')); | 
				
			||||
					Loading…
					
					
				
		Reference in new issue