From d19e4849e92a6a14d2e98625d1e055354468cfd2 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Thu, 15 Oct 2015 16:05:30 -0500 Subject: [PATCH 01/16] Minor - Avoid notices in tracking pages --- main/inc/lib/myspace.lib.php | 8 ++++---- main/mySpace/course.php | 2 +- main/tracking/exams.php | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/main/inc/lib/myspace.lib.php b/main/inc/lib/myspace.lib.php index cf27eb30bf..8e03832dc7 100644 --- a/main/inc/lib/myspace.lib.php +++ b/main/inc/lib/myspace.lib.php @@ -465,8 +465,8 @@ class MySpace if ($is_western_name_order) { $csv_content[] = array( - api_html_entity_decode($coaches['firstname'], ENT_QUOTES, $charset), - api_html_entity_decode($coaches['lastname'], ENT_QUOTES, $charset), + api_html_entity_decode($coaches['firstname'], ENT_QUOTES), + api_html_entity_decode($coaches['lastname'], ENT_QUOTES), $time_on_platform, $last_connection, $nb_students, @@ -475,8 +475,8 @@ class MySpace ); } else { $csv_content[] = array( - api_html_entity_decode($coaches['lastname'], ENT_QUOTES, $charset), - api_html_entity_decode($coaches['firstname'], ENT_QUOTES, $charset), + api_html_entity_decode($coaches['lastname'], ENT_QUOTES), + api_html_entity_decode($coaches['firstname'], ENT_QUOTES), $time_on_platform, $last_connection, $nb_students, diff --git a/main/mySpace/course.php b/main/mySpace/course.php index 92fa96a709..c59353f0df 100755 --- a/main/mySpace/course.php +++ b/main/mySpace/course.php @@ -108,7 +108,7 @@ if (api_is_drh() || api_is_session_admin() || api_is_platform_admin()) { } } - $actionsLeft = ''; + $actionsLeft = $actionsRight = ''; $nb_menu_items = count($menu_items); if ($nb_menu_items > 1) { foreach ($menu_items as $key => $item) { diff --git a/main/tracking/exams.php b/main/tracking/exams.php index 84f84238ea..3d7393fc35 100755 --- a/main/tracking/exams.php +++ b/main/tracking/exams.php @@ -81,7 +81,7 @@ $form->setDefaults(array('score' => $filter_score)); if (!$exportToXLS) { Display :: display_header(get_lang('Reporting')); - $actionsLeft = ''; + $actionsLeft = $actionsRight =''; if ($global) { $actionsLeft .= ''. From a47f82e0a19379b4807bc7f830fbde98efbcafcb Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Thu, 15 Oct 2015 20:38:52 -0500 Subject: [PATCH 02/16] Fix proble with PHP version --- main/gamification/my_progress.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/main/gamification/my_progress.php b/main/gamification/my_progress.php index 29f5379fc5..4d9e791822 100644 --- a/main/gamification/my_progress.php +++ b/main/gamification/my_progress.php @@ -33,8 +33,9 @@ if (empty($sessionId)) { ); $lastCourseAccess = $trackCourseAccessRepository->getLastAccessByUser($user); + $lastSessionId = $lastCourseAccess->getSessionId(); - if (!empty($lastCourseAccess->getSessionId())) { + if (!empty($lastSessionId)) { $urlWithSession = api_get_self() . '?' . http_build_query([ 'session_id' => $lastCourseAccess->getSessionId() ]); From dcb409711048bc8877e11555a854b88eab32c7b3 Mon Sep 17 00:00:00 2001 From: aragonc Date: Thu, 15 Oct 2015 20:46:15 -0500 Subject: [PATCH 03/16] fix list search friends and groups red social refs - CT#7539 --- app/Resources/public/css/base.css | 29 ++----- main/social/search.php | 86 +++++++++++-------- main/template/default/social/avatar_block.tpl | 2 +- main/template/default/social/search.tpl | 17 ++-- 4 files changed, 64 insertions(+), 70 deletions(-) diff --git a/app/Resources/public/css/base.css b/app/Resources/public/css/base.css index a05b94f8bd..be5e304d13 100644 --- a/app/Resources/public/css/base.css +++ b/app/Resources/public/css/base.css @@ -3305,27 +3305,6 @@ a.forum_group_link { margin-bottom:5px; } -/* User list */ - -.blackboard_show { - float:left; - position:absolute; - border:1px solid black; - width: 200px; - background-color:white; - z-index:99; padding: 3px; - display: inline; -} -.blackboard_hide { - display: none; -} - -#online_grid_container { - list-style: none; - margin: 0; - padding: 0; -} - #hide_bar_template { vertical-align: middle; width: 10px; @@ -5484,13 +5463,19 @@ div#chat-remote-video video { box-shadow: 0 2px 3px #C8C8C8; border: 1px solid #e6e6e6; margin-bottom: 20px; - min-height: 240px; + min-height: 230px; +} +#whoisonline .items-user-avatar .img-responsive{ + display: inline-block; } #whoisonline .items-user-name{ font-size: 12px; padding-top: 10px; line-height: 15px; } +#whoisonline .items-user .toolbar .btn, #whoisonline .items-user .items-user-status{ + margin-bottom: 5px; +} .search-user label{ font-weight: normal; padding-left: 10px; diff --git a/main/social/search.php b/main/social/search.php index 6b7f42f256..d01df391e0 100755 --- a/main/social/search.php +++ b/main/social/search.php @@ -35,7 +35,7 @@ if (!empty($extra_fields)) { //Block Social Menu $social_menu_block = SocialManager::show_social_menu('search'); -$social_right_content = ''; +$block_search = ''; $searchForm = UserManager::get_search_form($query); $groups = array(); @@ -47,7 +47,7 @@ $usergroup = new UserGroup(); // I'm searching something if ($query != '' || ($query_vars['search_type']=='1' && count($query_vars)>2) ) { - $itemPerPage = 9; + $itemPerPage = 8; if ($_GET['search_type']=='0' || $_GET['search_type']=='1') { $page = isset($_GET['users_page_nr']) ? intval($_GET['users_page_nr']) : 1; @@ -71,9 +71,9 @@ if ($query != '' || ($query_vars['search_type']=='1' && count($query_vars)>2) ) Display::addFlash(Display::return_message(get_lang('SorryNoResults'))); } - $results = '
'; + $results = '
'; if (is_array($users) && count($users) > 0) { - $results .= Display::page_subheader(get_lang('Users')); + $results .= '
'; $buttonClass = 'btn btn-default btn-sm'; foreach ($users as $user) { @@ -105,29 +105,35 @@ if ($query != '' || ($query_vars['search_type']=='1' && count($query_vars)>2) ) ] ); - $img = ''; + $img = ''; if ($user_info['user_is_online']) { - $status_icon = Display::span('', array('class' => 'online_user_in_text')); + $status_icon = Display::return_icon('online.png', get_lang('OnLine'), null, ICON_SIZE_TINY); } else { - $status_icon = Display::span('', array('class' => 'offline_user_in_text')); + $status_icon = Display::return_icon('offline.png', get_lang('Disconnected'), null, ICON_SIZE_TINY); + } + + if ($user_info['status'] == 5) { + $user_icon = Display::return_icon('user.png', get_lang('Student'), null, ICON_SIZE_TINY); + } else { + $user_icon = Display::return_icon('teacher.png', get_lang('Teacher'), null, ICON_SIZE_TINY); } $tag = isset($user['tag']) ? '

'.$user['tag'] : null; - $user_info['complete_name'] = Display::url($status_icon.$user_info['complete_name'], $url); + $user_info['complete_name'] = Display::url($user_info['complete_name'], $url); $invitations = $user['tag'].$send_inv.$send_msg; - $results .= '
-
- -
+ $results .= '
+
+
'.$img.'
-
- '.$user_info['complete_name'].' -
+
'; @@ -135,11 +141,12 @@ if ($query != '' || ($query_vars['search_type']=='1' && count($query_vars)>2) ) } $results .= '
'; - $social_right_content .= $results; + + } $visibility = array(true, true, true, true, true); - $social_right_content .= Display::return_sortable_grid( + $results .= Display::return_sortable_grid( 'users', null, null, @@ -152,53 +159,56 @@ if ($query != '' || ($query_vars['search_type']=='1' && count($query_vars)>2) ) $totalUsers ); + $block_search .= Display::panelCollapse(get_lang('Users'), $results, 'search-friends', null, 'friends-acorderon', 'friends-collapse'); + $grid_groups = array(); + $block_groups = '
'; if (is_array($groups) && count($groups) > 0) { - $social_right_content .= '
'; - $social_right_content .= Display::page_subheader(get_lang('Groups')); - + $block_groups .= '
'; + } $visibility = array(true, true, true, true, true); - $social_right_content .= Display::return_sortable_grid( + $block_groups .= Display::return_sortable_grid( 'groups', null, $grid_groups, @@ -210,13 +220,15 @@ if ($query != '' || ($query_vars['search_type']=='1' && count($query_vars)>2) ) array(), $totalGroups ); + + $block_search .= Display:: panelCollapse(get_lang('Groups'), $block_groups, 'search-groups', null, 'groups-acorderon', 'groups-collapse'); } $tpl = new Template($tool_name); // Block Social Avatar SocialManager::setSocialUserBlock($tpl, $user_id, 'search'); $tpl->assign('social_menu_block', $social_menu_block); -$tpl->assign('social_right_content', $social_right_content); +$tpl->assign('social_search', $block_search); $tpl->assign('search_form', $searchForm); $formModalTpl = new Template(); diff --git a/main/template/default/social/avatar_block.tpl b/main/template/default/social/avatar_block.tpl index 6d88575f47..2d5e8d2a8a 100644 --- a/main/template/default/social/avatar_block.tpl +++ b/main/template/default/social/avatar_block.tpl @@ -1,4 +1,4 @@ -
'.Display::returnFontAwesomeIcon('user').$result['count'].'
'; $picture = $userGroup->get_picture_group( $id, @@ -170,7 +170,7 @@ if ($list > 0) { for($i = 0;$i < $list; $i++){ $social_group_block.='
'; $social_group_block.='
' . $groups_newest[$i][0] . '
'; - $social_group_block.='
' . $groups_newest[$i][1]; + $social_group_block.='
' . $groups_newest[$i][1]; $social_group_block.= $groups_newest[$i][2] . '
'; $social_group_block.="
"; } @@ -184,7 +184,7 @@ if ($list > 0) { for($i = 0;$i < $list; $i++){ $social_group_block.='
'; $social_group_block.='
' . $groups_pop[$i][0] . '
'; - $social_group_block.='
' . $groups_pop[$i][1]; + $social_group_block.='
' . $groups_pop[$i][1]; $social_group_block.= $groups_pop[$i][2] . '
'; $social_group_block.="
"; } @@ -205,7 +205,7 @@ if (count($sessionList) > 0) { $social_session_block = $sessionList; } -$social_group_block = Display::panel($social_group_block, get_lang('Group')); +$social_group_block = Display::panelCollapse(get_lang('Group'), $social_group_block, 'sm-groups', null, 'grups-acordion', 'groups-collapse'); $tpl = new Template(get_lang('SocialNetwork')); SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'home'); From 00af0fac4ec05b7b4f2cde0ae47d8a592f9833fb Mon Sep 17 00:00:00 2001 From: aragonc Date: Thu, 15 Oct 2015 22:40:42 -0500 Subject: [PATCH 05/16] fix list groups in groups.tpl refs - CT#7539 --- app/Resources/public/css/base.css | 105 +----------------- main/inc/lib/text.lib.php | 2 +- main/social/groups.php | 112 ++++++++++++-------- main/template/default/social/group_view.tpl | 2 +- main/template/default/social/groups.tpl | 14 +-- 5 files changed, 75 insertions(+), 160 deletions(-) diff --git a/app/Resources/public/css/base.css b/app/Resources/public/css/base.css index 57e47bfe94..c98cdd1def 100644 --- a/app/Resources/public/css/base.css +++ b/app/Resources/public/css/base.css @@ -1425,107 +1425,6 @@ a.unread { text-align:right; } -#group_description { - margin: 10px 0px 10px 0px; -} - -#group_privacy { - margin: 10px 0px 10px 0px; -} - -#group_permissions { - -moz-background-clip:border; - -moz-background-inline-policy:continuous; - -moz-background-origin:padding; - -moz-border-radius-bottomleft:8px; - -moz-border-radius-bottomright:8px; - -moz-border-radius-topleft:8px; - -moz-border-radius-topright:8px; - background:#EEE none repeat scroll 0 0; - margin: 20px 0px 20px 0px; -} - -#group_permissions ul { - list-style-image:none; - list-style-position:outside; - list-style-type:none; - margin:0; - padding:0; -} - -#group_permissions ul li { - margin: 10px 0px 10px 5px; -} - -/* Groups boxes */ - -.groups_grid_container { - width:100%; -} -.groups_grid_item { - width:80px; - float:left; - margin:5px; -} -.groups_grid_element_0 { width:100px; float:left; text-align:center; margin-bottom:5px;} -.groups_grid_element_1 { width:100px; float:left; text-align:left; margin-bottom:5px;} -.groups_grid_element_2 { width:150px; float:left;} - -/*MY GROUPS*/ - -.mygroups_grid_item { - border-bottom:1px solid #EAEAEA; - float: left; - height: 70px; - margin: 0 8px 15px 15px; - padding: 16px 12px 40px 0px; - width:600px; -} - -.topic_div { - width:620px; - border-bottom:1px solid #EAEAEA; - margin-bottom: 20px; - height: 96px; -} - -.box_description_group_member { - color: #999999; - font-size: 10px; -} - -.mygroups_grid_element_1 { - width:600px; - height:100px; - overflow:hidden; -} - -.box_description_group_title h2 { - margin-bottom:4px; - margin-top: 0px; -} - -.box_description_group_title { - float:right; - width:530px; -} -.box_description_group_content { - float:right; - width:530px; - margin-top:5px; - /* height:45px;*/ - font-family:Verdana, Geneva, sans-serif; - font-size:12px; - color:#666666; -} -.box_description_group_actions { - float:right; - width:530px; - text-align:right; - margin-top:4px; - margin-right:4px; -} - /* Big icons course home page styles */ #course_tools .big_icon { padding:10px; @@ -4122,6 +4021,10 @@ i.size-32.icon-new-work{ padding-bottom: 0px; font-size: 11px; } +.sm-groups .social-profile .img-responsive{ + display: inline-block; + width: 100px; +} .social-post .mediaPost{ padding-top:10px; padding-bottom: 5px; diff --git a/main/inc/lib/text.lib.php b/main/inc/lib/text.lib.php index 83610f480b..7484fa008a 100755 --- a/main/inc/lib/text.lib.php +++ b/main/inc/lib/text.lib.php @@ -633,7 +633,7 @@ function _split_str_by_whitespace( $string, $goal ) { function cut($text, $maxchar, $embed = false) { if (api_strlen($text) > $maxchar) { if ($embed) { - return ''.api_substr($text, 0, $maxchar).'...'; + return '

'.api_substr($text, 0, $maxchar).'...

'; } return api_substr($text, 0, $maxchar).' ...'; } diff --git a/main/social/groups.php b/main/social/groups.php index ff68d77a96..e770e5ecdf 100755 --- a/main/social/groups.php +++ b/main/social/groups.php @@ -64,15 +64,15 @@ if (is_array($results) && count($results) > 0) { $result['name'] = Security::remove_XSS($result['name'], STUDENT, true); $result['description'] = Security::remove_XSS($result['description'], STUDENT, true); $my_group_list[] = $id; - $url_open = '
'; - $url_close = ''; - $name = cut($result['name'], GROUP_TITLE_LENGTH, true); + if ($result['relation_type'] == GROUP_USER_PERMISSION_ADMIN) { $name .= ' '.Display::return_icon('social_group_admin.png', get_lang('Admin'), array('style'=>'vertical-align:middle')); } elseif ($result['relation_type'] == GROUP_USER_PERMISSION_MODERATOR) { $name .= ' '.Display::return_icon('social_group_moderator.png', get_lang('Moderator'), array('style'=>'vertical-align:middle')); } + $url = '' . $name . ''; + $count_users_group = count($usergroup->get_users_by_group($id, false, array(GROUP_USER_PERMISSION_ADMIN, GROUP_USER_PERMISSION_READER, GROUP_USER_PERMISSION_MODERATOR), 0 , 1000)); if ($count_users_group == 1 ) { $count_users_group = $count_users_group.' '.get_lang('Member'); @@ -82,19 +82,26 @@ if (is_array($results) && count($results) > 0) { $picture = $usergroup->get_picture_group($result['id'], $result['picture'],80); $result['picture'] = ''; - $item_0 = Display::div($result['picture'], array('class'=>'box_description_group_image')); - $members = Display::span($count_users_group, array('class'=>'box_description_group_member')); - $item_1 = Display::div(Display::tag('h4', $url_open.$name.$url_close).$members, array('class'=>'box_description_group_title')); - - $item_2 = ''; - $item_3 = ''; + + $members = Display::returnFontAwesomeIcon('user').$count_users_group; + $html = '
'; + $html .= '
'; + $html .= $result['picture']; + $html .= '
'; + $html .= '
'; + $html .= '
'; + $html .= Display::tag('h5', $url); + $html .= '
'; + $html .= '
' . $members . '
'; if ($result['description'] != '') { - $item_3 = '
'.cut($result['description'],100,true).'
'; + $html .= '
' . cut($result['description'],100,true) . '
'; } else { - $item_2 = '
'; - $item_3 = '
'; + $html .= ''; } - $grid_item_2 = $item_0.$item_1.$item_2.$item_3; + $html .= '
'; + $html .= '
'; + + $grid_item_2 = $html; $grid_my_groups[]= array($grid_item_2); } } @@ -107,8 +114,8 @@ foreach ($results as $result) { $result['name'] = Security::remove_XSS($result['name'], STUDENT, true); $result['description'] = Security::remove_XSS($result['description'], STUDENT, true); $id = $result['id']; - $url_open = ''; - $url_close = ''; + $name = cut($result['name'], GROUP_TITLE_LENGTH, true); + $count_users_group = count($usergroup->get_users_by_group($id, false, array(GROUP_USER_PERMISSION_ADMIN, GROUP_USER_PERMISSION_READER, GROUP_USER_PERMISSION_MODERATOR), 0 , 1000)); if ($count_users_group == 1 ) { $count_users_group = $count_users_group.' '.get_lang('Member'); @@ -116,30 +123,38 @@ foreach ($results as $result) { $count_users_group = $count_users_group.' '.get_lang('Members'); } - $name = cut($result['name'],GROUP_TITLE_LENGTH,true); + $url = '' . $name . ''; + $picture = $usergroup->get_picture_group($result['id'], $result['picture'],80); $result['picture'] = ''; - - $item_0 = Display::div($result['picture'], array('class'=>'box_description_group_image')); - $members = Display::span($count_users_group, array('class'=>'box_description_group_member')); - $item_1 = Display::div(Display::tag('h4', $url_open.$name.$url_close).$members, array('class'=>'box_description_group_title')); - $item_2 = ''; - $item_3 = ''; - + $members = Display::returnFontAwesomeIcon('user').$count_users_group; + + $html = '
'; + $html .= '
'; + $html .= $result['picture']; + $html .= '
'; + $html .= '
'; + $html .= '
'; + $html .= Display::tag('h5', $url); + $html .= '
'; + $html .= '
' . $members . '
'; if ($result['description'] != '') { - $item_3 = '
'.cut($result['description'],100,true).'
'; + $html .= '
' . cut($result['description'],100,true) . '
'; } else { - $item_2 = '
'; - $item_3 = '
'; + $html .= ''; } //Avoiding my groups - $join_url = ''; + if (!in_array($id,$my_group_list)) { - $join_url = ''.get_lang('JoinGroup').' '; + $html .= ''.get_lang('JoinGroup').' '; } - - $item_4 = '
'.$join_url.'
'; - $grid_item_2 = $item_0.$item_1.$item_2.$item_3.$item_4; + + $html .= '
'.$join_url.'
'; + $html .= '
'; + $html .= '
'; + + + $grid_item_2 = $html; $grid_newest_groups[]= array($grid_item_2); } @@ -153,8 +168,7 @@ if (is_array($results) && count($results) > 0) { $result['name'] = Security::remove_XSS($result['name'], STUDENT, true); $result['description'] = Security::remove_XSS($result['description'], STUDENT, true); $id = $result['id']; - $url_open = ''; - $url_close = ''; + $name = cut($result['name'],GROUP_TITLE_LENGTH,true); $count_users_group = count($usergroup->get_users_by_group($id, false, array(GROUP_USER_PERMISSION_ADMIN, GROUP_USER_PERMISSION_READER, GROUP_USER_PERMISSION_MODERATOR), 0 , 1000)); if ($count_users_group == 1 ) { @@ -163,28 +177,36 @@ if (is_array($results) && count($results) > 0) { $count_users_group = $count_users_group.' '.get_lang('Members'); } - $name = cut($result['name'],GROUP_TITLE_LENGTH,true); + $url = '' . $name . ''; + $picture = $usergroup->get_picture_group($result['id'], $result['picture'],80); $result['picture'] = ''; - $item_0 = Display::div($result['picture'], array('class'=>'box_description_group_image')); - $members = Display::span($count_users_group, array('class'=>'box_description_group_member')); - $item_1 = Display::div(Display::tag('h4', $url_open.$name.$url_close).$members, array('class'=>'box_description_group_title')); - + $html = '
'; + $html .= '
'; + $html .= $result['picture']; + $html .= '
'; + $html .= '
'; + $html .= '
'; + $html .= Display::tag('h5', $url); + $html .= '
'; + $html .= '
' . $members . '
'; if ($result['description'] != '') { - $item_3 = '
'.cut($result['description'],100,true).'
'; + $html .= '
' . cut($result['description'],100,true) . '
'; } else { - $item_2 = '
'; - $item_3 = '
'; + $html .= ''; } + //Avoiding my groups - $join_url = ''; if (!in_array($id,$my_group_list)) { - $join_url = ''.get_lang('JoinGroup').' '; + $html .= ''.get_lang('JoinGroup').' '; } - $item_4 = '
'.$join_url.'
'; - $grid_item_2 = $item_0.$item_1.$item_2.$item_3.$item_4; + $html .= '
'.$join_url.'
'; + $html .= '
'; + $html .= '
'; + + $grid_item_2 = $html; $grid_pop_groups[]= array($grid_item_2); } } diff --git a/main/template/default/social/group_view.tpl b/main/template/default/social/group_view.tpl index 6c08ac1062..45642273d8 100644 --- a/main/template/default/social/group_view.tpl +++ b/main/template/default/social/group_view.tpl @@ -3,7 +3,7 @@ {% block content %}
-
-
-
-
-
-
-
-
- {{ social_right_content }} -
-
- {{ social_auto_extend_link }} +
+ {{ social_right_content }}
-
{% endblock %} From dc6eb0e8b279d9ffdc4b4ff329a3a8dbdd653fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Loguercio?= Date: Thu, 15 Oct 2015 23:54:57 -0500 Subject: [PATCH 06/16] Parcial fix to Agenda(personal and courses) --- main/inc/lib/agenda.lib.php | 41 ++++++++++++++++++-------- main/template/default/agenda/month.tpl | 10 +++---- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/main/inc/lib/agenda.lib.php b/main/inc/lib/agenda.lib.php index 440a85430e..13d9a8066d 100644 --- a/main/inc/lib/agenda.lib.php +++ b/main/inc/lib/agenda.lib.php @@ -975,7 +975,7 @@ class Agenda ); $my_course_list = CourseManager::get_courses_list_by_user_id( api_get_user_id(), - true + false ); } @@ -1035,7 +1035,7 @@ class Agenda $start, $end, $my_session_id, - api_get_user_id(), + $user_id, $this->eventOtherSessionColor ); } @@ -1467,6 +1467,22 @@ class Agenda } else { $where_condition = "( ip.to_user_id = $user_id OR (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ) "; } + + if (empty($session_id)) { + $sessionCondition = " + ( + agenda.session_id = 0 AND + ip.session_id IS NULL + ) "; + } else { + $sessionCondition = " + ( + agenda.session_id = $session_id AND + ip.session_id = $session_id + ) "; + } + + $sql = "SELECT DISTINCT agenda.*, @@ -1483,10 +1499,10 @@ class Agenda $where_condition AND ip.visibility = '1' AND agenda.c_id = $course_id AND - ip.c_id = $course_id + ip.c_id = agenda.c_id $sessionCondition "; } else { - $visibilityCondition = " ip.visibility='1' AND"; + $visibilityCondition = " ip.visibility='1' AND "; if (api_is_allowed_to_edit()) { if ($user_id == 0) { @@ -1496,18 +1512,21 @@ class Agenda } $visibilityCondition = " (ip.visibility IN ('1', '0')) AND "; } else { - $where_condition = " ( ip.to_user_id = ".api_get_user_id()." AND (ip.to_group_id='0' OR ip.to_group_id IS NULL)) OR "; + $where_condition = " ( (ip.to_user_id = ".api_get_user_id()." OR ip.to_user_id IS NULL) AND ip.to_group_id IS NULL) AND "; } - $sessionCondition = " agenda.session_id = $session_id AND - ip.session_id = $session_id "; - if (empty($session_id)) { $sessionCondition = " ( - (agenda.session_id = 0 OR agenda.session_id IS NULL) AND - (ip.session_id = 0 OR ip.session_id IS NULL) + agenda.session_id = 0 AND + ip.session_id IS NULL ) "; + } else { + $sessionCondition = " + ( + agenda.session_id = $session_id AND + ip.session_id = $session_id + ) "; } $sql = "SELECT DISTINCT @@ -1525,7 +1544,6 @@ class Agenda $where_condition $visibilityCondition agenda.c_id = $course_id AND - ip.c_id = $course_id AND $sessionCondition "; } @@ -1545,7 +1563,6 @@ class Agenda } $sql .= $dateCondition; - $result = Database::query($sql); $coachCanEdit = false; diff --git a/main/template/default/agenda/month.tpl b/main/template/default/agenda/month.tpl index 9218b3fdd0..311c9592d1 100755 --- a/main/template/default/agenda/month.tpl +++ b/main/template/default/agenda/month.tpl @@ -11,8 +11,8 @@ function checkLength( o, n, min, max ) { } function clean_user_select() { //Cleans the selected attr - $("#users_to_send_id").val('').trigger("chosen:updated"); - /*$('#users_to_send_id') + $("#users_to_send").val('').trigger("chosen:updated"); + /*$('#users_to_send') .find('option') .removeAttr('selected') .end();*/ @@ -115,10 +115,10 @@ $(document).ready(function() { clean_user_select(); // Sets the 1st item selected by default - $('#users_to_send_id option').eq(0).attr('selected', 'selected'); + $('#users_to_send option').eq(0).attr('selected', 'selected'); // Update chz-select - //$("#users_to_send_id").trigger("chosen:updated"); + //$("#users_to_send").trigger("chosen:updated"); if ({{ can_add_events }} == 1) { var url = '{{ web_agenda_ajax_url }}&a=add_event&start='+start.format('YYYY-MM-DD 00:00:00')+'&end='+end.format('YYYY-MM-DD 00:00:00')+'&all_day='+allDay+'&view='+view.name; @@ -164,7 +164,7 @@ $(document).ready(function() { $.ajax({ url: url+'&'+params, success:function(data) { - var user = $('#users_to_send_id').val(); + var user = $('#users_to_send').val(); if (user) { if (user.length > 1) { user = 0; From 32e62f56d8346d12abb590c3c02c7382faa95c4d Mon Sep 17 00:00:00 2001 From: Julio Date: Fri, 16 Oct 2015 08:59:02 +0200 Subject: [PATCH 07/16] Fix PHP warnings. --- main/exercice/exercise.class.php | 10 +++++----- main/inc/lib/exercise.lib.php | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/main/exercice/exercise.class.php b/main/exercice/exercise.class.php index f3e0045c5e..45a427999e 100755 --- a/main/exercice/exercise.class.php +++ b/main/exercice/exercise.class.php @@ -2440,8 +2440,8 @@ class Exercise while ($row = Database::fetch_array($result)) { $ind = $row['answer']; $values = explode(':', $ind); - $my_answer_id = $values[0]; - $option = $values[1]; + $my_answer_id = isset($values[0]) ? $values[0] : ''; + $option = isset($values[1]) ? $values[1] : ''; $choice[$my_answer_id] = $option; } } @@ -2530,12 +2530,12 @@ class Exercise $ind = $row['answer']; $result = explode(':',$ind); if (isset($result[0])) { - $my_answer_id = $result[0]; - $option = $result[1]; + $my_answer_id = isset($result[0]) ? $result[0] : ''; + $option = isset($result[1]) ? $result[1] : ''; $choice[$my_answer_id] = $option; } } - $studentChoice = $choice[$answerAutoId]; + $studentChoice = isset($choice[$answerAutoId]) ? $choice[$answerAutoId] : ''; if ($answerCorrect == $studentChoice) { //$answerCorrect = 1; diff --git a/main/inc/lib/exercise.lib.php b/main/inc/lib/exercise.lib.php index efbe79be9b..c8b03deb04 100644 --- a/main/inc/lib/exercise.lib.php +++ b/main/inc/lib/exercise.lib.php @@ -3579,6 +3579,12 @@ HTML; $category_was_added_for_this_test = false; if (isset($objQuestionTmp->category) && !empty($objQuestionTmp->category)) { + if (!isset($category_list[$objQuestionTmp->category]['score'])) { + $category_list[$objQuestionTmp->category]['score'] = 0; + } + if (!isset($category_list[$objQuestionTmp->category]['total'])) { + $category_list[$objQuestionTmp->category]['total'] = 0; + } $category_list[$objQuestionTmp->category]['score'] += $my_total_score; $category_list[$objQuestionTmp->category]['total'] += $my_total_weight; $category_was_added_for_this_test = true; From 441d7828be2ef9409a7d7302a12b7cac2c1788bb Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 02:14:20 -0500 Subject: [PATCH 08/16] Fix permissions and cidReset detector to avoid preventing a course tutor to enter his own session-course --- main/inc/local.inc.php | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/main/inc/local.inc.php b/main/inc/local.inc.php index 9f0a51f1d5..fc617f846f 100755 --- a/main/inc/local.inc.php +++ b/main/inc/local.inc.php @@ -148,13 +148,27 @@ $cidReset = isset($cidReset) ? Database::escape_string($cidReset) : ''; // $cidReset can be set in URL-parameter $cidReset = ( - isset($_GET['cidReq']) && ((isset($_SESSION['_cid']) - && $_GET['cidReq']!=$_SESSION['_cid']) || (!isset($_SESSION['_cid']))) - ) ? Database::escape_string($_GET["cidReq"]) : $cidReset; + isset($_GET['cidReq']) && + ((isset($_SESSION['_cid']) && $_GET['cidReq'] != $_SESSION['_cid']) || (!isset($_SESSION['_cid']))) +) ? Database::escape_string($_GET["cidReq"]) : $cidReset; -// $cDir is a special url param sent by courses/.htaccess +// $cDir is a special url param sent from a redirection from /courses/[DIR]/index.php... +// It replaces cidReq in some opportunities $cDir = (!empty($_GET['cDir']) ? $_GET['cDir'] : null); +// if there is a cDir parameter in the URL and $cidReq could not be determined +if (isset($cDir) && empty($cidReq)) { + $c = CourseManager::get_course_id_from_path($cDir); + if ($c) { + $cidReq = $c; + } + if (empty($cidReset)) { + if (!isset($_SESSION['_cid']) OR (isset($_SESSION['_cid']) && $cidReq != $_SESSION['_cid'])) { + $cidReset = $cidReq; + } + } +} + $gidReset = isset($gidReset) ? $gidReset : ''; // $gidReset can be set in URL-parameter @@ -755,14 +769,6 @@ if (isset($use_anonymous) && $use_anonymous) { api_clear_anonymous(); } -// if there is a cDir parameter in the URL (coming from courses/.htaccess redirection) -if (!empty($cDir)) { - $c = CourseManager::get_course_id_from_path($cDir); - if ($c) { - $cidReq = $c; - } -} - // if the requested course is different from the course in session if (!empty($cidReq) && (!isset($_SESSION['_cid']) || @@ -1310,12 +1316,14 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { // save the states if (isset($is_courseAdmin)) { Session::write('is_courseAdmin', $is_courseAdmin); + $is_allowed_in_course = true; } if (isset($is_courseMember)) { Session::write('is_courseMember', $is_courseMember); } if (isset($is_courseTutor)) { Session::write('is_courseTutor', $is_courseTutor); + $is_allowed_in_course = true; } Session::write('is_courseCoach', $is_courseCoach); Session::write('is_allowed_in_course', $is_allowed_in_course); From 382bb40e70502a270e3fdbc158c1b23da37d8340 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 02:36:34 -0500 Subject: [PATCH 09/16] Fix personal, course, group and session events visibilities for all user roles - refs CT#7905 --- main/inc/lib/agenda.lib.php | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/main/inc/lib/agenda.lib.php b/main/inc/lib/agenda.lib.php index 13d9a8066d..c4a73cb25b 100644 --- a/main/inc/lib/agenda.lib.php +++ b/main/inc/lib/agenda.lib.php @@ -1433,12 +1433,30 @@ class Agenda if (!empty($groupId)) { if (!api_is_allowed_to_edit()) { + $user_id = api_get_user_id(); + $group_memberships = GroupManager::get_group_ids( + $course_id, + $user_id + ); + } else { $group_memberships = GroupManager::get_group_ids( $course_id, - api_get_user_id() + $user_id ); + } + } else { + // if no group was defined but I am a student reviewing his agenda, + // group events should show, so we should fetch those groups to which + // I belong + if (!api_is_allowed_to_edit()) { $user_id = api_get_user_id(); + $group_memberships = GroupManager::get_group_ids( + $course_id, + $user_id + ); } else { + // If no group was defined and I am a teacher/admin reviewing + // someone else's agenda, we should fetch this person's groups $group_memberships = GroupManager::get_group_ids( $course_id, $user_id @@ -1459,15 +1477,16 @@ class Agenda $where_condition = "( ip.to_group_id IN (".implode(", ", $group_memberships).") ) "; } else { if (!empty($user_id)) { - $where_condition = "( ip.to_user_id = $user_id OR (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ) "; + $where_condition = "( ip.to_user_id = $user_id OR ip.to_user_id IS NULL OR (ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ) "; } else { - $where_condition = "( ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).") ) "; + $where_condition = "( ip.to_group_id IN (0, ".implode(", ", $group_memberships).") ) "; } } } else { - $where_condition = "( ip.to_user_id = $user_id OR (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ) "; + $where_condition = "( ip.to_user_id = $user_id OR ip.to_user_id IS NULL OR (ip.to_group_id IN (0, ".implode(", ", $group_memberships).")) ) "; } - + + $sessionCondition = ''; if (empty($session_id)) { $sessionCondition = " ( @@ -1481,8 +1500,6 @@ class Agenda ip.session_id = $session_id ) "; } - - $sql = "SELECT DISTINCT agenda.*, @@ -1499,16 +1516,18 @@ class Agenda $where_condition AND ip.visibility = '1' AND agenda.c_id = $course_id AND - ip.c_id = agenda.c_id $sessionCondition + ip.c_id = agenda.c_id AND + $sessionCondition "; } else { $visibilityCondition = " ip.visibility='1' AND "; + $sessionCondition = ''; if (api_is_allowed_to_edit()) { if ($user_id == 0) { $where_condition = ""; } else { - $where_condition = " (ip.to_user_id = ".$user_id.") OR "; + $where_condition = " (ip.to_user_id = ".$user_id." OR ip.to_user_id IS NULL) AND ip.to_group_id IS NULL AND "; } $visibilityCondition = " (ip.visibility IN ('1', '0')) AND "; } else { From a01a9bb885de4d6edcf35bfdaf47b380931fb64f Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 02:38:22 -0500 Subject: [PATCH 10/16] Minor - Avoid notice --- main/gamification/my_progress.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main/gamification/my_progress.php b/main/gamification/my_progress.php index 4d9e791822..249b8d3140 100644 --- a/main/gamification/my_progress.php +++ b/main/gamification/my_progress.php @@ -33,7 +33,9 @@ if (empty($sessionId)) { ); $lastCourseAccess = $trackCourseAccessRepository->getLastAccessByUser($user); - $lastSessionId = $lastCourseAccess->getSessionId(); + if ($lastCourseAccess) { + $lastSessionId = $lastCourseAccess->getSessionId(); + } if (!empty($lastSessionId)) { $urlWithSession = api_get_self() . '?' . http_build_query([ From f8fd7bc5643fefdb2950d182091932c8a908a5c3 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 02:40:34 -0500 Subject: [PATCH 11/16] Ensure variables are true before allowing course access in previous commit to local.inc.php --- main/inc/local.inc.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/main/inc/local.inc.php b/main/inc/local.inc.php index fc617f846f..f9dd88d0b3 100755 --- a/main/inc/local.inc.php +++ b/main/inc/local.inc.php @@ -1316,14 +1316,18 @@ if ((isset($uidReset) && $uidReset) || (isset($cidReset) && $cidReset)) { // save the states if (isset($is_courseAdmin)) { Session::write('is_courseAdmin', $is_courseAdmin); - $is_allowed_in_course = true; + if ($is_courseAdmin) { + $is_allowed_in_course = true; + } } if (isset($is_courseMember)) { Session::write('is_courseMember', $is_courseMember); } if (isset($is_courseTutor)) { Session::write('is_courseTutor', $is_courseTutor); - $is_allowed_in_course = true; + if ($is_courseTutor) { + $is_allowed_in_course = true; + } } Session::write('is_courseCoach', $is_courseCoach); Session::write('is_allowed_in_course', $is_allowed_in_course); From 937ed5a1d05f1d38cb50b1af7591b2c56d2a2cf6 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 02:47:03 -0500 Subject: [PATCH 12/16] Add remove_XSS() to folder creation process --- main/inc/ajax/document.ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/inc/ajax/document.ajax.php b/main/inc/ajax/document.ajax.php index 8aee089bc2..609a1fa607 100755 --- a/main/inc/ajax/document.ajax.php +++ b/main/inc/ajax/document.ajax.php @@ -76,7 +76,7 @@ switch ($action) { case 'document_destination': //obtained the bootstrap-select selected value via ajax $dirValue = isset($_POST['dirValue']) ? $_POST['dirValue'] : null; - echo $dirValue; + echo Security::remove_XSS($dirValue); break; } exit; From 2dfcd3d692b40052c0d613202c0d11a008b9482a Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 03:35:01 -0500 Subject: [PATCH 13/16] Update installation guides - incomplete but sufficient for a release --- documentation/installation_guide_es_ES.html | 358 +++++++------------- 1 file changed, 122 insertions(+), 236 deletions(-) diff --git a/documentation/installation_guide_es_ES.html b/documentation/installation_guide_es_ES.html index 9839466f89..e6cef0ddec 100755 --- a/documentation/installation_guide_es_ES.html +++ b/documentation/installation_guide_es_ES.html @@ -41,7 +41,7 @@
  • Guía de Instalación
  • -

    Chamilo 1.9 - Guía de Instalación

    +

    Chamilo 1.10 - Guía de Instalación

    Gracias por descargar Chamilo, la suite de aprendizaje de código abierto profesional.

      @@ -49,7 +49,7 @@
    -

    Esta guía explica como instalar Chamilo LIBRE. Por favor, léala completamente antes de proceder con la instalación.

    +

    Esta guía explica como instalar Chamilo LMS. Por favor, léala completamente antes de proceder con la instalación.

    English: Get back to the English version of the installation guide.

    French: Vous pouvez aussi lire ce guide d'installation en français.

    Italian: You can also read this guide in Italian.

    @@ -86,7 +86,7 @@ Chamilo puede ser instalado indiferentemente en servidores Windows, Linux, Mac OS X y UNIX. Sin embargo, nosotros recomendamos el uso de un servidor Linux para una óptima flexibilidad, control remoto y escalabilidad.

    -Chamilo es fundamentalmente un LMS que se ejecuta con Apache (1.3, 2.0 o 2.2), MySQL 5.1 (o MariaDB) y PHP 5.4 (trilogía también llamada AMP). +Chamilo es fundamentalmente un LMS que se ejecuta con Apache (2.2+), MySQL 5.1+ (o MariaDB) y PHP 5.4+ (trilogía también llamada AMP).

    Todo este software es software de código abierto y está disponible libremente. @@ -103,21 +103,39 @@ Para ejecutar Chamilo LMS en su servidor, necesita instalar WAMP, LAMP o MAMP:

    Servidor de Base de Datos MySQL

    -

    Usted necesitará un nombre de usuario y contraseña que le permita administrar y crear una base de datos. Por lo general, la configuración predeterminada en los equipos locales es permitir que usted conecte como root con una contraseña vacía. Se recomienda cambiar la contraseña y definir un usuario con acceso sólo a una base de datos específica. Por favor, consulte la documentación de MySQL o MariaDB con el fin de hacer esto.

    +

    Usted necesitará un nombre de usuario y contraseña que le permita administrar y crear una base de datos. + Por lo general, la configuración predeterminada en los equipos locales es permitir que usted conecte + como root con una contraseña vacía. Se recomienda cambiar la contraseña y definir un usuario con acceso + sólo a una base de datos específica. Por favor, consulte la documentación de MySQL o MariaDB con el fin de hacer esto.

    -Nota:Esto se ha simplificado en gran medida desde la versión 1.9, ya que antes era necesario elegir entre múltiples bases de datos y un modo obsoleto de una sola base de datos. +Nota:Esto se ha simplificado en gran medida desde la versión 1.9, ya que antes era necesario elegir entre + múltiples bases de datos y un modo obsoleto de una sola base de datos.


    2. Instalación de Chamilo LMS

    -

    +<> + Antes de inciar la instalación de Chamilo LMS, debe entender que, como proveemos Chamilo como + un paquete de software libre, diversos proveedores (oficiales y no-oficiales) han podido + desarrollar extensiones de Chamilo, las cuales han hecho posible la instalación de Chamilo + de muchas maneras distintas:
    +

      +
    • Como un solo paquete a través de un proveedor oficial certificado por la Asociación Chamilo
    • +
    • Como una solución instalable en unos de muchos proveedores de alojamiento que soportan cPanel con Scriptaculous
    • +
    • Con vuestro proveedor de alojamiento preferido, usando instladores a distancia como el Installatron
    • +
    • En vuestro propio servidor, descargando e instalando Chamilo manualmente
    • +
    • En vuestra computadora, en casa o en la oficina, solo para probarlo o desarrollarlo
    • +
    +Esta guía solo cubre los dos últimos métodos. Para los demás, siempre podeis consultar las posibilidades con vuestro proveedor. +
    • Descargar Chamilo LMS
    • Descomprimirlo.
    • Copiar el directorio de Chamilo en su directorio web de Apache. Este puede ser C:\xampp\htdocs\ en un servidor Windows o /var/www/html/ en un servidor Linux.
    • +
    • Verificar que su servidor web soporta los archivos .htaccess (ver sección de Rewrite más a bajo) (este paso es nuevo en comparación con versiones anteriores)
    • Abrir su navegador web (Internet Explorer, Firefox, Chrome, ...) y escribir http://localhost/chamilo/ si se instala de manera local o http://www.domain.com/chamilo/ si se instala remotamente.
    • @@ -126,39 +144,37 @@ predeterminados. Considere cambiar la contraseña de administrador y recuérdela

    -

    + * Recomendammos definir un VirtualHost específico para esta instalación, si tiene las competencias para hacerlo. +

    + + Nota: en caso de instalar Chamilo localmente usando "localhost" o la dirección IP de la máquina durante la instalación, algunos problemas podrían + presentarse cuando se acceda desde otra computadora. Para evitarlo, recomendamos la lectura + de este artículo para aprender como cambiar su archivo de configuración. + +

    + +

    Los siguientes directorios necesitan tener permisos de lectura, escritura y ejecución en el servidor web. Esto por lo general no requiere ninguna acción específica en los servidores de Windows, pero se requiere un "chmod" bajo Linux y Mac. Consulte las siguientes instrucciones.

    Remplace [chamilo] por el directorio en el cual está ubicado su Chamilo:

      -
    • [chamilo]/app/config/
    • -
    • [chamilo]/app/upload/users/
    • -
    • [chamilo]/app/upload/sessions/
    • -
    • [chamilo]/app/upload/courses/
    • +
    • [chamilo]/app/
    • +
    • [chamilo]/vendor/ (solo en lectura y ejecución)
    • +
    • [chamilo]/web/
    • [chamilo]/main/default_course_document/images/
    • -
    • [chamilo]/app/cache/
    • -
    • [chamilo]/app/courses/
    • -
    • [chamilo]/app/home/
    -Opcionalmente, puede hacer lo mismo a los directorios siguientes si desea -activar la subida de paquetes de estilos CSS y la definición de sub-idiomas: +Opcionalmente, puede hacer lo mismo al directorio siguiente si desea +activar la definición de sub-idiomas:
      -
    • [chamilo]/main/css/
    • [chamilo]/main/lang/
    + Si encuentra una carpeta tests/ a la raíz de su paquete Chamilo, por favor borrelo. + Se trata de una carpeta de trabajo de los desarrolladores, y no ha sido verificado para evitar riesgos de seguridad, + por lo cual no debería *nunca* ser accesible a usuarios finales en un servidor de producción.

    -

    -Desde Chamilo 1.8.8, también puede habilitar funciones de indexación de texto completo que requieren la instalación de la extensión del módulo PHP php5-xapian. Si usted hace uso de él, usted tendrá que permitir que el sistema pueda escribir en el directorio searchdb: -

      -
    • [chamilo]/searchdb
    • -
    -

    -

    -Si usted encuentra un directorio de tests/ en la raíz de su paquete de instalación, por favor elimínelo. Este es un directorio de desarrollo que no ha sido chequeado por cuestiones de seguridad, no debería ser *nunca* accesible a los usuarios finales en un servidor de producción. -

    En Linux, Mac OS X y sistemas operativos BSD puede usar el comando "chmod 0775" para cambiar estos permisos (aunque nosotros recomendamos que busque la ayuda de un administrador de sistemas con experiencia para evitar fallas de seguridad). @@ -166,26 +182,6 @@ En Windows, es probable que necesite revisar las propiedades de los directorios del clic derecho en ellos).

    -

    -Los siguientes directorios necesitan tener permisos de lectura y escritura -para el navegador web, sólo durante la instalación de Chamilo: -

      -
    • chamilo/main/inc/conf/ (si está presente)
    • -
    -

    - -

    -En Linux, Mac OS X y sistemas operativos BSD usted puede usar el comando "chmod 666" para esto (aunque nosotros recomendamos que busque la ayuda de un -administrador de sistemas con experiencia). -En Windows, es probable que usted necesite revisar las propiedades de los directorios (mediante el uso -del clic derecho en ellos). -

    - -

    -NOTAS:
    -No modifique los archivos home_*.html directamente. En vez de hacer esto, -seleccione "Configurar la página de inicio" en la sección de administración de Chamilo. -

    Windows : con paquetes combinados de todos en uno como XAMPP, usted puede instalar Chamilo facilmente. En este caso (y si no lo utiliza en la producción), el nombre de usuario y una contraseña para MySQL probablemente permanecerá vacía.

    @@ -194,15 +190,8 @@ seleccione "Configurar la página de inicio" en la sección de administración d

    • Proteger su directorio de configuración: asegurarse que nadie pueda sobreescribirlo. Usted puede encontrar el directorio de configuración en (carpeta de chamilo)/main/inc/conf. Hacerlo de solo lectura (windows/xwindows: clic derecho en el archivo para editar las propiedades. linux/bsd/macosx: usar el comando chmod 0555). El archivo de configuración es creado por el servidor web (Apache + PHP, normalmente), por lo tanto usted necesita ser administrador para cambiar sus permisos.
    • - -
    • Proteger su directorio de instalación: si el (directorio de Chamilo) directorio /main/install sigue accesible, alguien podría instalar de nuevo sobre la versión existente (usted puede perder sus datos de esta manera). Por ello es muy importante que mueva el directorio a algún lugar fuera de los directorios web para que no se encuentre accesible, cambie su nombre, bórrelo completamente o edite sus propiedades para que nadie pueda leerlo o ejecutarlo.
    • - -
    • Para mayor seguridad: hacer que todos los archivos posean permisos de escritura facilita la instalación y resuelve muchas dudas a las personas con poca experiencia en administración. Sin embargo, es más seguro hacer que el propietario de los archivos y carpetas de Chamilo sea un usuario distinto y conceder sólo al servidor web permisos de lectura sobre todos los ficheros, y permisos de escritura a los directorios previamente mencionados. De esta manera, estos archivos sólo necesitan ser accesibles y escribibles por el propietario el proceso Apache, no por el mundo entero. También sería recomendable hacer que todos los directorios con permisos de escritura rechazaran la interpretación de los archivos PHP ( a excepción de la raíz de los directorios de cursos). No dude en contratar a un administrador con experiencia para hacer eso, puede que sea un poco más caro ahora, pero estará feliz de no tener que perder todos sus datos por el ataque de un hacker a su sitio.
    • -
    • Configurar su instalación de Chamilo: en la sección de administración de Chamilo, usted puede usar las Opciones de Configuración de Chamilo para ajustar el comportamiento de su instalación.
    • - -
    • Configurar correo de Chamilo: la mayor parte de Chamilo usa las configuraciones de correo del archivo php.ini. Sin embargo, si usted usa un servidor de correo distinto, es posible que necesite ajustar la configuración de correo electrónico en el (directorio de Chamilo)/main/inc/conf/mail.conf.php.
    • Consulte nuestra nueva guia de seguridad para más información.

    @@ -225,55 +214,51 @@ Para obtener lo mejor de Chamilo, necesita ajustar la configuración de PHP. Con max_input_time = 600 ;Tiempo máximo que cada script que puede emplear para analizar los datos solicitados
    memory_limit = 256M ;Maxima cantidad de memoria que un script puede consumir (128MB)
    post_max_size = 100M
    - upload_max_filesize = 100M + upload_max_filesize = 100M;
    + short_open_tag = Off
    + safe_mode = Off
    + magic_quotes_gpc = Off
    + magic_quotes_runtime = Off
    -

    -Algunos usuarios pueden encontrar problemas si en sus configuraciones de PHP no -se ajustan los siguientes parámetros:

    - -
      -
    • short_open_tag = On
    • -
    • safe_mode = Off
    • -
    • magic_quotes_gpc = On
    • -
    • magic_quotes_runtime = Off
    • -
    -

    - -

    -En versiones de Chamilo/Dok€os anteriores se requería que register_globals estuviera configurada en On. Esto ya no -necesario, puede (y debería) estar configurado en Off y Chamilo funcionará bien.Se considera una mala elección en términos de seguridad configurar register_globals a On. -

    - -

    Nota: Se necesita configurar la variable date.timezone a la zona horaria de su servidor. -Por ejemplo, si su servidor está en la zona horaria 'America/Lima', modificar en el php.ini:

    - -
    -date.timezone = 'America/Lima' -
    +
    +

    Importante: Necesitará configurar el parámetro date.timezone + al valor de zona horaria de su servidor. + Por ejemplo, si su servidor está en la zona horaria de 'America/New_York', configurar el + parámetro date.timezone a este valor en su php.ini:

    +
    + date.timezone = 'America/New_York' +
    +
    +

    Nota: PHP 5.3.9 introduce un nuevo parámetro + llamado "max_input_vars", que limita la cantidad de elementos que puede enviar + en un solo formulario. + Si gestiona numerosos usuarios o lecciones muy largas, asegúrese de configurar este parámetro + a un valor mayor a su valor predeterminado de 1000.

    Usuarios BSD: estas bibliotecas de php tienen que ser incluidas durante la instalación de php:

      -
    • php-mysql La extensión compartida de mysql para php
    • -
    • php-pcre La extensión compartida de pcre para php
    • -
    • php-session La extensión compartida de sesión para php
    • -
    • php-zlib La extensión compartida de zlib para php
    • -
    • (opcional) php-ldap si se desea habilitar el uso de la autenticación de LDAP
    • +
    • php5-session La extensión compartida de sesión para php
    • +
    • php5-mysqlnd La extensión compartida de mysql para php
    • +
    • php5-zlib La extensión compartida de zlib para php
    • +
    • php5-pcre La extensión compartida de pcre para php
    • +
    • php5-xml
    • +
    • php5-json
    • +
    • php5-mcrypt
    • +
    • php5-iconv o php5-mbstring (cualquiera de los dos)
    • +
    • php5-gd la extensión de generación de gráficos de PHP
    • +
    • php5-intl la extensión de reglas de representación internacionales
    -

    También puede necesitar estos módulos y paquetes:

    + +

    También puede necesitar estos módulos y paquetes:

      -
    • php-ctype
    • -
    • php-gd
    • -
    • php-iconv
    • -
    • php-json
    • -
    • php-mbstring
    • -
    • php-intl
    • -
    • php-curl
    • -
    • php-iconv
    • -
    • php-xsl
    • -
    • php-xapian
    • +
    • php5-ctype
    • +
    • php5-ldap
    • +
    • php5-xapian
    • +
    • php5-curl
    • +
    • php5-xsl

    @@ -285,18 +270,20 @@ Antes de actualizar, le recomendamos seriamente que haga una copia de seg y bases de datos de Chamilo/Dokeos que previamente haya en su servidor. Si no está seguro de cómo hacer esto solicite asistencia a su proveedor de servicios de almacenamiento.

    -

    -Chamilo LMS 1.9 viene con una nueva estructura de base de datos. Aunque el script de actualización se encarga de la migración, se generará una carga muy alta en su servidor durante la actualización y además cambiará su base de datos completamente, preservando los datos tan bien como sea posible (se ha probado el procedimiento muchas veces, pero recuerde esto es GNU/GPLv3 y no se hace responsable de lo que le ocurran a sus datos sin supervisión profesional). Es por eso que * realmente * recomendamos realizar una copia de seguridad completa de su sistema antes de actualizar. -

    -
    NOTA: Para sistemas Chamilo con bases de datos muy pesadas, algunos de nuestros proveedores han desarrollado procedimientos usando más memoria pero acortando el tiempo necesario de la migración por hasta 20 veces. No dude en contactar con ellos (referencias más a bajo) si requiere de este tipo de servicios
    +

    +Chamilo LMS 1.10 unifica todos los archivos dentro de cada idioma de la carpeta main/lang/. +Si había cambiado algun archivo de idioma directamente (en vez de usar el método recomendado: sub-idiomas), debería +tomar una copia de backup de estos cambios antes de actualizar.

    + +
    NOTA: Para sistemas Chamilo con bases de datos muy pesadas, algunos de nuestros proveedores han desarrollado procedimientos usando más memoria pero acortando el tiempo necesario de la migración por hasta 20 veces. No dude en contactar con ellos (referencias más a bajo) si requiere de este tipo de servicios
    -NOTA: Esta versión de Chamilo sólo se puede utilizar para actualizar desde versiones inferiores de Chamilo o Dok€os. Por ejemplo, no puede utilizar los scripts de actualización normales de Chamilo 1.9 para actualizar desde Dok€oS 2.0. Si usted necesita esto, por favor póngase en contacto con uno de los proveedores oficiales de la Asociación Chamilo) +NOTA: Esta versión de Chamilo sólo se puede utilizar para actualizar desde versiones inferiores de Chamilo 1.9.*. Por ejemplo, no puede utilizar los scripts de actualización normales de Chamilo 1.9 para actualizar desde Dok€oS 2.0. Si usted necesita esto, por favor póngase en contacto con uno de los proveedores oficiales de la Asociación Chamilo)
    -

    3.1 Actualizar desde Chamilo 1.9.x (actualización menor)

    +

    3.1 Actualizar desde Chamilo 1.10.x (actualización menor)

    -Dado que se trata sólo de un cambio de versión menor previa de Chamilo 1.9.*, lo único que tiene que hacer es: +Dado que se trata sólo de un cambio de versión menor previa de Chamilo 1.10.*, lo único que tiene que hacer es:

    • Revisar que no ha dejado alguna hoja de estilo personalizada o imagen (si es que tiene, asegúrese de guardar una copia de respaldo)
    • Descargar el paquete de instalación de Chamilo 1.9 desde la página de descarga de Chamilo
    • @@ -306,85 +293,54 @@ Dado que se trata sólo de un cambio de versión menor previa de Chamilo 1.9.*,

    -

    3.2 Actualizar desde Chamilo 1.8.x

    +

    3.2 Actualizar desde Chamilo 1.9.x

    • Compruebe que no ha dejado ninguna hoja de estilo o imagen personalizada (si la tuviera, asegúrese de realizar una copia de respaldo*)
    • Descargue el paquete de instalación de Chamilo 1.9 desde la página de descarga de Chamilo
    • Descomprima los nuevos ficheros de Chamilo 1.9 sobre los ficheros de la antigua versión ( o descomprima en una carpeta y luego copie los archivos en el directorio de la versión antigua)
    • -
    • Escriba en su navegador web la URL de su portal + main/install/
    • -
    • Elija su idioma y haga click sobre Actualizar desde 1.8.x
    • -
    - -
    - -

    3.3 Actualizar desde Dok€os 1.8.x

    - -

    -Si usted actualiza desde Dok€os 1.8.x :  -

      -
    • Revisar que no ha dejado alguna hoja de estilo personalizada o imagen*
    • -
    • Descargar el paquete de instalación de Chamilo 1.9 desde la página de descarga de Chamilo
    • -
    • Descomprimir los nuevos archivos de Chamilo 1.9 sobre los archivos de la version anterior (o descomprimirlos en una nueva carpeta y después copiarlos sobre los archivos de la versión anterior)
    • -
    • Apunte su navegador a su portal URL + main/install/
    • -
    • Escoja su idioma y haga clic en Actualizar desde 1.8.x
    • +
    • Asegúrese *por completo* que el archivo .htaccess de la versión 1.10 ha sido copiado en la raíz también
    • +
    • Asegúrese que "AllowOverride All" está presente en su configuración de Apache, ya que interpretar el archivo .htaccess es muy importante para que Chamilo funcione (ojo que la directiva Order-Allow ha sido remplazada por "Require all granted" en Apache 2.4)
    • +
    • Escriba en su navegador web la URL de su portal + main/install/
    • +
    • Elija su idioma y haga click sobre Actualizar desde 1.9.x
    -

    -Un grupo de administradores de Chamilo han informado de problemas menores con la migración entre versiones considerablemente diferentes (como la de Dok€os a Chamilo). Esto podría suponer perder algunas tareas o mensajes en el foro. Para evitar cualquier efecto desagradable en los usuarios, le recomendamos que primero debe establecer una lista de todo el contenido que es fundamental para usted, y que mantenga una copia de su anterior sítio funcionando. De esta manera, será más fácil de manejar la transición al permitir a los usuarios tener acceso a sus contenidos desde el sitio anterior y haciendo más fácil el que usted pueda comparar las dos instalaciones. Si usted está experimentando dificultades, considere pedir ayuda a un desarrollador de PHP o contratar a un proveedor oficial de Chamilo. Ellos se asegurarán de que usted obtenga la mejor migración de Chamilo. + * Los estilos e imágenes están ubicados en el directorio main/css o main/img. + Usted puede recuperarlos desde la copia de seguridad en el caso de que usted hya tenido la precaución de realizarla. + Cualquier estilo o imagen modificada que use el nombre predeterminado style/image será + sobrescrita en el siguiente paso. Para evitar perder cualquier personalización, siempre + asegúrese de copiar styles/images bajo un nuevo nombre y use y modifique la copia, + no el original. El original siempre sera sobrescrito por nuevas versiones. + En Dok€os 1.8.5, hemos cambiado el nombre de varios temas CSS. + La compatibilidad hacia atrás está asegurada por el hecho de que una actualización sólo agrega + los nuevos temas, sin embargo usted debe usar estos nuevos temas en lugar de quedarse con los + antiguos que quedarán obsoletos dentro de poco (sin mantenimiento).

    -

    -* Los estilos e imágenes están ubicados en el directorio main/css o main/img. - Usted puede recuperarlos desde la copia de seguridad en el caso de que usted hya tenido la precaución de realizarla. - Cualquier estilo o imagen modificada que use el nombre predeterminado style/image será - sobrescrita en el siguiente paso. Para evitar perder cualquier personalización, siempre - asegúrese de copiar styles/images bajo un nuevo nombre y use y modifique la copia, - no el original. El original siempre sera sobrescrito por nuevas versiones. - En Dok€os 1.8.5, hemos cambiado el nombre de varios temas CSS. - La compatibilidad hacia atrás está asegurada por el hecho de que una actualización sólo agrega - los nuevos temas, sin embargo usted debe usar estos nuevos temas en lugar de quedarse con los - antiguos que quedarán obsoletos dentro de poco (sin mantenimiento). -

    +
    +

    3.3 Actualizar desde Chamilo o Dok€os 1.8.x

    +Para actualizar desde una versión previa a la 1.9.0, deberá a partir de ahora primero actualizar a la versión 1.9.10.2, para luego actualizar de ahí a la 1.10.x. -

    3.4 Actualizar desde Dok€os 1.6.x

    -

    -Si usted actualiza desde una versión anterior a Dok€os (1.6.x), lo primero -y mas importante a hacer es *mover* su directorio actual hacia otro -lugar.

    -

    -Una manera simple de hacer esto es crear un subdirectorio llamado "version_antigua" -en su directorio actual de Dok€os y luego mover todo dentro de este, usando un -sencillo comando "mover" (ejem. en Linux: mkdir version_antigua; mv * -version_antigua/), luego dar permisos de escritura al directorio version_antigua para el servidor web -para que los directorios courses/ y upload/ puedan moverse desde la antigua instalación a la nueva.
    -

    -

    -El proceso completo es como sigue: +

    3.4 En ambos últimos casos

    + +Las carpetas siguientes necesitan tener permisos de lectura, escritura y ejecución para el servidor +web:
      -
    • Mover los contenidos del directorio de Dokeos a un subdirectorio llamado - version_antigua y darle permisos de escritura por el servidor web. Esto -es importante para permitir mover los directorios courses/ y upload/ -a la nueva instalacion
    • -
    • Descargar el paquete de instalacion de Chamilo 1.9 desde la - página de descarga de Chamilo
    • -
    • descomprimir los nuevos archivos de Chamilo 1.9 en el directorio principal de Chamilo/Dok€os. El nuevo -directorio principal debe estar ubicado directamente dentro de su -directorio raiz de Chamilo
    • -
    • Apuntar su navegador a la URL de su portal
    • -
    • Escoja su idioma y haga clic en Actualizar desde 1.6.x y confirme el -directorio actual de la versión antigua
    • +
    • [chamilo]/main/lang/ (in order to delete unnecessary language files)
    • +
    • [chamilo]/courses/ (in order to move the courses files to the app/courses folder)
    • +
    • [chamilo]/archive/ (in order to remove unnecessary files or move them to app/cache/)
    • +
    • [chamilo]/home/ (in order to move files to app/home)
    • +
    • [chamilo]/app
    • +
    • [chamilo]/web
    • +
    • [chamilo]/vendor
    • +
    • [chamilo]/main/default_course_document/images/
    -

    -

    - NOTA: La actualización desde 1.6.x a 1.9.x implica una revisión de -los gráficos y estilos personalizados. La nueva versión usa un completo nuevo conjunto -de iconos y estilos, lo cual significa que aquellos provenientes de la versión 1.6 no pueden ser -simplemente reusados. La buena noticia es que la versión 1.9.x le permite crear -su propio estilo en un directorio css separado, el cual se puede reusar en -todas las versiones 1.9.x -

    +En Linux, Mac OS X y BSD, puede arreglar esto rápido usando el comando chmod 0777 pero, si no +está seguro, recomendamos que busque consejo para su propio sistema operativo en nuestro +foro abierto. +En Windows, puede necesitar propiedades de las carpetas. +

    ADVERTENCIA:
    @@ -392,76 +348,6 @@ No elimine el directorio de instalación previo de Chamilo/Dok€os antes de ins el nuevo. Usted puede eliminar la ruta antigua, cuando la actualización haya finalizado satisfactoriamente.

    -

    -NOTA:
    -No modifique los archivos de home_*.html directamente. En lugar de ello, -seleccione "Configurar la página de inicio" en la sección de administración de Chamilo. -

    - -

    -

    -

    3.4 En ambos casos

    - -Los siguientes directorios necesitan permisos de lectura, escritura y ejecución para el servidor web: -
      -
    • [chamilo]/app/config/
    • -
    • [chamilo]/app/upload/users/
    • -
    • [chamilo]/app/upload/sessions/
    • -
    • [chamilo]/app/upload/courses/
    • -
    • [chamilo]/app/cache/
    • -
    • [chamilo]/app/courses/
    • -
    • [chamilo]/app/home/
    • -
    • [chamilo]/app/logs/
    • -
    • [chamilo]/main/default_course_document/images/
    • -
    -En Linux, Mac OS X y sistemas operativos BSD esto se puede arreglar rápidamente mediante el uso -del comando CHMOD 777, sin embargo si usted no está seguro, le recomandamos que busque -asistencia para su propio SO en nuestro foro. -En Windows, quizás necesite revisar las propiedades de las carpetas. -

    -

    -

    3.5 Guía de actualización rápida desde 1.6.x para Linux

    - - -La siguiente guía de actualización rápida rapida asume lo siguiente: -
      -
    • El nombre de usuario de la base de datos de Chamilo (para MySQL) es "chamilo_db_user" y su acceso es "chamilo_user"
    • -
    • Actualmente la instalacion de Chamilo/Dokeos esta en /var/www/chamilo/ y tiene permisos 777
    • -
    • La URL de su portal es http://www.portalurl.com/
    • -
    - -
    - - -Escribir en la línea de comandos: -
      -
    • cd /tmp
    • -
    • mysqldump -u chamilo_db_user -p --all-databases --result-file=/home/chamilo_user/chamilo_old.sql
    • -
    • cp -ra /var/www/chamilo /home/chamilo_user/backup_chamilo
    • -
    • mkdir /var/www/chamilo/version_antigua
    • -
    • mv /var/www/chamilo/* /var/www/chamilo/version_antigua/
    • -
    • chmod -R 0777 /var/www/chamilo/version_antigua/
    • -
    • wget http://www.chamilo.org/files/chamilo-1.9.10.tar.gz
    • -
    • tar zxvf chamilo-1.9.10.tar.gz
    • -
    • sudo cp -ra chamilo-1.9.10/* /var/www/chamilo/
    • -
    • rm chamilo-1.9.10.tar.gz
    • -
    • sudo rm -r chamilo-1.9.10/
    • -
    - -
    - -Luego (para actualización desde versiones anteriores a la 1.8.7): -
      -
    • Direccionar su navegador web hacia http://www.portalurl.com/main/install/
    • -
    • Proceder con la instalación
    • -
    • Revisar los permisos de los directorios
    • -
    - -

    - -

    - -

    4. Solución de problemas

    From 87cb85f5d9ea2de5426130a5e5acda069a2c1fa6 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 03:35:21 -0500 Subject: [PATCH 14/16] Update installation guides - incomplete but sufficient for a release --- documentation/installation_guide.html | 14 +++++++------- documentation/installation_guide_fr_FR.html | 2 +- documentation/installation_guide_it_IT.html | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/documentation/installation_guide.html b/documentation/installation_guide.html index 2031f9fd70..b98c215e14 100755 --- a/documentation/installation_guide.html +++ b/documentation/installation_guide.html @@ -36,7 +36,7 @@
    -

    Chamilo - Installation Guide

    +

    Chamilo 1.10 - Installation Guide

    Thank you for downloading Chamilo

      @@ -164,8 +164,8 @@ The following directories need to be readable, writeable and executable b
    • [chamilo]/web/
    • [chamilo]/main/default_course_document/images/
    -Optionally, you can do the same to the following directories if you want to -enable CSS styles package upload and sub-language definition: +Optionally, you can do the same to the following directory if you want to +enable sub-languages definition:
    • [chamilo]/main/lang/
    @@ -218,7 +218,7 @@ To get the best out of Chamilo, you need to finetune your PHP settings. Consider
    max_execution_time = 300 ;Maximum execution time of each script, in seconds
    max_input_time = 600 ;Maximum amount of time each script may spend parsing request data
    - memory_limit = 128M ;Maximum amount of memory a script may consume (128MB)
    + memory_limit = 256M ;Maximum amount of memory a script may consume (128MB)
    post_max_size = 100M
    upload_max_filesize = 100M;
    short_open_tag = Off
    @@ -310,8 +310,8 @@ As this is only a minor version change from previous 1.10.* versions of Chamilo, older version's directory). Note that you should remove the "home" and "searchdb" directories from the package before you overwrite the previous files. -
  • edit the main/inc/conf/configuration.php file: at the en of the file, locate the previous version number (e.g. '1.10.4') and change it to this new version (e.g. '1.10.8')
  • -
  • clean your archive/ directory: take a temporary copy of index.html, delete all the contents *in* this directory (do NOT remove the directory itself, only its contents!). It will all be re-generated. You can also delete the contents of this directory through the "Archive directory cleanup" option in the "System" box of the Administration page.
  • +
  • edit the app/config/configuration.php file: at the en of the file, locate the previous version number (e.g. '1.10.4') and change it to this new version (e.g. '1.10.8')
  • +
  • clean your app/cache/twig directory: delete all the contents *in* this directory (do NOT remove the directory itself, only its contents!). It will all be re-generated. You can also delete the contents of this directory through the "Archive directory cleanup" option in the "System" box of the Administration page.
  • you're done! No other upgrade procedure is required
  • @@ -324,7 +324,7 @@ As this is only a minor version change from previous 1.10.* versions of Chamilo,
  • download the Chamilo 1.10 install package from the Chamilo download page
  • unzip the new files of Chamilo 1.10 over the files of the older version (or unzip the files in one folder and then copy the files from there to the older version's directory)
  • make *absolutely sure* that the .htaccess file of version 1.10 is copied as well
  • -
  • make sure "AllowOverride All" is present in your Apache configuration, as interpreting the .htaccess files is very important for Chamilo to work (note that Order-Allow directives have been replaced by "Require all granted" in Apache 2.4)
  • +
  • make sure "AllowOverride All" is present in your Apache configuration, as interpreting the .htaccess files is very important for Chamilo to work (note that the Order-Allow directive has been replaced by "Require all granted" in Apache 2.4)
  • point your browser on your portal URL + main/install/
  • click Install, then choose Upgrade from 1.9.*
  • diff --git a/documentation/installation_guide_fr_FR.html b/documentation/installation_guide_fr_FR.html index 034c4a2e9a..250c1a1cb9 100644 --- a/documentation/installation_guide_fr_FR.html +++ b/documentation/installation_guide_fr_FR.html @@ -36,7 +36,7 @@
    -

    Guide d'installation de Chamilo LMS

    +

    Guide d'installation de Chamilo LMS 1.10

    Merci d'avoir téléchargé Chamilo

      diff --git a/documentation/installation_guide_it_IT.html b/documentation/installation_guide_it_IT.html index d2df1b5be8..09b520fdda 100644 --- a/documentation/installation_guide_it_IT.html +++ b/documentation/installation_guide_it_IT.html @@ -36,7 +36,7 @@
      -

      Guida di installazione di Chamilo LMS

      +

      Guida di installazione di Chamilo LMS 1.9

      Grazie per aver scaricato Chamilo

      • Testa le funzionalità di Chamilo nel Free Campus
      • From 94e1fc3ed99dad375f31301c35bbccd81d295abd Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Fri, 16 Oct 2015 03:45:35 -0500 Subject: [PATCH 15/16] Update changelog in preparation for 1.10 release --- documentation/changelog.html | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/documentation/changelog.html b/documentation/changelog.html index ba7e76a39d..0010f3ae76 100755 --- a/documentation/changelog.html +++ b/documentation/changelog.html @@ -48,7 +48,7 @@ -

        Chamilo 1.10.0 - San Juan, 15th of October 2015

        +

        Chamilo 1.10.0 - San Juan, 16th of October 2015

        Release notes - summary

        Chamilo 1.10.0 is a major version of the 1.10.x branch, with new features and bugfixes on top of 1.9.10. As a major version, it requires the use of the upgrade script in order to upgrade an existing Chamilo portal. See install instructions

        Release name

        @@ -66,6 +66,7 @@
      • A few languages now get a "parent" language which is not English. In this case, we have based the update query on an ID that we "assume" to be the right one for Spanish, Italian, French, Chinese and Portuguese. If the ID is not correct, you might, in the worst case scenario, get Chinese or Arabic terms appear in a language that is not the primary one, like Galician (normally taking Spanish as parent language). This can be fixed very easily by an "UPDATE language SET parent_id = NULL"; for all your languages, and then re-apply the parent manually to your sub-language if it needs one.
      • "Character set" platform setting can't be modified. It is now fixed to UTF-8 (see #7652). This comes as a decision given the fact that other character encoding types were only there for backwards compatibility reasons, and that the last version with something else than UTF-8 was released more than 5 years ago.
      • Starting from 1.10.0, courses directories will really be deleted when the course is deleted. No more logical-delete-but-no-physical-delete policy where the folder used to remain available for last-minute recovery of resources. You are trusted to take backups when necessary to avoid inconvenient situations. This comes as a decision considering the increasing number of huge installations where ghost course directories become a considerable space issue very quickly, and as an observation that, in fact, this feature is very little known and very few people use it to actually recover deleted course material.
      • +
      • The hotspot question type is broken due to changes in the underlying Chamilo code. Given the fact this question type is developed in Flash and none of the developers at the time of release had Adobe CS available (proprietary technology that requires compilation) we have been unable to update the corresponding Flash code. Work is under way to provide the same feature using only HTML5, but it is likely to appear in a corrective version for 1.10.0. If you have an urgent need for this feature, please contact an official provider to get this sorted: providers@chamilo.org

      Notable new Features

      Only showing some of the more than 3000 commits since 1.9.10 (https://github.com/chamilo/chamilo-lms/compare/v1.9.10...1.10.x). This section is divided into two for practical purposes: one fo normal users, one for developers and sysadmins. @@ -406,12 +407,19 @@
    • (4c0780aa - BT#9897) Add new reset password option
    • (67b0693c - BT#10092) Create TrackECourseAccessRepository entity
    • (fcc9030f - BT#9881) Add fields to associate forum to lp
    • +
    • The hotspot question type is broken due to changes in the underlying Chamilo code. Given the fact this question type is developed in Flash and none of the developers at the time of release had Adobe CS available (proprietary technology that requires compilation) we have been unable to update the corresponding Flash code. Work is under way to provide the same feature using only HTML5, but it is likely to appear in a corrective version for 1.10.0. If you have an urgent need for this feature, please contact an official provider to get this sorted: providers@chamilo.org

    Improvements (minor features) and debug

      - - +
    • (382bb40e - #7905) Fix personal, course, group and session events visibilities for all user roles
    • +
    • (441d7828) Fix permissions and cidReset detector to avoid preventing a course tutor to enter his own session-course
    • +
    • (d3a910d4 - #7883) Improve check to select on skill wheel
    • +
    • (a4e168bb) Fix issue with date type selector not being set to the correct default in thematic advance
    • +
    • (b18014ff) Fix missing cid in gradebook links
    • +
    • (200ba3d3) Fixing show the Save icon on exercise submit
    • +
    • (b9ebb0af) Fix missing links tool action icons titles
    • +
    • (d55a9e27) Don't show Hot Spot Delineation question type when Scenario is disabled
    • (483f502e - #7898) WCAG AAA improvement onChange JS
    • (3cb74208 - #7883) Slightly change skills list style on skill wheel's left panel
    • (0182e1f2 - #7883) Add badges to skills list + remove text from action buttons to increase space for description
    • From 461a8de436c119bee6157723598b5a90b4ae9226 Mon Sep 17 00:00:00 2001 From: Julio Date: Fri, 16 Oct 2015 12:27:38 +0200 Subject: [PATCH 16/16] Fix format from 1.9.x to 1.10 see BT#10434 --- main/exercice/exercise.class.php | 293 +++++++++++++++---- main/inc/lib/exercise_show_functions.lib.php | 7 +- 2 files changed, 237 insertions(+), 63 deletions(-) diff --git a/main/exercice/exercise.class.php b/main/exercice/exercise.class.php index 45a427999e..8b4642cbe4 100755 --- a/main/exercice/exercise.class.php +++ b/main/exercice/exercise.class.php @@ -2599,85 +2599,253 @@ class Exercise } break; case FILL_IN_BLANKS: - - // insert the student result in the track_e_attempt table, field answer - // $answer is the answer like in the c_quiz_answer table for the question - // student data are choice[] - - $listCorrectAnswers = FillBlanks::getAnswerInfo($answer); - $switchableAnswerSet = $listCorrectAnswers["switchable"]; - $answerWeighting = $listCorrectAnswers["tabweighting"]; - // user choices is an array $choice - - // get existing user data in n the BDD + $str = ''; if ($from_database) { $sql = "SELECT answer - FROM $TBL_TRACK_ATTEMPT - WHERE - exe_id = $exeId AND - question_id= ".intval($questionId); + FROM $TBL_TRACK_ATTEMPT + WHERE + exe_id = $exeId AND + question_id= ".intval($questionId); $result = Database::query($sql); $str = Database::result($result, 0, 'answer'); - - $listStudentResults = FillBlanks::getAnswerInfo($str, true); - $choice = $listStudentResults['studentanswer']; } - // loop other all blanks words - if (!$switchableAnswerSet) { - // not switchable answer, must be in the same place than teacher order - for ($i=0; $i < count($listCorrectAnswers['tabwords']); $i++) { - $studentAnswer = isset($choice[$i]) ? trim($choice[$i]) : ''; + if ($saved_results == false && strpos($str, 'font color') !== false) { + // the question is encoded like this + // [A] B [C] D [E] F::10,10,10@1 + // number 1 before the "@" means that is a switchable fill in blank question + // [A] B [C] D [E] F::10,10,10@ or [A] B [C] D [E] F::10,10,10 + // means that is a normal fill blank question + // first we explode the "::" + $pre_array = explode('::', $answer); + + // is switchable fill blank or not + $last = count($pre_array) - 1; + $is_set_switchable = explode('@', $pre_array[$last]); + $switchable_answer_set = false; + if (isset ($is_set_switchable[1]) && $is_set_switchable[1] == 1) { + $switchable_answer_set = true; + } + $answer = ''; + for ($k = 0; $k < $last; $k++) { + $answer .= $pre_array[$k]; + } + // splits weightings that are joined with a comma + $answerWeighting = explode(',', $is_set_switchable[0]); + // we save the answer because it will be modified + $temp = $answer; + $answer = ''; + $j = 0; + //initialise answer tags + $user_tags = $correct_tags = $real_text = array(); + // the loop will stop at the end of the text + while (1) { + // quits the loop if there are no more blanks (detect '[') + if (($pos = api_strpos($temp, '[')) === false) { + // adds the end of the text + $answer = $temp; + $real_text[] = $answer; + break; //no more "blanks", quit the loop + } + // adds the piece of text that is before the blank + //and ends with '[' into a general storage array + $real_text[] = api_substr($temp, 0, $pos +1); + $answer .= api_substr($temp, 0, $pos +1); + //take the string remaining (after the last "[" we found) + $temp = api_substr($temp, $pos +1); + // quit the loop if there are no more blanks, and update $pos to the position of next ']' + if (($pos = api_strpos($temp, ']')) === false) { + // adds the end of the text + $answer .= $temp; + break; + } + if ($from_database) { + $queryfill = "SELECT answer FROM ".$TBL_TRACK_ATTEMPT." + WHERE + exe_id = '".$exeId."' AND + question_id= ".intval($questionId).""; + $resfill = Database::query($queryfill); + $str = Database::result($resfill, 0, 'answer'); + api_preg_match_all('#\[([^[]*)\]#', $str, $arr); + $str = str_replace('\r\n', '', $str); + + $choice = $arr[1]; + if (isset($choice[$j])) { + $tmp = api_strrpos($choice[$j], ' / '); + $choice[$j] = api_substr($choice[$j], 0, $tmp); + $choice[$j] = trim($choice[$j]); + // Needed to let characters ' and " to work as part of an answer + $choice[$j] = stripslashes($choice[$j]); + } else { + $choice[$j] = null; + } + } else { + // This value is the user input, not escaped while correct answer is escaped by fckeditor + $choice[$j] = api_htmlentities(trim($choice[$j])); + } + + $user_tags[] = $choice[$j]; + //put the contents of the [] answer tag into correct_tags[] + $correct_tags[] = api_substr($temp, 0, $pos); + $j++; + $temp = api_substr($temp, $pos +1); + } + $answer = ''; + $real_correct_tags = $correct_tags; + $chosen_list = array(); - // This value is the user input, not escaped while correct answer is escaped by fckeditor - // Works with cyrillic alphabet and when using ">" chars see #7718 #7610 #7618 - if (!$from_database) { - $studentAnswer = htmlentities( - api_utf8_encode($studentAnswer) - ); + for ($i = 0; $i < count($real_correct_tags); $i++) { + if ($i == 0) { + $answer .= $real_text[0]; + } + if (!$switchable_answer_set) { + // Needed to parse ' and " characters + $user_tags[$i] = stripslashes($user_tags[$i]); + if ($correct_tags[$i] == $user_tags[$i]) { + // gives the related weighting to the student + $questionScore += $answerWeighting[$i]; + // increments total score + $totalScore += $answerWeighting[$i]; + // adds the word in green at the end of the string + $answer .= $correct_tags[$i]; + } elseif (!empty($user_tags[$i])) { + // else if the word entered by the student IS NOT the same as the one defined by the professor + // adds the word in red at the end of the string, and strikes it + $answer .= '' . $user_tags[$i] . ''; + } else { + // adds a tabulation if no word has been typed by the student + $answer .= ''; // remove   that causes issue + } + } else { + // switchable fill in the blanks + if (in_array($user_tags[$i], $correct_tags)) { + $chosen_list[] = $user_tags[$i]; + $correct_tags = array_diff($correct_tags, $chosen_list); + // gives the related weighting to the student + $questionScore += $answerWeighting[$i]; + // increments total score + $totalScore += $answerWeighting[$i]; + // adds the word in green at the end of the string + $answer .= $user_tags[$i]; + } elseif (!empty ($user_tags[$i])) { + // else if the word entered by the student IS NOT the same as the one defined by the professor + // adds the word in red at the end of the string, and strikes it + $answer .= '' . $user_tags[$i] . ''; + } else { + // adds a tabulation if no word has been typed by the student + $answer .= ''; // remove   that causes issue + } } - $correctAnswer = $listCorrectAnswers['tabwords'][$i]; - $isAnswerCorrect = 0; - if (FillBlanks::isGoodStudentAnswer($studentAnswer, $correctAnswer)) { - // gives the related weighting to the student - $questionScore += $answerWeighting[$i]; - // increments total score - $totalScore += $answerWeighting[$i]; - $isAnswerCorrect = 1; + // adds the correct word, followed by ] to close the blank + $answer .= ' / ' . $real_correct_tags[$i] . ']'; + if (isset($real_text[$i +1])) { + $answer .= $real_text[$i +1]; } - $listCorrectAnswers['studentanswer'][$i] = $studentAnswer; - $listCorrectAnswers['studentscore'][$i] = $isAnswerCorrect; } } else { - // switchable answer - $listStudentAnswerTemp = $choice; - $listTeacherAnswerTemp = $listCorrectAnswers['tabwords']; - // for every teacher answer, check if there is a student answer - for ($i=0; $i < count($listStudentAnswerTemp); $i++) { - $studentAnswer = trim($listStudentAnswerTemp[$i]); - $found = false; - for ($j=0; $j < count($listTeacherAnswerTemp); $j++) { - $correctAnswer = $listTeacherAnswerTemp[$j]; - if (!$found) { - if (FillBlanks::isGoodStudentAnswer($studentAnswer, $correctAnswer)) { - $questionScore += $answerWeighting[$i]; - $totalScore += $answerWeighting[$i]; - $listTeacherAnswerTemp[$j] = ""; - $found = true; - } + // insert the student result in the track_e_attempt table, field answer + // $answer is the answer like in the c_quiz_answer table for the question + // student data are choice[] + $listCorrectAnswers = FillBlanks::getAnswerInfo( + $answer + ); + $switchableAnswerSet = $listCorrectAnswers["switchable"]; + $answerWeighting = $listCorrectAnswers["tabweighting"]; + // user choices is an array $choice + + // get existing user data in n the BDD + if ($from_database) { + $sql = "SELECT answer + FROM $TBL_TRACK_ATTEMPT + WHERE + exe_id = $exeId AND + question_id= ".intval($questionId); + $result = Database::query($sql); + $str = Database::result($result, 0, 'answer'); + $listStudentResults = FillBlanks::getAnswerInfo( + $str, + true + ); + $choice = $listStudentResults['studentanswer']; + } + + // loop other all blanks words + if (!$switchableAnswerSet) { + // not switchable answer, must be in the same place than teacher order + for ($i = 0; $i < count( + $listCorrectAnswers['tabwords'] + ); $i++) { + $studentAnswer = isset($choice[$i]) ? trim( + $choice[$i] + ) : ''; + + // This value is the user input, not escaped while correct answer is escaped by fckeditor + // Works with cyrillic alphabet and when using ">" chars see #7718 #7610 #7618 + if (!$from_database) { + $studentAnswer = htmlentities( + api_utf8_encode($studentAnswer) + ); + } + + $correctAnswer = $listCorrectAnswers['tabwords'][$i]; + $isAnswerCorrect = 0; + if (FillBlanks::isGoodStudentAnswer( + $studentAnswer, + $correctAnswer + ) + ) { + // gives the related weighting to the student + $questionScore += $answerWeighting[$i]; + // increments total score + $totalScore += $answerWeighting[$i]; + $isAnswerCorrect = 1; } + $listCorrectAnswers['studentanswer'][$i] = $studentAnswer; + $listCorrectAnswers['studentscore'][$i] = $isAnswerCorrect; } - $listCorrectAnswers['studentanswer'][$i] = $studentAnswer; - if (!$found) { - $listCorrectAnswers['studentscore'][$i] = 0; - } else { - $listCorrectAnswers['studentscore'][$i] = 1; + } else { + // switchable answer + $listStudentAnswerTemp = $choice; + $listTeacherAnswerTemp = $listCorrectAnswers['tabwords']; + // for every teacher answer, check if there is a student answer + for ($i = 0; $i < count( + $listStudentAnswerTemp + ); $i++) { + $studentAnswer = trim( + $listStudentAnswerTemp[$i] + ); + $found = false; + for ($j = 0; $j < count( + $listTeacherAnswerTemp + ); $j++) { + $correctAnswer = $listTeacherAnswerTemp[$j]; + if (!$found) { + if (FillBlanks::isGoodStudentAnswer( + $studentAnswer, + $correctAnswer + ) + ) { + $questionScore += $answerWeighting[$i]; + $totalScore += $answerWeighting[$i]; + $listTeacherAnswerTemp[$j] = ""; + $found = true; + } + } + } + $listCorrectAnswers['studentanswer'][$i] = $studentAnswer; + if (!$found) { + $listCorrectAnswers['studentscore'][$i] = 0; + } else { + $listCorrectAnswers['studentscore'][$i] = 1; + } } } + $answer = FillBlanks::getAnswerInStudentAttempt( + $listCorrectAnswers + ); } - $answer = FillBlanks::getAnswerInStudentAttempt($listCorrectAnswers); break; // for calculated answer case CALCULATED_ANSWER: @@ -3426,7 +3594,8 @@ class Exercise $answer, $exeId, $questionId, - $results_disabled + $results_disabled, + $str ); break; case CALCULATED_ANSWER: diff --git a/main/inc/lib/exercise_show_functions.lib.php b/main/inc/lib/exercise_show_functions.lib.php index 46f3fdd492..6c32d83959 100755 --- a/main/inc/lib/exercise_show_functions.lib.php +++ b/main/inc/lib/exercise_show_functions.lib.php @@ -23,11 +23,16 @@ class ExerciseShowFunctions * @param int Exercise ID * @param int Question ID * @param int $resultsDisabled + * @param string $originalStudentAnswer * @return void */ - public static function display_fill_in_blanks_answer($feedbackType, $answer, $id, $questionId, $resultsDisabled) + public static function display_fill_in_blanks_answer($feedbackType, $answer, $id, $questionId, $resultsDisabled, $originalStudentAnswer = '') { $answerHTML = FillBlanks::getHtmlDisplayForAnswer($answer, $resultsDisabled); + if (strpos($originalStudentAnswer, 'font color') !== false) { + $answerHTML = $originalStudentAnswer; + } + if (empty($id)) { echo ''; echo Security::remove_XSS($answerHTML, COURSEMANAGERLOWSECURITY);