diff --git a/main/admin/settings.lib.php b/main/admin/settings.lib.php old mode 100644 new mode 100755 index a404cba30e..6c1201e578 --- a/main/admin/settings.lib.php +++ b/main/admin/settings.lib.php @@ -874,3 +874,38 @@ function delete_template($id) function select_timezone_value() { return api_get_timezones(); } + +/** + * Returns an array containing the list of options used to populate the gradebook_number_decimals variable + * + * @return array List of gradebook_number_decimals options + * + * @author Guillaume Viguier + */ +function select_gradebook_number_decimals() { + return array('0', '1', '2'); +} + +/** + * Updates the gradebook score custom values using the scoredisplay class of the + * gradebook module + * + * @param array List of gradebook score custom values + * + * @author Guillaume Viguier + */ +function update_gradebook_score_display_custom_values($values) { + require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php'; + $scoredisplay = ScoreDisplay::instance(); + $scores = $values['gradebook_score_display_custom_values_endscore']; + $displays = $values['gradebook_score_display_custom_values_displaytext']; + $nr_displays = count($displays); + $final = array(); + for($i = 1; $i < $nr_displays; $i++) { + if(!empty($scores[$i]) && !empty($displays[$i])) { + $final[$i]['score'] = $scores[$i]; + $final[$i]['display'] = $displays[$i]; + } + } + $scoredisplay->update_custom_score_display_settings($final); +} diff --git a/main/admin/settings.php b/main/admin/settings.php index 3dd139487d..8af9c491bc 100755 --- a/main/admin/settings.php +++ b/main/admin/settings.php @@ -13,6 +13,8 @@ // name of the language file that needs to be included if ($_GET['category']=='Templates') { $language_file = array('admin','document'); +} else if($_GET['category']=='Gradebook') { + $language_file = array('admin','gradebook'); } else { $language_file = array('admin'); } @@ -34,6 +36,41 @@ $_SESSION['this_section'] = $this_section; // Access restrictions api_protect_admin_script(); +if($_GET['category'] == 'Gradebook') { + // Used for the gradebook system + $htmlHeadXtra[]= ' + '; + } + // Submit Stylesheets if (isset($_POST['submit_stylesheets'])) { $message = store_stylesheets(); @@ -254,12 +291,74 @@ if (!empty($_GET['category']) && !in_array($_GET['category'], array('Plugins', ' $form->addElement('select', $row['variable'], get_lang($row['comment']), call_user_func('select_'.$row['variable']), $hideme); $default_values[$row['variable']] = $row['selected_value']; break; + /* + * Used to display custom values for the gradebook score display + */ + case "gradebook_score_display_custom": + if(api_get_setting('gradebook_score_display_custom', 'my_display_custom') == 'false') { + $form->addElement('static', null, null, get_lang('GradebookActivateScoreDisplayCustom')); + } else { + // Get score displays + require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php'; + $scoredisplay = ScoreDisplay::instance(); + $customdisplays = $scoredisplay->get_custom_score_display_settings(); + $nr_items =(count($customdisplays)!='0')?count($customdisplays):'1'; + $form->addElement('hidden', 'gradebook_score_display_custom_values_maxvalue', '100'); + $form->addElement('hidden', 'gradebook_score_display_custom_values_minvalue', '0'); + $form->addElement('static', null, null, get_lang('ScoreInfo')); + $scorenull[]= $form->CreateElement('static', null, null, get_lang('Between')); + $form->setDefaults(array ( + 'beginscore' => '0' + )); + $scorenull[]= $form->CreateElement('text', 'beginscore', null, array ( + 'size' => 5, + 'maxlength' => 5, + 'disabled' => 'disabled' + )); + $scorenull[]= $form->CreateElement('static', null, null, ' %'); + $form->addGroup($scorenull, '', '', ' '); + for ($counter= 1; $counter <= 20; $counter++) { + $renderer = $form->defaultRenderer(); + $elementTemplateTwoLabel = + '
+

* {label} +

{error}
'.get_lang('And').'          {element} % ='; + + $elementTemplateTwoLabel2 = + '{error}
 {element} + '.get_lang('Delete').' + '.get_lang('Add').' +

'; + + $scorebetw= array (); + $form->addElement('text', 'gradebook_score_display_custom_values_endscore[' . $counter . ']', null, array ( + 'size' => 5, + 'maxlength' => 5, + 'id' => 'txta-'.$counter + )); + $form->addElement('text', 'gradebook_score_display_custom_values_displaytext[' . $counter . ']', null,array ( + 'size' => 40, + 'maxlength' => 40, + 'id' => 'txtb-'.$counter + )); + $renderer->setElementTemplate($elementTemplateTwoLabel,'gradebook_score_display_custom_values_endscore[' . $counter . ']'); + $renderer->setElementTemplate($elementTemplateTwoLabel2,'gradebook_score_display_custom_values_displaytext[' . $counter . ']'); + $form->addRule('gradebook_score_display_custom_values_endscore[' . $counter . ']', get_lang('OnlyNumbers'), 'numeric'); + $form->addRule(array ('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_maxvalue'), get_lang('Over100'), 'compare', '<='); + $form->addRule(array ('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_minvalue'), get_lang('UnderMin'), 'compare', '>'); + if($customdisplays[$counter-1]) { + $default_values['gradebook_score_display_custom_values_endscore['.$counter.']'] = $customdisplays[$counter-1]['score']; + $default_values['gradebook_score_display_custom_values_displaytext['.$counter.']'] = $customdisplays[$counter-1]['display']; + } + } + } + break; } } - $form->addElement('html','
'); - $form->addElement('style_submit_button', null,get_lang('SaveSettings'), 'class="save"'); - $form->addElement('html','
'); + $form->addElement('html','
'); + $form->addElement('style_submit_button', null,get_lang('SaveSettings'), 'class="save"'); + $form->addElement('html','
'); $form->setDefaults($default_values); if ($form->validate()) { @@ -280,40 +379,50 @@ if (!empty($_GET['category']) && !in_array($_GET['category'], array('Plugins', ' //$result = Database::query($sql); // Save the settings $keys = array(); + $gradebook_score_display_custom_values = array(); foreach ($values as $key => $value) { - if (!is_array($value)) { - //$sql = "UPDATE $table_settings_current SET selected_value='".Database::escape_string($value)."' WHERE variable='$key'"; - //$result = Database::query($sql); + // Treat gradebook values in separate function + if(strpos($key, 'gradebook_score_display_custom_values') === false) { + if (!is_array($value)) { + //$sql = "UPDATE $table_settings_current SET selected_value='".Database::escape_string($value)."' WHERE variable='$key'"; + //$result = Database::query($sql); - if (api_get_setting($key) != $value) $keys[] = $key; + if (api_get_setting($key) != $value) $keys[] = $key; - $result = api_set_setting($key,$value,null,null,$_configuration['access_url']); + $result = api_set_setting($key,$value,null,null,$_configuration['access_url']); - } else { + } else { - $sql = "SELECT subkey FROM $table_settings_current WHERE variable = '$key'"; - $res = Database::query($sql); - $subkeys = array(); - while ($row_subkeys = Database::fetch_array($res)) { - // if subkey is changed - if ( (isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'false') || - (!isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'true')) { - $keys[] = $key; - break; + $sql = "SELECT subkey FROM $table_settings_current WHERE variable = '$key'"; + $res = Database::query($sql); + $subkeys = array(); + while ($row_subkeys = Database::fetch_array($res)) { + // if subkey is changed + if ( (isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'false') || + (!isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'true')) { + $keys[] = $key; + break; + } } - } - foreach ($value as $subkey => $subvalue) - { + foreach ($value as $subkey => $subvalue) + { - //$sql = "UPDATE $table_settings_current SET selected_value='true' WHERE variable='$key' AND subkey = '$subkey'"; - //$result = Database::query($sql); + //$sql = "UPDATE $table_settings_current SET selected_value='true' WHERE variable='$key' AND subkey = '$subkey'"; + //$result = Database::query($sql); - $result = api_set_setting($key,'true',$subkey,null,$_configuration['access_url']); + $result = api_set_setting($key,'true',$subkey,null,$_configuration['access_url']); + } } + } else { + $gradebook_score_display_custom_values[$key] = $value; } } + + if(count($gradebook_score_display_custom_values) > 0) { + update_gradebook_score_display_custom_values($gradebook_score_display_custom_values); + } // add event configuration settings category to system log $time = time(); diff --git a/main/gradebook/gradebook_scoring_system.php b/main/gradebook/gradebook_scoring_system.php index 1f819a21b6..2a0a741980 100755 --- a/main/gradebook/gradebook_scoring_system.php +++ b/main/gradebook/gradebook_scoring_system.php @@ -1,122 +1,16 @@ - function plusItem(item) - { - document.getElementById(item).style.display = "inline"; - document.getElementById("plus-"+item).style.display = "none"; - document.getElementById("min-"+(item-1)).style.display = "none"; - document.getElementById("min-"+(item)).style.display = "inline"; - document.getElementById("plus-"+(item+1)).style.display = "inline"; - document.getElementById("txta-"+(item)).value = "100"; - document.getElementById("txta-"+(item-1)).value = ""; - } - - function minItem(item) - { - if (item != 1) - { - document.getElementById(item).style.display = "none"; - document.getElementById("txta-"+item).value = ""; - document.getElementById("txtb-"+item).value = ""; - document.getElementById("plus-"+item).style.display = "inline"; - document.getElementById("min-"+(item-1)).style.display = "inline"; - document.getElementById("txta-"+(item-1)).value = "100"; - - } - if (item = 1) - { - document.getElementById("min-"+(item)).style.display = "none"; - } - } - '; - -$interbreadcrumb[] = array ('url' => $_SESSION['gradebook_dest'].'?selectcat=1', 'name' => get_lang('ToolGradebook')); - -$displayscore= ScoreDisplay :: instance(); -$customdisplays = $displayscore->get_custom_score_display_settings(); -$nr_items =(count($customdisplays)!='0')?count($customdisplays):'1'; - -$scoreform= new ScoreDisplayForm('scoring_system_form', - api_get_self() . '?selectcat=' . $_GET['selectcat'] - ); -if ($scoreform->validate()) { - $value_export=''; - $value_export=$scoreform->exportValues(); - $value_export=isset($value_export) ? $scoreform->exportValues(): ''; - $values= $value_export; - -// create new array of custom display settings -// this loop also checks if all score ranges are unique - - $scoringdisplay= array (); - $ranges_ok = true; - $endscore= isset($values['endscore']) ? $values['endscore'] : null; - $displaytext=isset($values['displaytext']) ? $values['displaytext'] : null; - for ($counter= 1; $ranges_ok && $counter <= 20; $counter++) { - $setting= array (); - $setting['score']= $endscore[$counter]; - $setting['display']= $displaytext[$counter]; - if (!empty($setting['score'])) { - foreach ($scoringdisplay as $passed_entry) { - if ($passed_entry['score'] == $setting['score']) { - $ranges_ok = false; - } - } - $scoringdisplay[]= $setting; - } - } - - if (!$ranges_ok) { - header('Location: ' . api_get_self() . '?nouniqueranges=&selectcat=' . Security::remove_XSS($_GET['selectcat'])); - exit; - } - - - // update color settings - $val_enablescorecolor=isset($values['enablescorecolor']) ? $values['enablescorecolor'] : null; - $displayscore->set_coloring_enabled(($val_enablescorecolor == '1') ? true : false); - if ($displayscore->is_coloring_enabled()) { - $displayscore->set_color_split_value($values['scorecolpercent']); - } - // update custom display settings - $val_enablescore=isset($values['enablescore']) ? $values['enablescore'] : null; - $val_includeupperlimit=isset($values['includeupperlimit']) ? $values['includeupperlimit'] : null; - - $displayscore->set_custom(($val_enablescore == '1') ? true : false); - $displayscore->set_upperlimit_included(($val_includeupperlimit == '1') ? true : false); - if ($displayscore->is_custom() && !empty($scoringdisplay)) { - $displayscore->update_custom_score_display_settings($scoringdisplay); - } - header('Location: ' . api_get_self() . '?scoringupdated=&selectcat=' . Security::remove_XSS($_GET['selectcat'])); - exit; -} $this_section = SECTION_COURSES; Display :: display_header(get_lang('ScoreEdit')); -if (((isset($_GET['isStudentView']) && $_GET['isStudentView']=='false') || (isset($_GET['selectcat']) && ($_SESSION['studentview']=='teacherview')))) { - if (isset ($_GET['scoringupdated'])) { - Display :: display_confirmation_message(get_lang('ScoringUpdated'),false); - } - -if (isset ($_GET['nouniqueranges'])) { - Display :: display_error_message(get_lang('NoUniqueScoreRanges'),false); -} - echo '
'; -$scoreform->display(); +echo '
'; +echo sprintf(get_lang('GradebookScoringSystemRedirect'), api_get_path(WEB_CODE_PATH).'admin/settings.php?category=Gradebook'); +echo '
'; echo '
'; -} -Display :: display_footer(); \ No newline at end of file +Display :: display_footer(); diff --git a/main/gradebook/gradebook_view_result.php b/main/gradebook/gradebook_view_result.php index 9303526bf1..6dfd15f93b 100755 --- a/main/gradebook/gradebook_view_result.php +++ b/main/gradebook/gradebook_view_result.php @@ -62,10 +62,10 @@ if (isset ($_GET['editres'])) { $result->set_id($edit_res_xml); $result->set_user_id($values['hid_user_id']); $result->set_evaluation_id($select_eval_edit); - $row_value=isset($values['score']) ? (double)$values['score'] : 0 ; - if ((!empty ($row_value)) || ($row_value == 0)) { - $result->set_score($row_value); - } + $row_value=isset($values['score']) ? (float)$values['score'] : 0 ; + if ((!empty ($row_value)) || ($row_value == 0)) { + $result->set_score(floatval(number_format($row_value, api_get_setting('gradebook_number_decimals')))); + } $result->save(); unset ($result); header('Location: gradebook_view_result.php?selecteval=' . $select_eval_edit . '&editresmessage='); diff --git a/main/gradebook/lib/fe/scoredisplayform.class.php b/main/gradebook/lib/fe/scoredisplayform.class.php index 2dc37ef7b6..ec8a165b8a 100755 --- a/main/gradebook/lib/fe/scoredisplayform.class.php +++ b/main/gradebook/lib/fe/scoredisplayform.class.php @@ -121,4 +121,4 @@ class ScoreDisplayForm extends FormValidator function validate() { return parent :: validate(); } -} \ No newline at end of file +} diff --git a/main/install/db_main.sql b/main/install/db_main.sql index fe84b86568..82c58352ed 100755 --- a/main/install/db_main.sql +++ b/main/install/db_main.sql @@ -687,6 +687,8 @@ VALUES ('gradebook_score_display_custom','my_display_custom','checkbox','Gradebook','false','GradebookScoreDisplayCustom','GradebookScoreDisplayCustomComment',NULL,'TabsGradebookEnableCustom', 0), ('gradebook_score_display_colorsplit',NULL,'textfield','Gradebook','50','GradebookScoreDisplayColorSplit','GradebookScoreDisplayColorSplitComment',NULL,NULL, 0), ('gradebook_score_display_upperlimit','my_display_upperlimit','checkbox','Gradebook','false','GradebookScoreDisplayUpperLimit','GradebookScoreDisplayUpperLimitComment',NULL,'TabsGradebookEnableUpperLimit', 0), +('gradebook_number_decimals', NULL, 'select', 'Gradebook', '0', 'GradebookNumberDecimals', 'GradebookNumberDecimalsComment', NULL, NULL, 0), +('gradebook_score_display_custom_values', NULL, 'gradebook_score_display_custom', 'Gradebook', '0', 'GradebookScoreDisplayCustomValues', 'GradebookScoreDisplayCustomValuesComment', NULL, NULL, 0), ('user_selected_theme',NULL,'radio','Platform','false','UserThemeSelection','UserThemeSelectionComment',NULL,NULL, 0), ('profile','theme','checkbox','User','false','ProfileChangesTitle','ProfileChangesComment',NULL,'UserTheme', 0), ('allow_course_theme',NULL,'radio','Course','true','AllowCourseThemeTitle','AllowCourseThemeComment',NULL,NULL, 0), @@ -1123,6 +1125,8 @@ CREATE TABLE gradebook_category ( weight smallint NOT NULL, visible tinyint NOT NULL, certif_min_score int DEFAULT NULL, + session_id int DEFAULT NULL, + document_id int unsigned DEFAULT NULL, PRIMARY KEY (id) ); DROP TABLE IF EXISTS gradebook_evaluation; @@ -1205,8 +1209,6 @@ CREATE TABLE user_field_values( ALTER TABLE user_field_values ADD INDEX (user_id, field_id); -ALTER TABLE gradebook_category ADD session_id int DEFAULT NULL; - DROP TABLE IF EXISTS gradebook_result_log; CREATE TABLE gradebook_result_log ( id int NOT NULL auto_increment, @@ -2273,7 +2275,6 @@ CREATE TABLE gradebook_certificate ( ALTER TABLE gradebook_certificate ADD INDEX idx_gradebook_certificate_category_id(cat_id); ALTER TABLE gradebook_certificate ADD INDEX idx_gradebook_certificate_user_id(user_id); ALTER TABLE gradebook_certificate ADD INDEX idx_gradebook_certificate_category_id_user_id(cat_id,user_id); -ALTER TABLE gradebook_category ADD COLUMN document_id int unsigned default NULL; diff --git a/main/install/migrate-db-1.8.6.2-1.8.7-pre.sql b/main/install/migrate-db-1.8.6.2-1.8.7-pre.sql index bcc89b4238..90f8028b04 100755 --- a/main/install/migrate-db-1.8.6.2-1.8.7-pre.sql +++ b/main/install/migrate-db-1.8.6.2-1.8.7-pre.sql @@ -59,6 +59,8 @@ UPDATE gradebook_result SET created_at = FROM_UNIXTIME(date); ALTER TABLE gradebook_result DROP date; ALTER TABLE gradebook_result_log CHANGE date_log created_at DATETIME NOT NULL default '0000-00-00 00:00:00'; +INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('gradebook_number_decimals', NULL, 'select', 'Gradebook', '0', 'GradebookNumberDecimals', 'GradebookNumberDecimalsComment', NULL, NULL, 0); +INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('gradebook_score_display_custom_values', NULL, 'gradebook_score_display_custom', 'Gradebook', '0', 'GradebookScoreDisplayCustomValues', 'GradebookScoreDisplayCustomValuesComment', NULL, NULL, 0); INSERT INTO user_field(field_type, field_variable, field_display_text, field_visible, field_changeable) VALUES(11, 'timezone', 'Timezone', 0, 0);