diff --git a/main/admin/course_fields.php b/main/admin/course_fields.php
new file mode 100644
index 0000000000..09b70ae19d
--- /dev/null
+++ b/main/admin/course_fields.php
@@ -0,0 +1,275 @@
+ 'index.php', 'name' => get_lang('PlatformAdmin'));
+
+$action = isset($_GET['action']) ? $_GET['action'] : null;
+
+$check = Security::check_token('request');
+$token = Security::get_token();
+
+if ($action == 'add') {
+ $interbreadcrumb[] = array('url' => 'course_fields.php', 'name' => get_lang('CourseFields'));
+ $interbreadcrumb[] = array('url' => '#', 'name' => get_lang('Add'));
+} elseif ($action == 'edit') {
+ $interbreadcrumb[] = array('url' => 'course_fields.php', 'name' => get_lang('CourseFields'));
+ $interbreadcrumb[] = array('url' => '#', 'name' => get_lang('Edit'));
+} else {
+ $interbreadcrumb[] = array('url' => '#', 'name' => get_lang('CourseFields'));
+}
+
+//jqgrid will use this URL to do the selects
+$url = api_get_path(WEB_AJAX_PATH) . 'model.ajax.php?a=get_extra_fields&type=course';
+
+//The order is important you need to check the the $column variable in the model.ajax.php file
+$columns = array(
+ get_lang('Name'),
+ get_lang('FieldLabel'),
+ get_lang('Type'),
+ get_lang('FieldChangeability'),
+ get_lang('Visibility'),
+ get_lang('Filter'),
+ get_lang('FieldOrder'),
+ get_lang('Actions')
+);
+
+//Column config
+$column_model = array(
+ array(
+ 'name' => 'field_display_text',
+ 'index' => 'field_display_text',
+ 'width' => '180',
+ 'align' => 'left'
+ ),
+ array(
+ 'name' => 'field_variable',
+ 'index' => 'field_variable',
+ 'width' => '',
+ 'align' => 'left',
+ 'sortable' => 'true'
+ ),
+ array(
+ 'name' => 'field_type',
+ 'index' => 'field_type',
+ 'width' => '',
+ 'align' => 'left',
+ 'sortable' => 'true'
+ ),
+ array(
+ 'name' => 'field_changeable',
+ 'index' => 'field_changeable',
+ 'width' => '50',
+ 'align' => 'left',
+ 'sortable' => 'true'
+ ),
+ array(
+ 'name' => 'field_visible',
+ 'index' => 'field_visible',
+ 'width' => '40',
+ 'align' => 'left',
+ 'sortable' => 'true'
+ ),
+ array(
+ 'name' => 'field_filter',
+ 'index' => 'field_filter',
+ 'width' => '30',
+ 'align' => 'left',
+ 'sortable' => 'true'
+ ),
+ array(
+ 'name' => 'field_order',
+ 'index' => 'field_order',
+ 'width' => '40',
+ 'align' => 'left',
+ 'sortable' => 'true'
+ ),
+ array(
+ 'name' => 'actions',
+ 'index' => 'actions',
+ 'width' => '100',
+ 'align' => 'left',
+ 'formatter' => 'action_formatter',
+ 'sortable' => 'false'
+ )
+);
+
+//Autowidth
+$extra_params['autowidth'] = 'true';
+//height auto
+$extra_params['height'] = 'auto';
+$extra_params['sortname'] = 'field_order';
+
+//With this function we can add actions to the jgrid (edit, delete, etc)
+$actionLinks = '
+function action_formatter(cellvalue, options, rowObject) {
+ return \''
+ . Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL) . ''
+ . ' '
+ . Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL) . '\';
+}';
+
+$htmlHeadXtra[] = '
+';
+
+// The header.
+Display::display_header(null);
+
+$obj = new CourseField();
+
+// Action handling: Add
+switch ($action) {
+ case 'add':
+ if (api_get_session_id() != 0 && !api_is_allowed_to_session_edit(false, true)) {
+ api_not_allowed();
+ }
+
+ $url = api_get_self() . '?action=' . Security::remove_XSS($_GET['action']);
+ $form = $obj->return_form($url, 'add');
+
+ // The validation or display
+ if ($form->validate()) {
+ if ($check) {
+ $values = $form->exportValues();
+ $res = $obj->save($values);
+
+ if ($res) {
+ Display::display_confirmation_message(get_lang('ItemAdded'));
+ }
+ }
+
+ $obj->display();
+ } else {
+ echo '
';
+
+ $form->addElement('hidden', 'sec_token');
+ $form->setConstants(array('sec_token' => $token));
+ $form->display();
+ }
+ break;
+ case 'edit':
+ // Action handling: Editing
+ $url = api_get_self() . '?action=' . Security::remove_XSS($_GET['action']) . '&id=' . intval($_GET['id']);
+ $form = $obj->return_form($url, 'edit');
+
+ // The validation or display
+ if ($form->validate()) {
+ if ($check) {
+ $values = $form->exportValues();
+ $res = $obj->update($values);
+
+ Display::display_confirmation_message(
+ sprintf(get_lang('ItemUpdated'), $values['field_display_text']),
+ false
+ );
+ }
+ $obj->display();
+ } else {
+ echo '';
+
+ $form->addElement('hidden', 'sec_token');
+ $form->setConstants(array('sec_token' => $token));
+ $form->display();
+ }
+ break;
+ case 'delete':
+ // Action handling: delete
+ if ($check) {
+ $res = $obj->delete($_GET['id']);
+
+ if ($res) {
+ Display::display_confirmation_message(get_lang('ItemDeleted'));
+ }
+ }
+
+ $obj->display();
+ break;
+ default:
+ $obj->display();
+ break;
+}
+
+Display :: display_footer();
diff --git a/main/admin/index.php b/main/admin/index.php
index 2f77193db1..dd6c7c7746 100644
--- a/main/admin/index.php
+++ b/main/admin/index.php
@@ -140,6 +140,9 @@ if (api_is_platform_admin()) {
if (isset($extAuthSource) && isset($extAuthSource['ldap']) && count($extAuthSource['ldap']) > 0) {
$items[] = array('url'=>'ldap_import_students.php', 'label' => get_lang('ImportLDAPUsersIntoCourse'));
}
+
+ $items[] = array('url'=>'course_fields.php', 'label' => get_lang('ManageCourseFields'));
+
$blocks['courses']['items'] = $items;
$blocks['courses']['extra'] = null;
diff --git a/main/inc/lib/CourseField.class.php b/main/inc/lib/CourseField.class.php
new file mode 100644
index 0000000000..64b4300779
--- /dev/null
+++ b/main/inc/lib/CourseField.class.php
@@ -0,0 +1,105 @@
+';
+ echo '' . Display::return_icon('back.png', get_lang('BackTo') . ' ' . get_lang('PlatformAdmin'), '', ICON_SIZE_MEDIUM) . '';
+ echo '' . Display::return_icon('add_user_fields.png', get_lang('Add'), '', ICON_SIZE_MEDIUM) . '';
+
+ echo '';
+ echo Display::grid_html('course_fields');
+ }
+
+ public function return_form($url, $action) {
+ $form = new FormValidator('course_field', 'post', $url);
+ $id = isset($_GET['id']) ? intval($_GET['id']) : null;
+ $form->addElement('hidden', 'id', $id);
+
+ // Settting the form elements
+ $header = get_lang('Add');
+ $defaults = array();
+
+ if ($action == 'edit') {
+ $header = get_lang('Modify');
+ // Setting the defaults
+ $defaults = $this->get($id);
+ }
+
+ $form->addElement('header', $header);
+ $form->addElement('text', 'field_display_text', get_lang('Name'), array('class' => 'span5'));
+
+ // Field type
+ $types = self::get_field_types();
+
+ $form->addElement('select', 'field_type', get_lang('FieldType'), $types, array('id' => 'field_type', 'class' => 'chzn-select', 'data-placeholder' => get_lang('Select')));
+ $form->addElement('label', get_lang('Example'), '-
');
+
+ //$form->addElement('advanced_settings',''.get_lang('AdvancedParameters').'');
+ //$form->addElement('html','');
+
+ $form->addElement('text', 'field_variable', get_lang('FieldLabel'), array('class' => 'span5'));
+ $form->addElement('text', 'field_options', get_lang('FieldPossibleValues'), array('id' => 'field_options', 'class' => 'span6'));
+ if ($action == 'edit') {
+ if (in_array($defaults['field_type'], array(ExtraField::FIELD_TYPE_SELECT, ExtraField::FIELD_TYPE_DOUBLE_SELECT))) {
+ $url = Display::url(get_lang('EditExtraFieldOptions'), 'extra_field_options.php?type=course&field_id=' . $id);
+ $form->addElement('label', null, $url);
+ $form->freeze('field_options');
+ }
+ }
+ $form->addElement('text', 'field_default_value', get_lang('FieldDefaultValue'), array('id' => 'field_default_value', 'class' => 'span5'));
+
+ $group = array();
+ $group[] = $form->createElement('radio', 'field_visible', null, get_lang('Yes'), 1);
+ $group[] = $form->createElement('radio', 'field_visible', null, get_lang('No'), 0);
+ $form->addGroup($group, '', get_lang('Visible'), '', false);
+
+ $group = array();
+ $group[] = $form->createElement('radio', 'field_changeable', null, get_lang('Yes'), 1);
+ $group[] = $form->createElement('radio', 'field_changeable', null, get_lang('No'), 0);
+ $form->addGroup($group, '', get_lang('FieldChangeability'), '', false);
+
+ $group = array();
+ $group[] = $form->createElement('radio', 'field_filter', null, get_lang('Yes'), 1);
+ $group[] = $form->createElement('radio', 'field_filter', null, get_lang('No'), 0);
+ $form->addGroup($group, '', get_lang('FieldFilter'), '', false);
+
+ $form->addElement('text', 'field_order', get_lang('FieldOrder'), array('class' => 'span1'));
+
+ if ($action == 'edit') {
+ $option = new CourseFieldOption('course');
+ if ($defaults['field_type'] == ExtraField::FIELD_TYPE_DOUBLE_SELECT) {
+ $form->freeze('field_options');
+ }
+ $defaults['field_options'] = $option->get_field_options_by_field_to_string($id);
+ $form->addElement('button', 'submit', get_lang('Modify'), 'class="save"');
+ } else {
+ $defaults['field_visible'] = 0;
+ $defaults['field_changeable'] = 0;
+ $defaults['field_filter'] = 0;
+ $form->addElement('button', 'submit', get_lang('Add'), 'class="save"');
+ }
+
+ /*if (!empty($defaults['created_at'])) {
+ $defaults['created_at'] = api_convert_and_format_date($defaults['created_at']);
+ }
+ if (!empty($defaults['updated_at'])) {
+ $defaults['updated_at'] = api_convert_and_format_date($defaults['updated_at']);
+ }*/
+ $form->setDefaults($defaults);
+
+ // Setting the rules
+ $form->addRule('field_display_text', get_lang('ThisFieldIsRequired'), 'required');
+ //$form->addRule('field_variable', get_lang('ThisFieldIsRequired'), 'required');
+ $form->addRule('field_type', get_lang('ThisFieldIsRequired'), 'required');
+
+ return $form;
+ }
+}
\ No newline at end of file
diff --git a/main/inc/lib/CourseFieldOption.class.php b/main/inc/lib/CourseFieldOption.class.php
new file mode 100644
index 0000000000..6e130cd369
--- /dev/null
+++ b/main/inc/lib/CourseFieldOption.class.php
@@ -0,0 +1,8 @@
+