MDL-25937 Forms Library: Added Javascript validation for filepicker and filemanager...
authorRajesh Taneja <rajesh@moodle.org>
Fri, 9 Sep 2011 08:50:12 +0000 (16:50 +0800)
committerRajesh Taneja <rajesh@moodle.org>
Fri, 16 Sep 2011 01:17:20 +0000 (09:17 +0800)
lib/form/filemanager.js
lib/form/filemanager.php
lib/form/filepicker.js
lib/form/filepicker.php
lib/formslib.php

index cf6837b..bedf3a4 100644 (file)
@@ -53,6 +53,9 @@ M.form_filemanager.init = function(Y, options) {
         api: M.cfg.wwwroot+'/repository/draftfiles_ajax.php',
         menus: {},
         initializer: function(options) {
+            //For client side validation, remove hidden draft_id
+            Y.one('#id_'+options.elementname).set('value', '');
+
             this.options = options;
             if (options.mainfile) {
                 this.enablemainfile = options.mainfile;
@@ -69,6 +72,7 @@ M.form_filemanager.init = function(Y, options) {
             this.filepicker_options.maxbytes = this.maxbytes;
             this.filepicker_options.env = 'filemanager';
             this.filepicker_options.itemid = options.itemid;
+            this.filepicker_options.elementname = options.elementname;
 
             if (options.filecount) {
                 this.filecount = options.filecount;
@@ -150,6 +154,12 @@ M.form_filemanager.init = function(Y, options) {
                 button_addfile.setStyle('display', 'none');
             }
             this.refresh(this.currentpath);
+            //When file is added then set draftid for validation
+            var elementname = M.core_filepicker.instances[this.client_id].options.elementname;
+            var itemid = M.core_filepicker.instances[this.client_id].options.itemid;
+            Y.one('#id_'+elementname).set('value', itemid);
+            //generate event to indicate changes which will be used by disable if code.
+            Y.one('#id_'+elementname).simulate('change');
         },
         refresh: function(filepath) {
             var scope = this;
index 3670fef..7bb93c7 100644 (file)
@@ -147,14 +147,12 @@ class MoodleQuickForm_filemanager extends HTML_QuickForm_element {
         $options->accepted_types = $accepted_types;
         $options->return_types = FILE_INTERNAL;
         $options->context = $PAGE->context;
+        $options->elementname = $elname;
 
         $html = $this->_getTabs();
         $html .= form_filemanager_render($options);
 
-        $html .= '<input value="'.$draftitemid.'" name="'.$elname.'" type="hidden" />';
-        // label element needs 'for' attribute work
-        $html .= '<input value="" id="id_'.$elname.'" type="hidden" />';
-
+        $html .= '<input id="id_'.$elname.'" value="'.$draftitemid.'" name="'.$elname.'" type="hidden" class="filemanagerhidden"/>';
         return $html;
     }
 }
@@ -304,7 +302,7 @@ FMHTML;
     $module = array(
         'name'=>'form_filemanager',
         'fullpath'=>'/lib/form/filemanager.js',
-        'requires' => array('core_filepicker', 'base', 'io-base', 'node', 'json', 'yui2-button', 'yui2-container', 'yui2-layout', 'yui2-menu', 'yui2-treeview'),
+        'requires' => array('core_filepicker', 'base', 'io-base', 'node', 'node-event-simulate', 'json', 'yui2-button', 'yui2-container', 'yui2-layout', 'yui2-menu', 'yui2-treeview'),
         'strings' => array(array('loading', 'repository'), array('nomorefiles', 'repository'), array('confirmdeletefile', 'repository'),
              array('add', 'repository'), array('accessiblefilepicker', 'repository'), array('move', 'moodle'),
              array('cancel', 'moodle'), array('download', 'moodle'), array('ok', 'moodle'),
index 2a84f03..186dc0b 100644 (file)
@@ -5,12 +5,21 @@ M.form_filepicker = {};
 M.form_filepicker.callback = function(params) {
     var html = '<a href="'+params['url']+'">'+params['file']+'</a>';
     document.getElementById('file_info_'+params['client_id']).innerHTML = html;
+    //When file is added then set draftid for validation
+    var elementname = M.core_filepicker.instances[params['client_id']].options.elementname;
+    var itemid = M.core_filepicker.instances[params['client_id']].options.itemid;
+    M.form_filepicker.YUI.one('#id_'+elementname).set('value', itemid);
+    //generate event to indicate changes which will be used by disable if code.
+    M.form_filepicker.YUI.one('#id_'+elementname).simulate('change');
 };
 
 /**
  * This fucntion is called for each file picker on page.
  */
 M.form_filepicker.init = function(Y, options) {
+    //For client side validation, remove hidden draft_id
+    M.form_filepicker.YUI = Y;
+    Y.one('#id_'+options.elementname).set('value', '');
     options.formcallback = M.form_filepicker.callback;
     if (!M.core_filepicker.instances[options.client_id]) {
         M.core_filepicker.init(Y, options); 
index 3007020..31a5329 100644 (file)
@@ -79,15 +79,17 @@ 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);
         $options = $fp->options;
         $options->context = $PAGE->context;
+        $fp->options->elementname = $elname;
         $html .= $OUTPUT->render($fp);
         $html .= '<input type="hidden" name="'.$elname.'" id="'.$id.'" value="'.$draftitemid.'" class="filepickerhidden"/>';
 
-        $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(
index a521cc2..45e01a2 100644 (file)
@@ -345,7 +345,7 @@ abstract class moodleform {
      *
      * @return bool/array with errors
      */
-    function _validate_draft_files() {
+    protected function validate_draft_files() {
         global $USER;
         $mform =& $this->_form;
 
@@ -478,7 +478,7 @@ abstract class moodleform {
             $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();
+            $draftfilevalue = $this->validate_draft_files();
 
             if ($file_val !== true && $draftfilevalue !== true) {
                 $file_val = array_merge($file_val, $draftfilevalue);
@@ -2347,7 +2347,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());
             }
         }
     }