diff --git a/grade/import/xml/grade_import_form.php b/grade/import/xml/grade_import_form.php index 70e69f87549..1984916d03a 100644 --- a/grade/import/xml/grade_import_form.php +++ b/grade/import/xml/grade_import_form.php @@ -32,7 +32,6 @@ class grade_import_form extends moodleform { $mform->setType('id', PARAM_INT); $mform->addElement('header', 'general', get_string('importfile', 'grades')); - $mform->disabledIf('url', 'userfile', 'noteq', ''); $mform->addElement('advcheckbox', 'feedback', get_string('importfeedback', 'grades')); $mform->setDefault('feedback', 0); @@ -42,6 +41,7 @@ class grade_import_form extends moodleform { $mform->disabledIf('userfile', 'url', 'noteq', ''); $mform->addElement('text', 'url', get_string('fileurl', 'gradeimport_xml'), 'size="80"'); + $mform->disabledIf('url', 'userfile', 'noteq', ''); if (!empty($CFG->gradepublishing)) { $mform->addElement('header', 'publishing', get_string('publishing', 'grades')); diff --git a/lib/form/filemanager.php b/lib/form/filemanager.php index b6c4782d2b3..f0619a90bf5 100644 --- a/lib/form/filemanager.php +++ b/lib/form/filemanager.php @@ -45,6 +45,7 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element { if (!empty($options['maxbytes'])) { $this->_options['maxbytes'] = get_max_upload_file_size($CFG->maxbytes, $options['maxbytes']); } + $this->_type = 'filemanager'; parent::HTML_QuickForm_element($elementName, $elementLabel, $attributes); } diff --git a/lib/form/filepicker.js b/lib/form/filepicker.js index 2a84f0329e1..e27d4af5c38 100644 --- a/lib/form/filepicker.js +++ b/lib/form/filepicker.js @@ -1,19 +1,34 @@ M.form_filepicker = {}; - +M.form_filepicker.Y = null; +M.form_filepicker.instances = []; M.form_filepicker.callback = function(params) { var html = ''+params['file']+''; document.getElementById('file_info_'+params['client_id']).innerHTML = html; + //When file is added then set status of global variable to true + var elementname = M.core_filepicker.instances[params['client_id']].options.elementname; + M.form_filepicker.instances[elementname].fileadded = true; + //generate event to indicate changes which will be used by disable if or validation code + M.form_filepicker.Y.one('#id_'+elementname).simulate('change'); }; /** * This fucntion is called for each file picker on page. */ M.form_filepicker.init = function(Y, options) { + //Keep reference of YUI, so that it can be used in callback. + M.form_filepicker.Y = Y; + + //For client side validation, initialize file status for this filepicker + M.form_filepicker.instances[options.elementname] = {}; + M.form_filepicker.instances[options.elementname].fileadded = false; + + //Set filepicker callback options.formcallback = M.form_filepicker.callback; + if (!M.core_filepicker.instances[options.client_id]) { - M.core_filepicker.init(Y, options); + M.core_filepicker.init(Y, options); } Y.on('click', function(e, client_id) { e.preventDefault(); diff --git a/lib/form/filepicker.php b/lib/form/filepicker.php index c5af6e18866..cfa491d3366 100644 --- a/lib/form/filepicker.php +++ b/lib/form/filepicker.php @@ -29,6 +29,7 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_input { if (!empty($options['maxbytes'])) { $this->_options['maxbytes'] = get_max_upload_file_size($CFG->maxbytes, $options['maxbytes']); } + $this->_type = 'filepicker'; parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes); } @@ -78,6 +79,7 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_input { $args->maxbytes = $this->_options['maxbytes']; $args->context = $PAGE->context; $args->buttonname = $elname.'choose'; + $args->elementname = $elname; $html = $this->_getTabs(); $fp = new file_picker($args); @@ -86,7 +88,7 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_input { $html .= $OUTPUT->render($fp); $html .= ''; - $module = array('name'=>'form_filepicker', 'fullpath'=>'/lib/form/filepicker.js', 'requires'=>array('core_filepicker')); + $module = array('name'=>'form_filepicker', 'fullpath'=>'/lib/form/filepicker.js', 'requires'=>array('core_filepicker', 'node', 'node-event-simulate')); $PAGE->requires->js_init_call('M.form_filepicker.init', array($fp->options), true, $module); $nonjsfilepicker = new moodle_url('/repository/draftfiles_manager.php', array( diff --git a/lib/form/form.js b/lib/form/form.js index a10f21a7115..ee473ebe5cf 100644 --- a/lib/form/form.js +++ b/lib/form/form.js @@ -278,7 +278,17 @@ M.form.initFormDependencies = function(Y, formid, dependencies) { } else if (this.getAttribute('type').toLowerCase() == 'checkbox' && !Y.Node.getDOMNode(this).checked) { return; } - lock = lock || this.get('value') == value; + //check for filepicker status + if (this.getAttribute('class').toLowerCase() == 'filepickerhidden') { + var elementname = this.getAttribute('name'); + if (elementname && M.form_filepicker.instances[elementname].fileadded) { + lock = false; + } else { + lock = true; + } + } else { + lock = lock || this.get('value') == value; + } }); return { lock : lock, @@ -299,7 +309,17 @@ M.form.initFormDependencies = function(Y, formid, dependencies) { } else if (this.getAttribute('type').toLowerCase() == 'checkbox' && !Y.Node.getDOMNode(this).checked) { return; } - lock = lock || this.get('value') != value; + //check for filepicker status + if (this.getAttribute('class').toLowerCase() == 'filepickerhidden') { + var elementname = this.getAttribute('name'); + if (elementname && M.form_filepicker.instances[elementname].fileadded) { + lock = true; + } else { + lock = false; + } + } else { + lock = lock || this.get('value') != value; + } }); return { lock : lock, diff --git a/lib/formslib.php b/lib/formslib.php index 5e85404842b..cee1aafaeda 100644 --- a/lib/formslib.php +++ b/lib/formslib.php @@ -326,6 +326,43 @@ abstract class moodleform { } } + /** + * Internal method. Validates filepicker and filemanager files if they are + * set as required fields. Also, sets the error message if encountered one. + * + * @return bool/array with errors + */ + protected function validate_draft_files() { + global $USER; + $mform =& $this->_form; + + $errors = array(); + //Go through all the required elements and make sure you hit filepicker or + //filemanager element. + foreach ($mform->_rules as $elementname => $rules) { + $elementtype = $mform->getElementType($elementname); + //If element is of type filepicker then do validation + if (($elementtype == 'filepicker') || ($elementtype == 'filemanager')){ + //Check if rule defined is required rule + foreach ($rules as $rule) { + if ($rule['type'] == 'required') { + $draftid = (int)$mform->getSubmitValue($elementname); + $fs = get_file_storage(); + $context = get_context_instance(CONTEXT_USER, $USER->id); + if (!$files = $fs->get_area_files($context->id, 'user', 'draft', $draftid, 'id DESC', false)) { + $errors[$elementname] = $rule['message']; + } + } + } + } + } + if (empty($errors)) { + return true; + } else { + return $errors; + } + } + /** * Load in existing data as form defaults. Usually new entry defaults are stored directly in * form definition (new entry form); this function is used to load in data where values @@ -426,6 +463,16 @@ abstract class moodleform { $files = array(); $file_val = $this->_validate_files($files); + //check draft files for validation and flag them if required files + //are not in draft area. + $draftfilevalue = $this->validate_draft_files(); + + if ($file_val !== true && $draftfilevalue !== true) { + $file_val = array_merge($file_val, $draftfilevalue); + } else if ($draftfilevalue !== true) { + $file_val = $draftfilevalue; + } //default is file_val, so no need to assign. + if ($file_val !== true) { if (!empty($file_val)) { foreach ($file_val as $element=>$msg) { @@ -2280,7 +2327,7 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{ if (!$form->isFrozen()) { $args = $form->getLockOptionObject(); if (count($args[1]) > 0) { - $PAGE->requires->js_init_call('M.form.initFormDependencies', $args, false, moodleform::get_js_module()); + $PAGE->requires->js_init_call('M.form.initFormDependencies', $args, true, moodleform::get_js_module()); } } }