diff --git a/main/admin/add_drh_to_user.php b/main/admin/add_drh_to_user.php index 3b42c67e55..d78fe82d55 100644 --- a/main/admin/add_drh_to_user.php +++ b/main/admin/add_drh_to_user.php @@ -15,7 +15,7 @@ if (!isset($_REQUEST['u'])) { } $em = Database::getManager(); -$relationsRepo = $em->getRepository('ChamiloCoreBundle:UserRelUser'); +$userRepository = $em->getRepository('ChamiloUserBundle:User'); /** @var UserEntity $user */ $user = UserManager::getManager()->find($_REQUEST['u']); @@ -23,10 +23,12 @@ if (!$user) { api_not_allowed(true); } -$subscribedUsers = $user->getHrm(); +$subscribedUsers = $userRepository->getAssignedHrmUserList( + $user->getId(), + api_get_current_access_url_id() +); $hrmOptions = []; - /** @var UserRelUser $subscribedUser */ foreach ($subscribedUsers as $subscribedUser) { /** @var UserEntity $hrm */ @@ -58,7 +60,6 @@ if ($form->validate()) { foreach ($subscribedUsers as $subscribedUser) { $em->remove($subscribedUser); } - $em->flush(); $values = $form->exportValues(); diff --git a/main/admin/settings.lib.php b/main/admin/settings.lib.php index 2397972ac4..9ca5e3ae37 100755 --- a/main/admin/settings.lib.php +++ b/main/admin/settings.lib.php @@ -521,6 +521,10 @@ function uploadStylesheet($values, $picture) $result = false; // Valid name for the stylesheet folder. $style_name = api_preg_replace('/[^A-Za-z0-9]/', '', $values['name_stylesheet']); + if (empty($style_name) || is_array($style_name)) { + // The name of the uploaded stylesheet doesn't have the expected format + return $result; + } $cssToUpload = CSS_UPLOAD_PATH; // Check if a virtual instance vchamilo is used @@ -1006,7 +1010,7 @@ function getNumberOfTemplates() * @param int $from the start of the limit statement * @param int $number_of_items the number of elements that have to be retrieved from the database * @param int $column the column that is - * @param string $direction the sorting direction (ASC or DESC� + * @param string $direction the sorting direction (ASC or DESC) * * @return array * @@ -1120,8 +1124,7 @@ function addEditTemplate() get_lang('Text'), true, true, - ['ToolbarSet' => 'Documents', 'Width' => '100%', 'Height' => '400'], - true + ['ToolbarSet' => 'Documents', 'Width' => '100%', 'Height' => '400'] ); // Setting the form elements: the form to upload an image to be used with the template. diff --git a/main/admin/statistics/index.php b/main/admin/statistics/index.php index aa5c98e0e5..732948b744 100755 --- a/main/admin/statistics/index.php +++ b/main/admin/statistics/index.php @@ -14,22 +14,27 @@ api_protect_admin_script(); $interbreadcrumb[] = ['url' => '../index.php', 'name' => get_lang('PlatformAdmin')]; $report = isset($_REQUEST['report']) ? $_REQUEST['report'] : ''; +$sessionDuration = isset($_GET['session_duration']) ? (int) $_GET['session_duration'] : ''; -if ($report) { +if ($report == 'recentlogins') { $htmlHeadXtra[] = api_get_js('chartjs/Chart.min.js'); $htmlHeadXtra[] = ' - '; + }); + '; +} + +if ($report == 'user_session') { + $htmlHeadXtra[] = api_get_jqgrid_js(); } $tool_name = get_lang('Statistics'); @@ -61,6 +66,10 @@ $tools[$strUsers]['report=zombies'] = get_lang('Zombies'); // system ... $tools[$strSystem]['report=activities'] = get_lang('ImportantActivities'); +if (api_is_global_platform_admin() && api_is_multiple_url_enabled()) { + $tools[$strSystem]['report=user_session'] = get_lang('PortalUserSessionStats'); +} + // social ... $tools[$strSocial]['report=messagesent'] = get_lang('MessagesSent'); $tools[$strSocial]['report=messagereceived'] = get_lang('MessagesReceived'); @@ -80,9 +89,106 @@ foreach ($tools as $section => $items) { echo ''; $course_categories = Statistics::getCourseCategories(); -echo '

'; //@todo: spaces between elements should be handled in the css, br should be removed if only there for presentation +//@todo: spaces between elements should be handled in the css, br should be removed if only there for presentation +echo '

'; switch ($report) { + case 'user_session': + $form = new FormValidator('user_session', 'get'); + $form->addDateRangePicker('range', get_lang('DateRange'), true); + $form->addHidden('report', 'user_session'); + $form->addButtonSearch(get_lang('Search')); + + $date = new DateTime($now); + $startDate = $date->format('Y-m-d').' 00:00:00'; + $endDate = $date->format('Y-m-d').' 23:59:59'; + $start = $startDate; + $end = $endDate; + + if ($form->validate()) { + $values = $form->getSubmitValues(); + $start = $values['range_start']; + $end = $values['range_end']; + } + echo $form->returnForm(); + + $url = api_get_path(WEB_AJAX_PATH).'statistics.ajax.php?a=get_user_session&start='.$start.'&end='.$end; + $columns = [ + 'URL', + get_lang('Session'), + get_lang('Course'), + get_lang('CountUsers'), + ]; + + $columnModel = [ + [ + 'name' => 'url', + 'index' => 'url', + 'width' => '120', + 'align' => 'left', + ], + [ + 'name' => 'session', + 'index' => 'session', + 'width' => '180', + 'align' => 'left', + 'sortable' => 'false', + ], + [ + 'name' => 'course', + 'index' => 'course', + 'width' => '100', + 'align' => 'left', + 'sortable' => 'false', + ], + [ + 'name' => 'count', + 'index' => 'count', + 'width' => '50', + 'align' => 'left', + 'sortable' => 'false', + ], + ]; + $extraParams['autowidth'] = 'true'; //use the width of the parent + $extraParams['height'] = 'auto'; //use the width of the parent + $actionLinks = ''; + ?> + + $name) { @@ -123,9 +229,16 @@ switch ($report) { break; case 'recentlogins': echo '

'.sprintf(get_lang('LastXDays'), '15').'

'; + $form = new FormValidator('session_time', 'get', api_get_self().'?report=recentlogins&session_duration='.$sessionDuration); + $sessionTimeList = ['', 5 => 5, 15 => 15, 30 => 30, 60 => 60]; + $form->addSelect('session_duration', [get_lang('SessionMinDuration'), get_lang('Minutes')], $sessionTimeList); + $form->addButtonSend(get_lang('Filter')); + $form->addHidden('report', 'recentlogins'); + $form->display(); + echo ''; - Statistics::printRecentLoginStats(); - Statistics::printRecentLoginStats(true); + Statistics::printRecentLoginStats(false, $sessionDuration); + Statistics::printRecentLoginStats(true, $sessionDuration); break; case 'logins': Statistics::printLoginStats($_GET['type']); diff --git a/main/admin/user_import.php b/main/admin/user_import.php index 971b7a2fbe..6a73897eb1 100644 --- a/main/admin/user_import.php +++ b/main/admin/user_import.php @@ -387,7 +387,7 @@ function parse_xml_data($file) } $this_section = SECTION_PLATFORM_ADMIN; -api_protect_admin_script(true, null, 'login'); +api_protect_admin_script(true, null); api_protect_limit_for_session_admin(); $defined_auth_sources[] = PLATFORM_AUTH_SOURCE; diff --git a/main/admin/user_update_import.php b/main/admin/user_update_import.php index eb11a8f94f..ae0728ddc9 100644 --- a/main/admin/user_update_import.php +++ b/main/admin/user_update_import.php @@ -337,7 +337,7 @@ function parse_xml_data($file) } $this_section = SECTION_PLATFORM_ADMIN; -api_protect_admin_script(true, null, 'login'); +api_protect_admin_script(true, null); $defined_auth_sources[] = PLATFORM_AUTH_SOURCE; diff --git a/main/auth/inscription.php b/main/auth/inscription.php index f74249ffd7..f3767068d4 100755 --- a/main/auth/inscription.php +++ b/main/auth/inscription.php @@ -4,9 +4,9 @@ use ChamiloSession as Session; /** - * This script displays a form for registering new users. + * This script displays a form for registering new users. * - * @package chamilo.auth + * @package chamilo.auth */ //quick hack to adapt the registration form result to the selected registration language @@ -41,7 +41,9 @@ if ($geolocalization) { $htmlHeadXtra[] = api_get_password_checker_js('#username', '#pass1'); // User is not allowed if Terms and Conditions are disabled and // registration is disabled too. -$isNotAllowedHere = api_get_setting('allow_terms_conditions') === 'false' && api_get_setting('allow_registration') === 'false'; +$isNotAllowedHere = api_get_setting('allow_terms_conditions') === 'false' && api_get_setting( + 'allow_registration' + ) === 'false'; if ($isNotAllowedHere) { api_not_allowed(true, get_lang('RegistrationDisabled')); @@ -89,6 +91,22 @@ if (!empty($course_code_redirect)) { } if ($user_already_registered_show_terms === false) { + // STUDENT/TEACHER + if (api_get_setting('allow_registration_as_teacher') != 'false') { + if (in_array('status', $allowedFields)) { + $form->addRadio( + 'status', + get_lang('RegistrationRoleWhatDoYouWantToDo'), + [ + STUDENT => '

'.get_lang('RegistrationRoleFollowCourses').'

', + COURSEMANAGER => '

'.get_lang('RegistrationRoleTeachCourses').'

', + ], + ['class' => 'register-profile'] + ); + $form->addRule('status', get_lang('ThisFieldIsRequired'), 'required'); + } + } + if (api_is_western_name_order()) { // FIRST NAME and LAST NAME $form->addElement('text', 'firstname', get_lang('FirstName'), ['size' => 40]); @@ -130,25 +148,6 @@ if ($user_already_registered_show_terms === false) { $form->addElement('text', 'openid', get_lang('OpenIDURL'), ['size' => 40]); } - // OFFICIAL CODE - if (CONFVAL_ASK_FOR_OFFICIAL_CODE) { - if (in_array('official_code', $allowedFields)) { - $form->addElement( - 'text', - 'official_code', - get_lang('OfficialCode'), - ['size' => 40] - ); - if (api_get_setting('registration', 'officialcode') == 'true') { - $form->addRule( - 'official_code', - get_lang('ThisFieldIsRequired'), - 'required' - ); - } - } - } - // USERNAME if (api_get_setting('login_is_email') != 'true') { $form->addText( @@ -184,11 +183,6 @@ if ($user_already_registered_show_terms === false) { ['id' => 'pass1', 'size' => 20, 'autocomplete' => 'off'] ); - $checkPass = api_get_setting('allow_strength_pass_checker'); - if ($checkPass === 'true') { - $form->addElement('label', null, '
'); - } - $form->addElement( 'password', 'pass2', @@ -227,73 +221,25 @@ if ($user_already_registered_show_terms === false) { } } - // STUDENT/TEACHER - if (api_get_setting('allow_registration_as_teacher') != 'false') { - if (in_array('status', $allowedFields)) { - $form->addElement( - 'radio', - 'status', - get_lang('Profile'), - get_lang('RegStudent'), - STUDENT - ); + // OFFICIAL CODE + if (CONFVAL_ASK_FOR_OFFICIAL_CODE) { + if (in_array('official_code', $allowedFields)) { $form->addElement( - 'radio', - 'status', - null, - get_lang('RegAdmin'), - COURSEMANAGER + 'text', + 'official_code', + get_lang('OfficialCode'), + ['size' => 40] ); + if (api_get_setting('registration', 'officialcode') == 'true') { + $form->addRule( + 'official_code', + get_lang('ThisFieldIsRequired'), + 'required' + ); + } } } - $captcha = api_get_setting('allow_captcha'); - $allowCaptcha = $captcha === 'true'; - - if ($allowCaptcha) { - $ajax = api_get_path(WEB_AJAX_PATH).'form.ajax.php?a=get_captcha'; - $options = [ - 'width' => 220, - 'height' => 90, - 'callback' => $ajax.'&var='.basename(__FILE__, '.php'), - 'sessionVar' => basename(__FILE__, '.php'), - 'imageOptions' => [ - 'font_size' => 20, - 'font_path' => api_get_path(SYS_FONTS_PATH).'opensans/', - 'font_file' => 'OpenSans-Regular.ttf', - //'output' => 'gif' - ], - ]; - - $captcha_question = $form->addElement( - 'CAPTCHA_Image', - 'captcha_question', - '', - $options - ); - $form->addElement('static', null, null, get_lang('ClickOnTheImageForANewOne')); - - $form->addElement( - 'text', - 'captcha', - get_lang('EnterTheLettersYouSee'), - ['size' => 40] - ); - $form->addRule( - 'captcha', - get_lang('EnterTheCharactersYouReadInTheImage'), - 'required', - null, - 'client' - ); - $form->addRule( - 'captcha', - get_lang('TheTextYouEnteredDoesNotMatchThePicture'), - 'CAPTCHA', - $captcha_question - ); - } - // EXTENDED FIELDS if (api_get_setting('extended_profile') == 'true' && api_get_setting('extendedprofile_registration', 'mycomptetences') == 'true' @@ -306,6 +252,7 @@ if ($user_already_registered_show_terms === false) { ['ToolbarSet' => 'register', 'Width' => '100%', 'Height' => '130'] ); } + if (api_get_setting('extended_profile') == 'true' && api_get_setting('extendedprofile_registration', 'mydiplomas') == 'true' ) { @@ -317,6 +264,7 @@ if ($user_already_registered_show_terms === false) { ['ToolbarSet' => 'register', 'Width' => '100%', 'Height' => '130'] ); } + if (api_get_setting('extended_profile') == 'true' && api_get_setting('extendedprofile_registration', 'myteach') == 'true' ) { @@ -328,6 +276,7 @@ if ($user_already_registered_show_terms === false) { ['ToolbarSet' => 'register', 'Width' => '100%', 'Height' => '130'] ); } + if (api_get_setting('extended_profile') == 'true' && api_get_setting('extendedprofile_registration', 'mypersonalopenarea') == 'true' ) { @@ -339,6 +288,7 @@ if ($user_already_registered_show_terms === false) { ['ToolbarSet' => 'register', 'Width' => '100%', 'Height' => '130'] ); } + if (api_get_setting('extended_profile') === 'true') { if (api_get_setting('extendedprofile_registration', 'mycomptetences') === 'true' && api_get_setting('extendedprofile_registrationrequired', 'mycomptetences') === 'true' @@ -367,7 +317,9 @@ if ($user_already_registered_show_terms === false) { in_array('extra_fields', $allowedFields) ) { $extraField = new ExtraField('user'); - $extraFieldList = isset($allowedFields['extra_fields']) && is_array($allowedFields['extra_fields']) ? $allowedFields['extra_fields'] : []; + $extraFieldList = isset($allowedFields['extra_fields']) && is_array( + $allowedFields['extra_fields'] + ) ? $allowedFields['extra_fields'] : []; $returnParams = $extraField->addElements( $form, 0, @@ -377,7 +329,56 @@ if ($user_already_registered_show_terms === false) { $extraFieldList ); } + + // CAPTCHA + $captcha = api_get_setting('allow_captcha'); + $allowCaptcha = $captcha === 'true'; + + if ($allowCaptcha) { + $ajax = api_get_path(WEB_AJAX_PATH).'form.ajax.php?a=get_captcha'; + $options = [ + 'width' => 220, + 'height' => 90, + 'callback' => $ajax.'&var='.basename(__FILE__, '.php'), + 'sessionVar' => basename(__FILE__, '.php'), + 'imageOptions' => [ + 'font_size' => 20, + 'font_path' => api_get_path(SYS_FONTS_PATH).'opensans/', + 'font_file' => 'OpenSans-Regular.ttf', + //'output' => 'gif' + ], + ]; + + $captcha_question = $form->addElement( + 'CAPTCHA_Image', + 'captcha_question', + '', + $options + ); + $form->addElement('static', null, null, get_lang('ClickOnTheImageForANewOne')); + + $form->addElement( + 'text', + 'captcha', + get_lang('EnterTheLettersYouSee'), + ['size' => 40] + ); + $form->addRule( + 'captcha', + get_lang('EnterTheCharactersYouReadInTheImage'), + 'required', + null, + 'client' + ); + $form->addRule( + 'captcha', + get_lang('TheTextYouEnteredDoesNotMatchThePicture'), + 'CAPTCHA', + $captcha_question + ); + } } + if (isset($_SESSION['user_language_choice']) && $_SESSION['user_language_choice'] != '') { $defaults['language'] = $_SESSION['user_language_choice']; } else { @@ -461,7 +462,7 @@ if (file_exists($home.'register_top_'.$user_selected_language.'.html')) { $open = str_replace('{rel_path}', api_get_path(REL_PATH), $home_top_temp); $open = api_to_system_encoding($open, api_detect_encoding(strip_tags($open))); if (!empty($open)) { - $content = '
'.$open.'
'; + $content = '
'.$open.'
'; } } @@ -520,7 +521,9 @@ if (api_get_setting('allow_terms_conditions') == 'true') { 'checkbox', 'legal_accept', null, - get_lang('IHaveReadAndAgree').' '.get_lang('TermsAndConditions').'' + get_lang('IHaveReadAndAgree').' '.get_lang( + 'TermsAndConditions' + ).'' ); $form->addRule('legal_accept', get_lang('ThisFieldIsRequired'), 'required'); } else { diff --git a/main/auth/profile.php b/main/auth/profile.php index a3c2425705..89e9eb50ad 100755 --- a/main/auth/profile.php +++ b/main/auth/profile.php @@ -316,10 +316,6 @@ if (is_platform_authentication() && $form->addElement('password', 'password0', [get_lang('Pass'), get_lang('Enter2passToChange')], ['size' => 40]); $form->addElement('password', 'password1', get_lang('NewPass'), ['id' => 'password1', 'size' => 40]); - $checkPass = api_get_setting('allow_strength_pass_checker'); - if ($checkPass == 'true') { - $form->addElement('label', null, '
'); - } $form->addElement('password', 'password2', get_lang('Confirmation'), ['size' => 40]); // user must enter identical password twice so we can prevent some user errors $form->addRule(['password1', 'password2'], get_lang('PassTwo'), 'compare'); diff --git a/main/inc/lib/api.lib.php b/main/inc/lib/api.lib.php index 9e55d97fb2..645500f2b5 100644 --- a/main/inc/lib/api.lib.php +++ b/main/inc/lib/api.lib.php @@ -2683,6 +2683,7 @@ function api_get_setting($variable) return ''; } $variable = trim($variable); + switch ($variable) { case 'header_extra_content': $filename = api_get_path(SYS_PATH).api_get_home_path().'header_extra_content.txt'; @@ -2743,6 +2744,7 @@ function api_get_setting($variable) break; default: return $settingsManager->getSetting($variable); + break; } // Old code diff --git a/src/CoreBundle/Component/Editor/CkEditor/CkEditor.php b/src/CoreBundle/Component/Editor/CkEditor/CkEditor.php index d4d0f4e9e8..c38b0ec575 100644 --- a/src/CoreBundle/Component/Editor/CkEditor/CkEditor.php +++ b/src/CoreBundle/Component/Editor/CkEditor/CkEditor.php @@ -97,6 +97,8 @@ class CkEditor extends Editor /** * @param array $templates + * + * @return string */ public function formatTemplates($templates) { diff --git a/src/CoreBundle/Component/Editor/CkEditor/Toolbar/LearningPathAuthor.php b/src/CoreBundle/Component/Editor/CkEditor/Toolbar/LearningPathAuthor.php index d8fdb67e1b..0aa5e0975d 100644 --- a/src/CoreBundle/Component/Editor/CkEditor/Toolbar/LearningPathAuthor.php +++ b/src/CoreBundle/Component/Editor/CkEditor/Toolbar/LearningPathAuthor.php @@ -24,7 +24,7 @@ class LearningPathAuthor extends Basic $config['toolbar_maxToolbar'] = $this->getMaximizedToolbar(); } - $config['fullPage'] = true; + $config['fullPage'] = false; return $config; } @@ -38,7 +38,6 @@ class LearningPathAuthor extends Basic { return [ ['PageBreak', 'ShowBlocks', 'Source'], - ['Toolbarswitch'], ]; } @@ -63,7 +62,6 @@ class LearningPathAuthor extends Basic { return [ ['Link', 'Unlink', 'Bold', 'Italic', 'TextColor', 'BGColor', 'Source'], - ['Toolbarswitch'], ]; } } diff --git a/src/CoreBundle/Component/Editor/CkEditor/Toolbar/Minimal.php b/src/CoreBundle/Component/Editor/CkEditor/Toolbar/Minimal.php index 8b2d923577..3b530e11eb 100644 --- a/src/CoreBundle/Component/Editor/CkEditor/Toolbar/Minimal.php +++ b/src/CoreBundle/Component/Editor/CkEditor/Toolbar/Minimal.php @@ -33,7 +33,7 @@ class Minimal extends Basic ], [ 'name' => 'links', - 'items' => ['Link', 'Unlink', 'Anchor'], + 'items' => ['Link', 'Unlink', 'Anchor', 'Source'], ], ]; diff --git a/src/CoreBundle/Entity/Repository/ExtraFieldRelTagRepository.php b/src/CoreBundle/Entity/Repository/ExtraFieldRelTagRepository.php index 7da0dabbe8..38f7f744db 100644 --- a/src/CoreBundle/Entity/Repository/ExtraFieldRelTagRepository.php +++ b/src/CoreBundle/Entity/Repository/ExtraFieldRelTagRepository.php @@ -22,7 +22,7 @@ class ExtraFieldRelTagRepository extends EntityRepository * @param ExtraField $extraField The extrafield * @param int $itemId The item ID * - * @return \Doctrine\ORM\QueryBuilder + * @return array */ public function getTags(ExtraField $extraField, $itemId) { diff --git a/src/CoreBundle/Entity/Repository/ExtraFieldValuesRepository.php b/src/CoreBundle/Entity/Repository/ExtraFieldValuesRepository.php index 271162d2b7..6c168c0698 100644 --- a/src/CoreBundle/Entity/Repository/ExtraFieldValuesRepository.php +++ b/src/CoreBundle/Entity/Repository/ExtraFieldValuesRepository.php @@ -21,7 +21,7 @@ class ExtraFieldValuesRepository extends EntityRepository * @param int $extraFieldType The type of extra field * @param int $itemId The item ID * - * @return \Doctrine\ORM\QueryBuilder + * @return array */ public function getVisibleValues($extraFieldType, $itemId) { diff --git a/src/CoreBundle/Entity/Repository/ItemPropertyRepository.php b/src/CoreBundle/Entity/Repository/ItemPropertyRepository.php index e804b90d14..f4ffbcf986 100644 --- a/src/CoreBundle/Entity/Repository/ItemPropertyRepository.php +++ b/src/CoreBundle/Entity/Repository/ItemPropertyRepository.php @@ -4,9 +4,10 @@ namespace Chamilo\CoreBundle\Entity\Repository; use Chamilo\CoreBundle\Entity\Course; -use Chamilo\CoreBundle\Entity\Group; use Chamilo\CoreBundle\Entity\Session; use Chamilo\CourseBundle\Entity\CItemProperty; +use Chamilo\UserBundle\Entity\Group; +use Chamilo\UserBundle\Entity\User; use Doctrine\ORM\EntityRepository; /** @@ -17,13 +18,13 @@ class ItemPropertyRepository extends EntityRepository /** * Get users subscribed to a item LP, Document, etc (item_property). * - * @param $tool learnpath | document | etc - * @param $itemId + * @param string $tool learnpath | document | etc + * @param int $itemId * @param Course $course * @param Session $session * @param Group $group * - * @return \Doctrine\ORM\QueryBuilder + * @return array */ public function getUsersSubscribedToItem( $tool, @@ -47,8 +48,8 @@ class ItemPropertyRepository extends EntityRepository /** * Get Groups subscribed to a item: LP, Doc, etc. * - * @param $tool learnpath | document | etc - * @param $itemId + * @param string $tool learnpath | document | etc + * @param int $itemId * @param Course $course * @param Session $session * @@ -75,12 +76,12 @@ class ItemPropertyRepository extends EntityRepository /** * Subscribe groups to a LP, doc (itemproperty). * - * @param User $currentUser - * @param $tool learnpath | document | etc + * @param User $currentUser + * @param string $tool learnpath | document | etc * @param Course $course * @param Session $session - * @param $itemId - * @param array $newList + * @param int $itemId + * @param array $newList */ public function subscribeGroupsToItem( $currentUser, @@ -147,11 +148,12 @@ class ItemPropertyRepository extends EntityRepository /** * Unsubscribe groups to item. * - * @param $tool + * @param string $tool * @param Course $course * @param Session $session - * @param $itemId - * @param $groups + * @param int $itemId + * @param array $groups + * @param bool $unsubscribeUserToo */ public function unsubscribeGroupsToItem( $tool, @@ -200,12 +202,12 @@ class ItemPropertyRepository extends EntityRepository /** * Subscribe users to a LP, doc (itemproperty). * - * @param User $currentUser - * @param $tool + * @param User $currentUser + * @param string $tool * @param Course $course * @param Session $session - * @param $itemId - * @param array $newUserList + * @param int $itemId + * @param array $newUserList */ public function subscribeUsersToItem( $currentUser, @@ -275,11 +277,11 @@ class ItemPropertyRepository extends EntityRepository /** * Unsubscribe users to item. * - * @param $tool + * @param string $tool * @param Course $course * @param Session $session - * @param $itemId - * @param $usersToDelete + * @param int $itemId + * @param array $usersToDelete */ public function unsubcribeUsersToItem( $tool, diff --git a/src/CoreBundle/Entity/Repository/SequenceRepository.php b/src/CoreBundle/Entity/Repository/SequenceRepository.php index 7fe90d5695..facd3fdc90 100644 --- a/src/CoreBundle/Entity/Repository/SequenceRepository.php +++ b/src/CoreBundle/Entity/Repository/SequenceRepository.php @@ -116,7 +116,7 @@ class SequenceRepository extends EntityRepository ]); $result = []; - + /** @var SequenceResource $sequenceResource */ foreach ($sequencesResource as $sequenceResource) { if (!$sequenceResource->hasGraph()) { continue; @@ -174,6 +174,7 @@ class SequenceRepository extends EntityRepository $result = []; + /** @var SequenceResource $sequenceResource */ foreach ($sequencesResource as $sequenceResource) { if (!$sequenceResource->hasGraph()) { continue; diff --git a/src/CoreBundle/Entity/SkillRelUser.php b/src/CoreBundle/Entity/SkillRelUser.php index 5fa9db36b1..165dcda5ca 100644 --- a/src/CoreBundle/Entity/SkillRelUser.php +++ b/src/CoreBundle/Entity/SkillRelUser.php @@ -38,6 +38,7 @@ class SkillRelUser * @ORM\Column(name="validation_status", type="integer") */ protected $validationStatus; + /** * @var int * diff --git a/src/CoreBundle/Settings/AdminSettingsSchema.php b/src/CoreBundle/Settings/AdminSettingsSchema.php index e76795699c..2541e499e1 100644 --- a/src/CoreBundle/Settings/AdminSettingsSchema.php +++ b/src/CoreBundle/Settings/AdminSettingsSchema.php @@ -5,6 +5,7 @@ namespace Chamilo\CoreBundle\Settings; use Chamilo\CoreBundle\Form\Type\YesNoType; use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilderInterface; +use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; /** @@ -44,7 +45,9 @@ class AdminSettingsSchema extends AbstractSettingsSchema public function buildForm(FormBuilderInterface $builder) { $builder - ->add('administrator_name') + ->add('administrator_name', + TextType::class, + ['label' => 'emailAdministratorTitle', 'help_block' => 'emailAdministratorComment']) ->add('administrator_surname') ->add('administrator_email', 'email') ->add('administrator_phone') diff --git a/src/CourseBundle/Component/CourseCopy/Course.php b/src/CourseBundle/Component/CourseCopy/Course.php index 147e630bf9..b987d4806a 100644 --- a/src/CourseBundle/Component/CourseCopy/Course.php +++ b/src/CourseBundle/Component/CourseCopy/Course.php @@ -59,6 +59,8 @@ class Course /** * Add a resource from a given type to this course. + * + * @param $resource */ public function add_resource(&$resource) { diff --git a/src/CourseBundle/Component/CourseCopy/CourseArchiver.php b/src/CourseBundle/Component/CourseCopy/CourseArchiver.php index 7344272391..b4181480d4 100644 --- a/src/CourseBundle/Component/CourseCopy/CourseArchiver.php +++ b/src/CourseBundle/Component/CourseCopy/CourseArchiver.php @@ -4,6 +4,7 @@ namespace Chamilo\CourseBundle\Component\CourseCopy; use Chamilo\CourseBundle\Component\CourseCopy\Resources\Asset; +use Chamilo\CourseBundle\Component\CourseCopy\Resources\Document; use Symfony\Component\Filesystem\Filesystem; /** @@ -108,12 +109,28 @@ class CourseArchiver // Copy all documents to the temp-dir if (isset($course->resources[RESOURCE_DOCUMENT]) && is_array($course->resources[RESOURCE_DOCUMENT])) { + $webEditorCss = api_get_path(WEB_CSS_PATH).'editor.css'; + /** @var Document $document */ foreach ($course->resources[RESOURCE_DOCUMENT] as $document) { if ($document->file_type == DOCUMENT) { $doc_dir = $backup_dir.$document->path; @mkdir(dirname($doc_dir), $perm_dirs, true); if (file_exists($course->path.$document->path)) { copy($course->path.$document->path, $doc_dir); + // Check if is html or htm + $extension = pathinfo(basename($document->path), PATHINFO_EXTENSION); + switch ($extension) { + case 'html': + case 'htm': + $contents = file_get_contents($doc_dir); + $contents = str_replace( + $webEditorCss, + '{{css_editor}}', + $contents + ); + file_put_contents($doc_dir, $contents); + break; + } } } else { @mkdir($backup_dir.$document->path, $perm_dirs, true); @@ -171,7 +188,6 @@ class CourseArchiver copyDirTo($course->path.$asset->path, $doc_dir, false); continue; } - copy($course->path.$asset->path, $doc_dir); } } diff --git a/src/CourseBundle/Component/CourseCopy/CourseBuilder.php b/src/CourseBundle/Component/CourseCopy/CourseBuilder.php index 893571f0f5..4554ae3546 100644 --- a/src/CourseBundle/Component/CourseCopy/CourseBuilder.php +++ b/src/CourseBundle/Component/CourseCopy/CourseBuilder.php @@ -131,15 +131,15 @@ class CourseBuilder * * @param int $session_id * @param string $courseCode - * @param bool true if you want to get the elements that exists in the course and - * in the session, (session_id = 0 or session_id = X) + * @param bool $withBaseContent true if you want to get the elements that exists in the course and + * in the session, (session_id = 0 or session_id = X) * * @return Course The course object structure */ public function build( $session_id = 0, $courseCode = '', - $with_base_content = false + $withBaseContent = false ) { $table_properties = Database::get_course_table(TABLE_ITEM_PROPERTY); $course = api_get_course_info($courseCode); @@ -152,7 +152,7 @@ class CourseBuilder $this->$function_build( $session_id, $courseId, - $with_base_content, + $withBaseContent, $specificIdList ); } @@ -204,14 +204,14 @@ class CourseBuilder * * @param int $session_id * @param int $courseId - * @param bool $with_base_content - * @param array $id_list + * @param bool $withBaseContent + * @param array $idList */ public function build_documents( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $table_doc = Database::get_course_table(TABLE_DOCUMENT); $table_prop = Database::get_course_table(TABLE_ITEM_PROPERTY); @@ -220,9 +220,16 @@ class CourseBuilder $avoid_paths = " path NOT LIKE '/shared_folder%' AND path NOT LIKE '/chat_files%' "; + $documentCondition = ''; + if (!empty($idList)) { + $idList = array_unique($idList); + $idList = array_map('intval', $idList); + $documentCondition = ' d.iid IN ("'.implode('","', $idList).'") AND '; + } + if (!empty($courseId) && !empty($session_id)) { $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -247,6 +254,7 @@ class CourseBuilder d.c_id = $courseId AND p.c_id = $courseId AND tool = '".TOOL_DOCUMENT."' AND + $documentCondition p.visibility != 2 AND path NOT LIKE '/images/gallery%' AND $avoid_paths @@ -261,6 +269,7 @@ class CourseBuilder d.c_id = $courseId AND p.c_id = $courseId AND tool = '".TOOL_DOCUMENT."' AND + $documentCondition $avoid_paths AND p.visibility != 2 $session_condition ORDER BY path"; @@ -288,6 +297,7 @@ class CourseBuilder d.c_id = $courseId AND p.c_id = $courseId AND tool = '".TOOL_DOCUMENT."' AND + $documentCondition p.visibility != 2 AND path NOT LIKE '/images/gallery%' AND $avoid_paths AND @@ -302,14 +312,15 @@ class CourseBuilder d.c_id = $courseId AND p.c_id = $courseId AND tool = '".TOOL_DOCUMENT."' AND + $documentCondition p.visibility != 2 AND $avoid_paths AND (d.session_id = 0 OR d.session_id IS NULL) ORDER BY path"; } - $db_result = Database::query($sql); - while ($obj = Database::fetch_object($db_result)) { + $result = Database::query($sql); + while ($obj = Database::fetch_object($result)) { $doc = new Document( $obj->id, $obj->path, @@ -326,26 +337,32 @@ class CourseBuilder /** * Build the forums. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_forums( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $table = Database::get_course_table(TABLE_FORUM); - $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); - $sql = "SELECT * FROM $table WHERE c_id = $courseId $sessionCondition"; + $idCondition = ''; + if (!empty($idList)) { + $idList = array_unique($idList); + $idList = array_map('intval', $idList); + $idCondition = ' AND iid IN ("'.implode('","', $idList).'") '; + } + + $sql = "SELECT * FROM $table WHERE c_id = $courseId $sessionCondition $idCondition"; $sql .= " ORDER BY forum_title, forum_category"; $db_result = Database::query($sql); while ($obj = Database::fetch_object($db_result)) { @@ -357,27 +374,34 @@ class CourseBuilder /** * Build a forum-category. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_forum_category( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $table = Database::get_course_table(TABLE_FORUM_CATEGORY); $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); + $idCondition = ''; + if (!empty($idList)) { + $idList = array_unique($idList); + $idList = array_map('intval', $idList); + $idCondition = ' AND iid IN ("'.implode('","', $idList).'") '; + } + $sql = "SELECT * FROM $table - WHERE c_id = $courseId $sessionCondition + WHERE c_id = $courseId $sessionCondition $idCondition ORDER BY cat_title"; $result = Database::query($sql); @@ -390,34 +414,41 @@ class CourseBuilder /** * Build the forum-topics. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_forum_topics( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $table = Database::get_course_table(TABLE_FORUM_THREAD); $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); + $idCondition = ''; + if (!empty($idList)) { + $idList = array_map('intval', $idList); + $idCondition = ' AND iid IN ("'.implode('","', $idList).'") '; + } + $sql = "SELECT * FROM $table WHERE c_id = $courseId $sessionCondition + $idCondition ORDER BY thread_title "; $result = Database::query($sql); while ($obj = Database::fetch_object($result)) { - $forum_topic = new ForumTopic($obj); - $this->course->add_resource($forum_topic); - $this->build_forum_posts($courseId, $obj->thread_id, $obj->forum_id, true); + $forumTopic = new ForumTopic($obj); + $this->course->add_resource($forumTopic); + $this->build_forum_posts($courseId, $obj->thread_id, $obj->forum_id); } } @@ -425,24 +456,31 @@ class CourseBuilder * Build the forum-posts * TODO: All tree structure of posts should be built, attachments for example. * - * @param int $courseId Internal course ID - * @param int $thread_id Internal thread ID - * @param int $forum_id Internal forum ID - * @param bool $only_first_post Whether to only copy the first post or not + * @param int $courseId Internal course ID + * @param int $thread_id Internal thread ID + * @param int $forum_id Internal forum ID + * @param array $idList */ public function build_forum_posts( $courseId = 0, $thread_id = null, $forum_id = null, - $only_first_post = false + $idList = [] ) { $table = Database::get_course_table(TABLE_FORUM_POST); + $courseId = (int) $courseId; $sql = "SELECT * FROM $table WHERE c_id = $courseId "; if (!empty($thread_id) && !empty($forum_id)) { $forum_id = intval($forum_id); $thread_id = intval($thread_id); $sql .= " AND thread_id = $thread_id AND forum_id = $forum_id "; } + + if (!empty($idList)) { + $idList = array_map('intval', $idList); + $sql .= ' AND iid IN ("'.implode('","', $idList).'") '; + } + $sql .= " ORDER BY post_id ASC LIMIT 1"; $db_result = Database::query($sql); while ($obj = Database::fetch_object($db_result)) { @@ -454,21 +492,21 @@ class CourseBuilder /** * Build the links. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_links( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $categories = LinkManager::getLinkCategories( $courseId, $session_id, - $with_base_content + $withBaseContent ); // Adding empty category @@ -481,10 +519,16 @@ class CourseBuilder $category['id'], $courseId, $session_id, - $with_base_content + $withBaseContent ); foreach ($links as $item) { + if (!empty($idList)) { + if (!in_array($item['id'], $idList)) { + continue; + } + } + $link = new Link( $item['id'], $item['title'], @@ -506,25 +550,27 @@ class CourseBuilder /** * Build tool intro. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_tool_intro( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $table = Database::get_course_table(TABLE_TOOL_INTRO); $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); + $courseId = (int) $courseId; + $sql = "SELECT * FROM $table WHERE c_id = $courseId $sessionCondition"; @@ -563,24 +609,31 @@ class CourseBuilder /** * Build the Quizzes. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $idList If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_quizzes( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $idList = [] ) { $table_qui = Database::get_course_table(TABLE_QUIZ_TEST); $table_rel = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION); $table_doc = Database::get_course_table(TABLE_DOCUMENT); + $courseId = (int) $courseId; + $idCondition = ''; + if (!empty($idList)) { + $idList = array_map('intval', $idList); + $idCondition = ' iid IN ("'.implode('","', $idList).'") AND '; + } + if (!empty($courseId) && !empty($session_id)) { $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -592,13 +645,22 @@ class CourseBuilder true ); } - //select only quizzes with active = 0 or 1 (not -1 which is for deleted quizzes) + + // Select only quizzes with active = 0 or 1 (not -1 which is for deleted quizzes) $sql = "SELECT * FROM $table_qui - WHERE c_id = $courseId AND active >=0 $session_condition"; + WHERE + c_id = $courseId AND + $idCondition + active >=0 + $session_condition "; } else { - //select only quizzes with active = 0 or 1 (not -1 which is for deleted quizzes) + // Select only quizzes with active = 0 or 1 (not -1 which is for deleted quizzes) $sql = "SELECT * FROM $table_qui - WHERE c_id = $courseId AND active >=0 AND (session_id = 0 OR session_id IS NULL)"; + WHERE + c_id = $courseId AND + $idCondition + active >=0 AND + (session_id = 0 OR session_id IS NULL)"; } $sql .= 'ORDER BY title'; @@ -613,7 +675,6 @@ class CourseBuilder $obj->sound = $doc->id; } $quiz = new Quiz($obj); - $sql = 'SELECT * FROM '.$table_rel.' WHERE c_id = '.$courseId.' AND exercice_id = '.$obj->id; $db_result2 = Database::query($sql); @@ -642,6 +703,8 @@ class CourseBuilder $table_que = Database::get_course_table(TABLE_QUIZ_QUESTION); $table_ans = Database::get_course_table(TABLE_QUIZ_ANSWER); + $courseId = (int) $courseId; + // Building normal tests. $sql = "SELECT * FROM $table_que WHERE c_id = $courseId "; @@ -668,6 +731,7 @@ class CourseBuilder $obj->extra, $question_category_id ); + $question->addPicture($this); $sql = 'SELECT * FROM '.$table_ans.' WHERE c_id = '.$courseId.' AND question_id = '.$obj->id; @@ -685,9 +749,7 @@ class CourseBuilder $obj2->hotspot_type ); if ($obj->type == MULTIPLE_ANSWER_TRUE_FALSE) { - $table_options = Database::get_course_table( - TABLE_QUIZ_QUESTION_OPTION - ); + $table_options = Database::get_course_table(TABLE_QUIZ_QUESTION_OPTION); $sql = 'SELECT * FROM '.$table_options.' WHERE c_id = '.$courseId.' AND question_id = '.$obj->id; $db_result3 = Database::query($sql); @@ -706,7 +768,6 @@ class CourseBuilder // 1st union gets the orphan questions from deleted exercises // 2nd union gets the orphan questions from question that were deleted in a exercise. - $sql = " ( SELECT question_id, q.* FROM $table_que q INNER JOIN $table_rel r @@ -745,10 +806,7 @@ class CourseBuilder if (!isset($this->course->resources[$obj->id])) { // find the question category // @todo : need to be adapted for multi category questions in 1.10 - $question_category_id = TestCategory::getCategoryForQuestion( - $obj->id, - $courseId - ); + $question_category_id = TestCategory::getCategoryForQuestion($obj->id, $courseId); $question = new QuizQuestion( $obj->id, $obj->question, @@ -761,6 +819,7 @@ class CourseBuilder $obj->extra, $question_category_id ); + $question->addPicture($this); $sql = "SELECT * FROM $table_ans WHERE c_id = $courseId AND question_id = ".$obj->id; $db_result2 = Database::query($sql); @@ -853,6 +912,8 @@ class CourseBuilder $obj->level, $obj->extra ); + $question->addPicture($this); + $sql = 'SELECT * FROM '.$table_ans.' WHERE question_id = '.$obj->id; $db_result2 = Database::query($sql); while ($obj2 = Database::fetch_object($db_result2)) { @@ -904,24 +965,26 @@ class CourseBuilder /** * Build the Surveys. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_surveys( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table_survey = Database::get_course_table(TABLE_SURVEY); $table_question = Database::get_course_table(TABLE_SURVEY_QUESTION); + $courseId = (int) $courseId; + $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); $sql = 'SELECT * FROM '.$table_survey.' @@ -971,6 +1034,8 @@ class CourseBuilder $table_que = Database::get_course_table(TABLE_SURVEY_QUESTION); $table_opt = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION); + $courseId = (int) $courseId; + $sql = 'SELECT * FROM '.$table_que.' WHERE c_id = '.$courseId.' '; $db_result = Database::query($sql); $is_required = 0; @@ -1005,15 +1070,15 @@ class CourseBuilder /** * Build the announcements. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_announcements( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table = Database::get_course_table(TABLE_ANNOUNCEMENT); @@ -1021,9 +1086,11 @@ class CourseBuilder $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); + $courseId = (int) $courseId; + $sql = 'SELECT * FROM '.$table.' WHERE c_id = '.$courseId.' '.$sessionCondition; $db_result = Database::query($sql); @@ -1067,15 +1134,15 @@ class CourseBuilder /** * Build the events. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_events( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table = Database::get_course_table(TABLE_AGENDA); @@ -1083,9 +1150,11 @@ class CourseBuilder $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); + $courseId = (int) $courseId; + $sql = 'SELECT * FROM '.$table.' WHERE c_id = '.$courseId.' '.$sessionCondition; $db_result = Database::query($sql); @@ -1125,22 +1194,23 @@ class CourseBuilder /** * Build the course-descriptions. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_course_descriptions( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table = Database::get_course_table(TABLE_COURSE_DESCRIPTION); + $courseId = (int) $courseId; if (!empty($session_id) && !empty($courseId)) { $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -1175,24 +1245,28 @@ class CourseBuilder /** * Build the learnpaths. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs + * @param bool $addScormFolder */ public function build_learnpaths( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $id_list = [], + $addScormFolder = true ) { $table_main = Database::get_course_table(TABLE_LP_MAIN); $table_item = Database::get_course_table(TABLE_LP_ITEM); $table_tool = Database::get_course_table(TABLE_TOOL_LIST); + $courseId = (int) $courseId; + if (!empty($session_id) && !empty($courseId)) { $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -1216,9 +1290,9 @@ class CourseBuilder $sql .= " AND id IN (".implode(', ', $id_list).") "; } - $db_result = Database::query($sql); - if ($db_result) { - while ($obj = Database::fetch_object($db_result)) { + $result = Database::query($sql); + if ($result) { + while ($obj = Database::fetch_object($result)) { $items = []; $sql = "SELECT * FROM ".$table_item." WHERE c_id = '$courseId' AND lp_id = ".$obj->id; @@ -1250,11 +1324,9 @@ class CourseBuilder (link LIKE '%lp_controller.php%lp_id=".$obj->id."%' AND image='scormbuilder.gif') AND visibility = '1' "; $db_tool = Database::query($sql); - + $visibility = '0'; if (Database::num_rows($db_tool)) { $visibility = '1'; - } else { - $visibility = '0'; } $lp = new CourseCopyLearnpath( @@ -1286,44 +1358,59 @@ class CourseBuilder $obj->session_id, $items ); + $this->course->add_resource($lp); + + if (!empty($obj->preview_image)) { + // Add LP teacher image + $asset = new Asset( + $obj->preview_image, + '/upload/learning_path/images/'.$obj->preview_image, + '/upload/learning_path/images/'.$obj->preview_image + ); + $this->course->add_resource($asset); + } } } // Save scorm directory (previously build_scorm_documents()) - $i = 1; - if ($dir = @opendir($this->course->backup_path.'/scorm')) { - while ($file = readdir($dir)) { - if (is_dir($this->course->backup_path.'/scorm/'.$file) && - !in_array($file, ['.', '..']) - ) { - $doc = new ScormDocument($i++, '/'.$file, $file); - $this->course->add_resource($doc); + if ($addScormFolder) { + $i = 1; + if ($dir = @opendir($this->course->backup_path.'/scorm')) { + while ($file = readdir($dir)) { + if (is_dir($this->course->backup_path.'/scorm/'.$file) && + !in_array($file, ['.', '..']) + ) { + $doc = new ScormDocument($i++, '/'.$file, $file); + $this->course->add_resource($doc); + } } + closedir($dir); } - closedir($dir); } } /** * Build the glossaries. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_glossary( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table_glossary = Database::get_course_table(TABLE_GLOSSARY); + $courseId = (int) $courseId; + if (!empty($session_id) && !empty($courseId)) { $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -1335,6 +1422,7 @@ class CourseBuilder true ); } + //@todo check this queries are the same ... if (!empty($this->course->type) && $this->course->type == 'partial') { $sql = 'SELECT * FROM '.$table_glossary.' g @@ -1403,22 +1491,23 @@ class CourseBuilder } /** - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_wiki( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $tbl_wiki = Database::get_course_table(TABLE_WIKI); + $courseId = (int) $courseId; if (!empty($session_id) && !empty($courseId)) { $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -1458,24 +1547,25 @@ class CourseBuilder /** * Build the Surveys. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_thematic( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table_thematic = Database::get_course_table(TABLE_THEMATIC); $table_thematic_advance = Database::get_course_table(TABLE_THEMATIC_ADVANCE); $table_thematic_plan = Database::get_course_table(TABLE_THEMATIC_PLAN); + $courseId = (int) $courseId; $courseInfo = api_get_course_info_by_id($courseId); $session_id = intval($session_id); - if ($with_base_content) { + if ($withBaseContent) { $session_condition = api_get_session_condition( $session_id, true, @@ -1532,21 +1622,21 @@ class CourseBuilder /** * Build the attendances. * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $id_list If you want to restrict the structure to only the given IDs */ public function build_attendance( $session_id = 0, $courseId = 0, - $with_base_content = false, + $withBaseContent = false, $id_list = [] ) { $table_attendance = Database::get_course_table(TABLE_ATTENDANCE); $table_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR); - - $sessionCondition = api_get_session_condition($session_id, true, $with_base_content); + $sessionCondition = api_get_session_condition($session_id, true, $withBaseContent); + $courseId = (int) $courseId; $sql = 'SELECT * FROM '.$table_attendance.' WHERE c_id = '.$courseId.' '.$sessionCondition; @@ -1567,33 +1657,42 @@ class CourseBuilder /** * Build the works (or "student publications", or "assignments"). * - * @param int $session_id Internal session ID - * @param int $courseId Internal course ID - * @param bool $with_base_content Whether to include content from the course without session or not - * @param array $id_list If you want to restrict the structure to only the given IDs + * @param int $session_id Internal session ID + * @param int $courseId Internal course ID + * @param bool $withBaseContent Whether to include content from the course without session or not + * @param array $idList If you want to restrict the structure to only the given IDs */ public function build_works( $session_id = 0, $courseId = 0, - $with_base_content = false, - $id_list = [] + $withBaseContent = false, + $idList = [] ) { $table_work = Database::get_course_table(TABLE_STUDENT_PUBLICATION); $sessionCondition = api_get_session_condition( $session_id, true, - $with_base_content + $withBaseContent ); + $courseId = (int) $courseId; + + $idCondition = ''; + if (!empty($idList)) { + $idList = array_map('intval', $idList); + $idCondition = ' AND iid IN ("'.implode('","', $idList).'") '; + } $sql = "SELECT * FROM $table_work WHERE - c_id = $courseId - $sessionCondition AND + c_id = $courseId + $sessionCondition AND filetype = 'folder' AND parent_id = 0 AND - active = 1"; - $db_result = Database::query($sql); - while ($row = Database::fetch_array($db_result, 'ASSOC')) { + active = 1 + $idCondition + "; + $result = Database::query($sql); + while ($row = Database::fetch_array($result, 'ASSOC')) { $obj = new Work($row); $this->course->add_resource($obj); } @@ -1602,12 +1701,12 @@ class CourseBuilder /** * @param int $session_id * @param int $courseId - * @param bool $with_base_content + * @param bool $withBaseContent */ public function build_gradebook( $session_id = 0, $courseId = 0, - $with_base_content = false + $withBaseContent = false ) { $courseInfo = api_get_course_info_by_id($courseId); $courseCode = $courseInfo['code']; diff --git a/src/CourseBundle/Component/CourseCopy/CourseRestorer.php b/src/CourseBundle/Component/CourseCopy/CourseRestorer.php index 0be540bc94..f1d7edd5b8 100644 --- a/src/CourseBundle/Component/CourseCopy/CourseRestorer.php +++ b/src/CourseBundle/Component/CourseCopy/CourseRestorer.php @@ -52,13 +52,13 @@ class CourseRestorer 'quizzes', 'test_category', 'links', - 'learnpaths', + 'works', 'surveys', + 'learnpaths', //'scorm_documents', ?? 'tool_intro', 'thematic', 'wiki', - 'works', 'gradebook', 'assets', ]; @@ -81,10 +81,9 @@ class CourseRestorer { $this->course = $course; $courseInfo = api_get_course_info($this->course->code); + $this->course_origin_id = null; if (!empty($courseInfo)) { $this->course_origin_id = $courseInfo['real_id']; - } else { - $this->course_origin_id = null; } $this->file_option = FILE_RENAME; $this->set_tools_invisible_by_default = false; @@ -289,6 +288,7 @@ class CourseRestorer return; } + $webEditorCss = api_get_path(WEB_CSS_PATH).'editor.css'; $table = Database::get_course_table(TABLE_DOCUMENT); $resources = $this->course->resources; $path = api_get_path(SYS_COURSE_PATH).$this->course->destination_path.'/'; @@ -297,7 +297,7 @@ class CourseRestorer $my_session_id = empty($document->item_properties[0]['id_session']) ? 0 : $session_id; if ($document->file_type == FOLDER) { - $visibility = $document->item_properties[0]['visibility']; + $visibility = isset($document->item_properties[0]['visibility']) ? $document->item_properties[0]['visibility'] : ''; $new = substr($document->path, 8); $folderList = explode('/', $new); @@ -332,7 +332,6 @@ class CourseRestorer $title, $visibility ); - continue; } @@ -356,7 +355,9 @@ class CourseRestorer null, false, null, - $my_session_id + $my_session_id, + 0, + false ); } else { $insertUserId = isset($document->item_properties[0]['insert_user_id']) ? $document->item_properties[0]['insert_user_id'] : api_get_user_id(); @@ -385,9 +386,8 @@ class CourseRestorer } } } elseif ($document->file_type == DOCUMENT) { - //Checking if folder exists in the database otherwise we created it + // Checking if folder exists in the database otherwise we created it $dir_to_create = dirname($document->path); - if (!empty($dir_to_create) && $dir_to_create != 'document' && $dir_to_create != '/') { if (is_dir($path.dirname($document->path))) { $sql = "SELECT id FROM $table @@ -395,6 +395,7 @@ class CourseRestorer c_id = ".$this->destination_course_id." AND path = '/".self::DBUTF8escapestring(substr(dirname($document->path), 9))."'"; $res = Database::query($sql); + if (Database::num_rows($res) == 0) { //continue; $visibility = $document->item_properties[0]['visibility']; @@ -413,6 +414,10 @@ class CourseRestorer $title, null, null, + false, + 0, + 0, + 0, false ); @@ -444,9 +449,9 @@ class CourseRestorer switch ($this->file_option) { case FILE_OVERWRITE: $origin_path = $this->course->backup_path.'/'.$document->path; - if (file_exists($origin_path)) { copy($origin_path, $path.$document->path); + $this->fixEditorHtmlContent($path.$document->path, $webEditorCss); $sql = "SELECT id FROM $table WHERE c_id = ".$this->destination_course_id." AND @@ -681,6 +686,7 @@ class CourseRestorer $this->course->info['path'] ); file_put_contents($dest_document_path, $content); + $this->fixEditorHtmlContent($dest_document_path, $webEditorCss); } } @@ -699,36 +705,36 @@ class CourseRestorer if ($document_id) { $sql = "UPDATE $table SET id = iid WHERE iid = $document_id"; Database::query($sql); - } - $this->course->resources[RESOURCE_DOCUMENT][$id]->destination_id = $document_id; + $this->course->resources[RESOURCE_DOCUMENT][$id]->destination_id = $document_id; - $itemProperty = isset($document->item_properties[0]) ? $document->item_properties[0] : ''; - $insertUserId = isset($itemProperty['insert_user_id']) ? $itemProperty['insert_user_id'] : api_get_user_id(); - $toGroupId = isset($itemProperty['to_group_id']) ? $itemProperty['to_group_id'] : 0; - $toUserId = isset($itemProperty['to_user_id']) ? $itemProperty['to_user_id'] : null; + $itemProperty = isset($document->item_properties[0]) ? $document->item_properties[0] : ''; + $insertUserId = isset($itemProperty['insert_user_id']) ? $itemProperty['insert_user_id'] : api_get_user_id(); + $toGroupId = isset($itemProperty['to_group_id']) ? $itemProperty['to_group_id'] : 0; + $toUserId = isset($itemProperty['to_user_id']) ? $itemProperty['to_user_id'] : null; - $insertUserId = $this->checkUserId($insertUserId); - $toUserId = $this->checkUserId($toUserId, true); - $groupInfo = $this->checkGroupId($toGroupId); + $insertUserId = $this->checkUserId($insertUserId); + $toUserId = $this->checkUserId($toUserId, true); + $groupInfo = $this->checkGroupId($toGroupId); - api_item_property_update( - $course_info, - TOOL_DOCUMENT, - $document_id, - 'DocumentAdded', - $insertUserId, - $groupInfo, - $toUserId, - null, - null, - $my_session_id - ); + api_item_property_update( + $course_info, + TOOL_DOCUMENT, + $document_id, + 'DocumentAdded', + $insertUserId, + $groupInfo, + $toUserId, + null, + null, + $my_session_id + ); + } } else { if (file_exists($path.$document->path)) { copy($path.$document->path, $path.$new_file_name); } - //Replace old course code with the new destination code see BT#1985 + // Replace old course code with the new destination code see BT#1985 if (file_exists($path.$new_file_name)) { $file_info = pathinfo($path.$new_file_name); if (in_array($file_info['extension'], ['html', 'htm'])) { @@ -744,6 +750,7 @@ class CourseRestorer $this->course->info['path'] ); file_put_contents($path.$new_file_name, $content); + $this->fixEditorHtmlContent($path.$new_file_name, $webEditorCss); } } @@ -810,6 +817,7 @@ class CourseRestorer $this->course->info['path'] ); file_put_contents($path.$new_file_name, $content); + $this->fixEditorHtmlContent($path.$new_file_name, $webEditorCss); } } @@ -828,31 +836,30 @@ class CourseRestorer if ($document_id) { $sql = "UPDATE $table SET id = iid WHERE iid = $document_id"; Database::query($sql); - } + $this->course->resources[RESOURCE_DOCUMENT][$id]->destination_id = $document_id; - $this->course->resources[RESOURCE_DOCUMENT][$id]->destination_id = $document_id; - - $itemProperty = isset($document->item_properties[0]) ? $document->item_properties[0] : ''; - $insertUserId = isset($itemProperty['insert_user_id']) ? $itemProperty['insert_user_id'] : api_get_user_id(); - $toGroupId = isset($itemProperty['to_group_id']) ? $itemProperty['to_group_id'] : 0; - $toUserId = isset($itemProperty['to_user_id']) ? $itemProperty['to_user_id'] : null; - - $insertUserId = $this->checkUserId($insertUserId); - $toUserId = $this->checkUserId($toUserId, true); - $groupInfo = $this->checkGroupId($toGroupId); - - api_item_property_update( - $course_info, - TOOL_DOCUMENT, - $document_id, - 'DocumentAdded', - $insertUserId, - $groupInfo, - $toUserId, - null, - null, - $my_session_id - ); + $itemProperty = isset($document->item_properties[0]) ? $document->item_properties[0] : ''; + $insertUserId = isset($itemProperty['insert_user_id']) ? $itemProperty['insert_user_id'] : api_get_user_id(); + $toGroupId = isset($itemProperty['to_group_id']) ? $itemProperty['to_group_id'] : 0; + $toUserId = isset($itemProperty['to_user_id']) ? $itemProperty['to_user_id'] : null; + + $insertUserId = $this->checkUserId($insertUserId); + $toUserId = $this->checkUserId($toUserId, true); + $groupInfo = $this->checkGroupId($toGroupId); + + api_item_property_update( + $course_info, + TOOL_DOCUMENT, + $document_id, + 'DocumentAdded', + $insertUserId, + $groupInfo, + $toUserId, + null, + null, + $my_session_id + ); + } } break; } // end switch @@ -885,6 +892,7 @@ class CourseRestorer $this->course->info['path'] ); file_put_contents($path.$document->path, $content); + $this->fixEditorHtmlContent($path.$document->path, $webEditorCss); } } @@ -904,47 +912,61 @@ class CourseRestorer if ($document_id) { $sql = "UPDATE $table SET id = iid WHERE iid = $document_id"; Database::query($sql); - } - $this->course->resources[RESOURCE_DOCUMENT][$id]->destination_id = $document_id; + $this->course->resources[RESOURCE_DOCUMENT][$id]->destination_id = $document_id; - $itemProperty = isset($document->item_properties[0]) ? $document->item_properties[0] : ''; - $insertUserId = isset($itemProperty['insert_user_id']) ? $itemProperty['insert_user_id'] : api_get_user_id(); - $toGroupId = isset($itemProperty['to_group_id']) ? $itemProperty['to_group_id'] : 0; - $toUserId = isset($itemProperty['to_user_id']) ? $itemProperty['to_user_id'] : null; + $itemProperty = isset($document->item_properties[0]) ? $document->item_properties[0] : ''; + $insertUserId = isset($itemProperty['insert_user_id']) ? $itemProperty['insert_user_id'] : api_get_user_id(); + $toGroupId = isset($itemProperty['to_group_id']) ? $itemProperty['to_group_id'] : 0; + $toUserId = isset($itemProperty['to_user_id']) ? $itemProperty['to_user_id'] : null; - $insertUserId = $this->checkUserId($insertUserId); - $toUserId = $this->checkUserId($toUserId, true); - $groupInfo = $this->checkGroupId($toGroupId); + $insertUserId = $this->checkUserId($insertUserId); + $toUserId = $this->checkUserId($toUserId, true); + $groupInfo = $this->checkGroupId($toGroupId); - api_item_property_update( - $course_info, - TOOL_DOCUMENT, - $document_id, - 'DocumentAdded', - $insertUserId, - $groupInfo, - $toUserId, - null, - null, - $my_session_id - ); + api_item_property_update( + $course_info, + TOOL_DOCUMENT, + $document_id, + 'DocumentAdded', + $insertUserId, + $groupInfo, + $toUserId, + null, + null, + $my_session_id + ); + } } else { // There was an error in checking existence and // permissions for files to copy. Try to determine // the exact issue // Issue with origin document? if (!is_file($this->course->backup_path.'/'.$document->path)) { - error_log('Course copy generated an ignorable error while trying to copy '.$this->course->backup_path.'/'.$document->path.': origin file not found'); + error_log( + 'Course copy generated an ignorable error while trying to copy '. + $this->course->backup_path.'/'.$document->path.': origin file not found' + ); } elseif (!is_readable($this->course->backup_path.'/'.$document->path)) { - error_log('Course copy generated an ignorable error while trying to copy '.$this->course->backup_path.'/'.$document->path.': origin file not readable'); + error_log( + 'Course copy generated an ignorable error while trying to copy '. + $this->course->backup_path.'/'.$document->path.': origin file not readable' + ); } // Issue with destination directories? if (!is_dir(dirname($path.$document->path))) { - error_log('Course copy generated an ignorable error while trying to copy '.$this->course->backup_path.'/'.$document->path.' to '.dirname($path.$document->path).': destination directory not found'); + error_log( + 'Course copy generated an ignorable error while trying to copy '. + $this->course->backup_path.'/'.$document->path.' to '. + dirname($path.$document->path).': destination directory not found' + ); } if (!is_writeable(dirname($path.$document->path))) { - error_log('Course copy generated an ignorable error while trying to copy '.$this->course->backup_path.'/'.$document->path.' to '.dirname($path.$document->path).': destination directory not writable'); + error_log( + 'Course copy generated an ignorable error while trying to copy '. + $this->course->backup_path.'/'.$document->path.' to '. + dirname($path.$document->path).': destination directory not writable' + ); } } } // end file doesn't exist @@ -1030,7 +1052,6 @@ class CourseRestorer $this->course->backup_path.'/'.$new_file_name, $this->course->backup_path.'/'.$document->path ); - break; } // end switch } else { @@ -1091,7 +1112,8 @@ class CourseRestorer if (!empty($params['forum_image'])) { $original_forum_image = $this->course->path.'upload/forum/images/'.$params['forum_image']; if (file_exists($original_forum_image)) { - $new_forum_image = api_get_path(SYS_COURSE_PATH).$this->destination_course_info['path'].'/upload/forum/images/'.$params['forum_image']; + $new_forum_image = api_get_path(SYS_COURSE_PATH). + $this->destination_course_info['path'].'/upload/forum/images/'.$params['forum_image']; @copy($original_forum_image, $new_forum_image); } } @@ -1101,6 +1123,15 @@ class CourseRestorer if ($new_id) { $sql = "UPDATE $table_forum SET forum_id = iid WHERE iid = $new_id"; Database::query($sql); + + api_item_property_update( + $this->destination_course_info, + TOOL_FORUM, + $new_id, + 'ForumUpdated', + api_get_user_id() + ); + $this->course->resources[RESOURCE_FORUM][$id]->destination_id = $new_id; $forum_topics = 0; @@ -1158,9 +1189,17 @@ class CourseRestorer if ($new_id) { $sql = "UPDATE $forum_cat_table SET cat_id = iid WHERE iid = $new_id"; Database::query($sql); + + api_item_property_update( + $this->destination_course_info, + TOOL_FORUM_CATEGORY, + $new_id, + 'ForumCategoryUpdated', + api_get_user_id() + ); + $this->course->resources[RESOURCE_FORUMCATEGORY][$id]->destination_id = $new_id; } - $this->course->resources[RESOURCE_FORUMCATEGORY][$id]->destination_id = $new_id; if (!empty($my_id)) { return $new_id; } @@ -1201,28 +1240,28 @@ class CourseRestorer if ($new_id) { $sql = "UPDATE $table SET thread_id = iid WHERE iid = $new_id"; Database::query($sql); - } - api_item_property_update( - $this->destination_course_info, - TOOL_FORUM_THREAD, - $new_id, - 'ThreadAdded', - api_get_user_id(), - 0, - 0, - null, - null, - $sessionId - ); + api_item_property_update( + $this->destination_course_info, + TOOL_FORUM_THREAD, + $new_id, + 'ThreadAdded', + api_get_user_id(), + 0, + 0, + null, + null, + $sessionId + ); - $this->course->resources[RESOURCE_FORUMTOPIC][$thread_id]->destination_id = $new_id; - $topic_replies = -1; + $this->course->resources[RESOURCE_FORUMTOPIC][$thread_id]->destination_id = $new_id; + $topic_replies = -1; - foreach ($this->course->resources[RESOURCE_FORUMPOST] as $post_id => $post) { - if ($post->obj->thread_id == $thread_id) { - $topic_replies++; - $this->restore_post($post_id, $new_id, $forum_id, $sessionId); + foreach ($this->course->resources[RESOURCE_FORUMPOST] as $post_id => $post) { + if ($post->obj->thread_id == $thread_id) { + $topic_replies++; + $this->restore_post($post_id, $new_id, $forum_id, $sessionId); + } } } @@ -1263,21 +1302,21 @@ class CourseRestorer if ($new_id) { $sql = "UPDATE $table_post SET post_id = iid WHERE iid = $new_id"; Database::query($sql); - } - api_item_property_update( - $this->destination_course_info, - TOOL_FORUM_POST, - $new_id, - 'PostAdded', - api_get_user_id(), - 0, - 0, - null, - null, - $sessionId - ); - $this->course->resources[RESOURCE_FORUMPOST][$id]->destination_id = $new_id; + api_item_property_update( + $this->destination_course_info, + TOOL_FORUM_POST, + $new_id, + 'PostAdded', + api_get_user_id(), + 0, + 0, + null, + null, + $sessionId + ); + $this->course->resources[RESOURCE_FORUMPOST][$id]->destination_id = $new_id; + } return $new_id; } @@ -1346,6 +1385,8 @@ class CourseRestorer * * @param int * @param int + * + * @return bool */ public function restore_link_category($id, $session_id = 0) { @@ -1591,7 +1632,6 @@ class CourseRestorer ); $params = []; - $session_id = intval($session_id); $params['session_id'] = $session_id; $params['c_id'] = $this->destination_course_id; @@ -1817,7 +1857,7 @@ class CourseRestorer 'end_time' => $quiz->end_time, 'save_correct_answers' => 0, 'display_category_name' => 0, - 'save_correct_answers' => $quiz->save_correct_answers, + 'save_correct_answers' => isset($quiz->save_correct_answers) ? $quiz->save_correct_answers : 0, 'hide_question_title' => isset($quiz->hide_question_title) ? $quiz->hide_question_title : 0, ]; @@ -2322,7 +2362,7 @@ class CourseRestorer 'session_id' => $sessionId, ]; - //An existing survey exists with the same code and the same language + // An existing survey exists with the same code and the same language if (Database::num_rows($result_check) == 1) { switch ($this->file_option) { case FILE_SKIP: @@ -2544,8 +2584,7 @@ class CourseRestorer */ public function restore_learnpaths($session_id = 0, $respect_base_content = false) { - $session_id = intval($session_id); - + $session_id = (int) $session_id; if ($this->course->has_resources(RESOURCE_LEARNPATH)) { $table_main = Database::get_course_table(TABLE_LP_MAIN); $table_item = Database::get_course_table(TABLE_LP_ITEM); @@ -2720,8 +2759,7 @@ class CourseRestorer if ($item['item_type'] == 'sco') { $path = $item['path']; } else { - $path = $item['path']; - $path = $this->get_new_id($item['item_type'], $path); + $path = $this->get_new_id($item['item_type'], $item['path']); } $item['item_type'] = $item['item_type'] == 'dokeos_chapter' ? 'dir' : $item['item_type']; @@ -2748,38 +2786,38 @@ class CourseRestorer ]; $new_item_id = Database::insert($table_item, $params); + if ($new_item_id) { + $sql = "UPDATE $table_item SET id = iid WHERE iid = $new_item_id"; + Database::query($sql); - $sql = "UPDATE $table_item SET id = iid WHERE iid = $new_item_id"; - Database::query($sql); - - //save a link between old and new item IDs - $new_item_ids[$item['id']] = $new_item_id; - //save a reference of items that need a parent_item_id refresh - $parent_item_ids[$new_item_id] = $item['parent_item_id']; - //save a reference of items that need a previous_item_id refresh - $previous_item_ids[$new_item_id] = $item['previous_item_id']; - //save a reference of items that need a next_item_id refresh - $next_item_ids[$new_item_id] = $item['next_item_id']; - - if (!empty($item['prerequisite'])) { - if ($lp->lp_type == '2') { - // if is an sco - $old_prerequisite[$new_item_id] = $item['prerequisite']; - } else { - $old_prerequisite[$new_item_id] = $new_item_ids[$item['prerequisite']]; + //save a link between old and new item IDs + $new_item_ids[$item['id']] = $new_item_id; + //save a reference of items that need a parent_item_id refresh + $parent_item_ids[$new_item_id] = $item['parent_item_id']; + //save a reference of items that need a previous_item_id refresh + $previous_item_ids[$new_item_id] = $item['previous_item_id']; + //save a reference of items that need a next_item_id refresh + $next_item_ids[$new_item_id] = $item['next_item_id']; + + if (!empty($item['prerequisite'])) { + if ($lp->lp_type == '2') { + // if is an sco + $old_prerequisite[$new_item_id] = $item['prerequisite']; + } else { + $old_prerequisite[$new_item_id] = isset($new_item_ids[$item['prerequisite']]) ? $new_item_ids[$item['prerequisite']] : ''; + } } - } - if (!empty($ref)) { - if ($lp->lp_type == '2') { - // if is an sco - $old_refs[$new_item_id] = $ref; - } elseif (isset($new_item_ids[$ref])) { - $old_refs[$new_item_id] = $new_item_ids[$ref]; + if (!empty($ref)) { + if ($lp->lp_type == '2') { + // if is an sco + $old_refs[$new_item_id] = $ref; + } elseif (isset($new_item_ids[$ref])) { + $old_refs[$new_item_id] = $new_item_ids[$ref]; + } } + $prerequisite_ids[$new_item_id] = $item['prerequisite']; } - - $prerequisite_ids[$new_item_id] = $item['prerequisite']; } // Updating prerequisites @@ -2809,6 +2847,7 @@ class CourseRestorer WHERE c_id = ".$this->destination_course_id." AND id = '".$new_item_id."'"; Database::query($sql); } + foreach ($previous_item_ids as $new_item_id => $previous_item_old_id) { $previous_new_id = 0; if ($previous_item_old_id != 0) { @@ -2896,6 +2935,10 @@ class CourseRestorer $tool = 'document'; } + if ($tool === 'student_publication') { + $tool = RESOURCE_WORK; + } + if (isset($this->course->resources[$tool][$ref]) && isset($this->course->resources[$tool][$ref]->destination_id) && !empty($this->course->resources[$tool][$ref]->destination_id) @@ -3208,7 +3251,7 @@ class CourseRestorer { require_once api_get_path(SYS_CODE_PATH).'work/work.lib.php'; if ($this->course->has_resources(RESOURCE_WORK)) { - $table_work_assignment = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT); + $table = Database::get_course_table(TABLE_STUDENT_PUBLICATION_ASSIGNMENT); $resources = $this->course->resources; foreach ($resources[RESOURCE_WORK] as $obj) { @@ -3231,6 +3274,7 @@ class CourseRestorer $path = '/'.str_replace('/', '', substr($path, 1)); $workData = []; + switch ($this->file_option) { case FILE_SKIP: $workData = get_work_data_by_path( @@ -3243,11 +3287,10 @@ class CourseRestorer break; case FILE_OVERWRITE: if (!empty($this->course_origin_id)) { - $sql = 'SELECT * FROM '.$table_work_assignment.' + $sql = 'SELECT * FROM '.$table.' WHERE c_id = '.$this->course_origin_id.' AND publication_id = '.$id_work; - $result = Database::query($sql); $cant = Database::num_rows($result); if ($cant > 0) { @@ -3274,13 +3317,14 @@ class CourseRestorer $obj->params['new_dir'] = $obj->params['title']; if (empty($workData)) { - addDir( + $workId = addDir( $obj->params, api_get_user_id(), $this->destination_course_info, 0, $sessionId ); + $this->course->resources[RESOURCE_WORK][$id_work]->destination_id = $workId; } else { $workId = $workData['iid']; updateWork( @@ -3295,6 +3339,7 @@ class CourseRestorer $this->destination_course_info, 0 ); + $this->course->resources[RESOURCE_WORK][$id_work]->destination_id = $workId; } } } @@ -3425,7 +3470,7 @@ class CourseRestorer $resources = $this->course->resources; $path = api_get_path(SYS_COURSE_PATH).$this->course->destination_path.'/'; - foreach ($resources[RESOURCE_ASSET] as $id => $asset) { + foreach ($resources[RESOURCE_ASSET] as $asset) { if (is_file($this->course->backup_path.'/'.$asset->path) && is_readable($this->course->backup_path.'/'.$asset->path) && is_dir(dirname($path.$asset->path)) && @@ -3502,6 +3547,28 @@ class CourseRestorer return \GroupManager::get_group_properties($groupId); } + /** + * @param string $documentPath + * @param string $webEditorCss + */ + public function fixEditorHtmlContent($documentPath, $webEditorCss = '') + { + $extension = pathinfo(basename($documentPath), PATHINFO_EXTENSION); + + switch ($extension) { + case 'html': + case 'htm': + $contents = file_get_contents($documentPath); + $contents = str_replace( + '{{css_editor}}', + $webEditorCss, + $contents + ); + file_put_contents($documentPath, $contents); + break; + } + } + /** * Check if user exist otherwise use current user. * diff --git a/src/CourseBundle/Component/CourseCopy/CourseSelectForm.php b/src/CourseBundle/Component/CourseCopy/CourseSelectForm.php index b37c8c7a10..bfd06c8e58 100644 --- a/src/CourseBundle/Component/CourseCopy/CourseSelectForm.php +++ b/src/CourseBundle/Component/CourseCopy/CourseSelectForm.php @@ -242,8 +242,12 @@ class CourseSelectForm echo '
'; echo '
'; - echo "".get_lang('All').""; - echo "".get_lang('None').""; + echo "".get_lang('All').""; + echo "".get_lang('None').""; echo '
'; echo '