From 4287fc0df5b3530f0407f571b5221668c69f70fc Mon Sep 17 00:00:00 2001 From: skodak Date: Sun, 7 Sep 2008 13:30:46 +0000 Subject: [PATCH] MDL-15906 filepicker support in all file functions in formslib --- lib/form/filepicker.php | 28 ++++---- lib/formslib.php | 152 ++++++++++++++++++++++++++++------------ 2 files changed, 125 insertions(+), 55 deletions(-) diff --git a/lib/form/filepicker.php b/lib/form/filepicker.php index f57586fe52..856782a33b 100644 --- a/lib/form/filepicker.php +++ b/lib/form/filepicker.php @@ -12,16 +12,14 @@ require_once(dirname(dirname(dirname(__FILE__))) . '/repository/lib.php'); * @since Moodle 2.0 * @access public */ -class MoodleQuickForm_filepicker extends HTML_QuickForm_button -{ - var $_filearea; +class MoodleQuickForm_filepicker extends HTML_QuickForm_button { var $_helpbutton=''; - - function MoodleQuickForm_filepicker($elementName=null, $value=null, $filearea=null, $attributes=null) { + + function MoodleQuickForm_filepicker($elementName=null, $value=null, $attributes=null) { HTML_QuickForm_input::HTML_QuickForm_input($elementName, $value, $attributes); // Set label cause button doesn't parent::HTML_QuickForm_button($elementName, $value, $attributes); - $this->_filearea = $filearea; } + function setHelpButton($helpbuttonargs, $function='helpbutton'){ if (!is_array($helpbuttonargs)){ $helpbuttonargs=array($helpbuttonargs); @@ -36,9 +34,11 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_button } $this->_helpbutton=call_user_func_array($function, $helpbuttonargs); } + function getHelpButton(){ return $this->_helpbutton; } + function getElementTemplateType(){ if ($this->_flagFrozen){ return 'nodisplay'; @@ -46,23 +46,27 @@ class MoodleQuickForm_filepicker extends HTML_QuickForm_button return 'default'; } } + function toHtml() { global $CFG, $COURSE; if ($this->_flagFrozen) { return $this->getFrozenHtml(); } else { $strsaved = get_string('filesaved', 'repository'); - if(empty($COURSE->context)) { + + if (empty($COURSE->context)) { $ctx = get_context_instance(CONTEXT_SYSTEM); } else { $ctx = $COURSE->context; } $ret = repository_get_client($ctx); + $suffix = $ret['suffix']; + $id = $this->_attributes['id']; + $elname = $this->_attributes['name']; + $str = $this->_getTabs(); - $str .= ''; - $id = $this->_attributes['id']; - $filearea = $this->_filearea; + $str .= ''; $str .= << function updatefile_$suffix(str){ @@ -74,16 +78,16 @@ function callpicker_$suffix(){ picker.id = 'file-picker-$suffix'; document.body.appendChild(picker); var el=document.getElementById('${id}_${suffix}'); - openpicker_$suffix({"env":"form", 'target':el, 'callback':updatefile_$suffix, 'filearea':"${filearea}"}) + openpicker_$suffix({"env":"form", 'target':el, 'callback':updatefile_$suffix}) } EOD; // $this->_getAttrString($this->_attributes); - $str .= "\n"; $str .= ''.''.$ret['css'].$ret['js']; return $str; } } + function exportValue(&$submitValues, $assoc = false) { return array($this->_attributes['name'] => $submitValues[$this->_attributes['name']]); } diff --git a/lib/formslib.php b/lib/formslib.php index a87a99b84c..42a70b3b48 100644 --- a/lib/formslib.php +++ b/lib/formslib.php @@ -187,7 +187,7 @@ class moodleform { } /** - * Internal method. Validates all uploaded files. + * Internal method. Validates all old-style uploaded files. */ function _validate_files(&$files) { global $CFG, $COURSE; @@ -388,7 +388,7 @@ class moodleform { $file_val = false; } - $data = $mform->exportValues(null, false); + $data = $mform->exportValues(); $moodle_val = $this->validation($data, $files); if ((is_array($moodle_val) && count($moodle_val)!==0)) { // non-empty array means errors @@ -487,6 +487,8 @@ class moodleform { * @return mixed false in case of failure, string if ok */ function get_new_filename($elname=null) { + global $USER; + if (!$this->is_submitted() or !$this->is_validated()) { return false; } @@ -498,6 +500,28 @@ class moodleform { reset($_FILES); $elname = key($_FILES); } + + if (empty($elname)) { + return false; + } + + $element = $this->_form->getElement($elname); + + if ($element instanceof MoodleQuickForm_filepicker) { + $values = $this->_form->exportValues($elname); + if (empty($values[$elname])) { + return false; + } + $draftid = $values[$elname]; + $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)) { + return false; + } + $file = reset($files); + return $file->get_filename(); + } + if (!isset($_FILES[$elname])) { return false; } @@ -513,11 +537,9 @@ class moodleform { * @return bool success */ function save_file($elname, $pathname, $override=false) { - if (!$this->is_submitted() or !$this->is_validated()) { - return false; - } + global $USER; - if (!isset($_FILES[$elname])) { + if (!$this->is_submitted() or !$this->is_validated()) { return false; } @@ -530,11 +552,29 @@ class moodleform { return false; } } - if (!copy($_FILES[$elname]['tmp_name'], $pathname)) { - return false; + + $element = $this->_form->getElement($elname); + + if ($element instanceof MoodleQuickForm_filepicker) { + $values = $this->_form->exportValues($elname); + if (empty($values[$elname])) { + return false; + } + $draftid = $values[$elname]; + $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)) { + return false; + } + $file = reset($files); + + return $file->copy_content_to($pathname); + + } else if (isset($_FILES[$elname])) { + return copy($_FILES[$elname]['tmp_name'], $pathname); } - return true; + return false; } /** @@ -550,7 +590,6 @@ class moodleform { */ function save_stored_file($elname, $newcontextid, $newfilearea, $newitemid, $newfilepath='/', $newfilename=null, $overwrite=false, $newuserid=null) { - global $USER; if (!$this->is_submitted() or !$this->is_validated()) { @@ -561,43 +600,50 @@ class moodleform { $newuserid = $USER->id; } - if (isset($_FILES[$elname])) { - $filename = is_null($newfilename) ? $_FILES[$elname]['name'] : $newfilename; + $element = $this->_form->getElement($elname); + $fs = get_file_storage(); - $fs = get_file_storage(); + if ($element instanceof MoodleQuickForm_filepicker) { + $values = $this->_form->exportValues($elname); + if (empty($values[$elname])) { + return false; + } + $draftid = $values[$elname]; + $context = get_context_instance(CONTEXT_USER, $USER->id); + if (!$files = $fs->get_area_files($context->id, 'user_draft', $draftid, 'id DESC', false)) { + return false; + } + $file = reset($files); + if (is_null($newfilename)) { + $newfilename = $file->get_filename(); + } - if ($file = $fs->get_file($newcontextid, $newfilearea, $newitemid, $newfilepath, $newfilename)) { - if ($overwrite) { - $file->delete(); - } else { - return false; + if ($overwrite) { + if ($oldfile = $fs->get_file($newcontextid, $newfilearea, $newitemid, $newfilepath, $newfilename)) { + if (!$oldfile->delete()) { + return false; + } } } - $file_record = new object(); - $file_record->contextid = $newcontextid; - $file_record->filearea = $newfilearea; - $file_record->itemid = $newitemid; - $file_record->filepath = $newfilepath; - $file_record->filename = $newfilename; - $file_record->userid = $newuserid; + $file_record = array('contextid'=>$newcontextid, 'filearea'=>$newfilearea, 'itemid'=>$newitemid, + 'filepath'=>$newfilepath, 'filename'=>$newfilename, 'userid'=>$newuserid); + return $fs->create_file_from_storedfile($file_record, $file); - return $fs->create_file_from_pathname($file_record, $_FILES[$elname]['tmp_name']); - - } else { // We check if the file has been uploaded already into the user's draft area - - $values = $this->get_data(); - - if (!empty($values->$elname)) { - - $itemid = $values->$elname; - - $fs = get_file_storage(); - - $newfiles = $fs->move_draft_to_final($itemid, $newcontextid, $newfilearea, $newitemid, $newfilepath, $overwrite); + } else if (isset($_FILES[$elname])) { + $filename = is_null($newfilename) ? $_FILES[$elname]['name'] : $newfilename; - return array_pop($newfiles); + if ($overwrite) { + if ($oldfile = $fs->get_file($newcontextid, $newfilearea, $newitemid, $newfilepath, $newfilename)) { + if (!$oldfile->delete()) { + return false; + } + } } + + $file_record = array('contextid'=>$newcontextid, 'filearea'=>$newfilearea, 'itemid'=>$newitemid, + 'filepath'=>$newfilepath, 'filename'=>$newfilename, 'userid'=>$newuserid); + return $fs->create_file_from_pathname($file_record, $_FILES[$elname]['tmp_name']); } return false; @@ -609,15 +655,34 @@ class moodleform { * @return mixed false in case of failure, string if ok */ function get_file_content($elname) { + global $USER; + if (!$this->is_submitted() or !$this->is_validated()) { return false; } - if (!isset($_FILES[$elname])) { - return false; + $element = $this->_form->getElement($elname); + + if ($element instanceof MoodleQuickForm_filepicker) { + $values = $this->_form->exportValues($elname); + if (empty($values[$elname])) { + return false; + } + $draftid = $values[$elname]; + $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)) { + return false; + } + $file = reset($files); + + return $file->get_content(); + + } else if (isset($_FILES[$elname])) { + return file_get_contents($_FILES[$elname]['tmp_name']); } - return file_get_contents($_FILES[$elname]['tmp_name']); + return false; } /** @@ -1229,7 +1294,8 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless { if (PEAR::isError($value)) { return $value; } - $unfiltered[$elementName] = $value; + //oh, stock QuickFOrm was returning array of arrays! + $unfiltered = HTML_QuickForm::arrayMerge($unfiltered, $value); } } -- 2.39.5