/lib/form/filepicker.php
PHP | 141 lines | 105 code | 22 blank | 14 comment | 13 complexity | 8bbb3ced96edd5c653010affdf059fec MD5 | raw file
- <?php
- global $CFG;
- require_once("HTML/QuickForm/button.php");
- require_once($CFG->dirroot.'/repository/lib.php');
- /**
- * HTML class for a single filepicker element (based on button)
- *
- * @author Moodle.com
- * @version 1.0
- * @since Moodle 2.0
- * @access public
- */
- class MoodleQuickForm_filepicker extends HTML_QuickForm_input {
- public $_helpbutton = '';
- protected $_options = array('maxbytes'=>0, 'accepted_types'=>'*', 'return_types'=>FILE_INTERNAL);
- function MoodleQuickForm_filepicker($elementName=null, $elementLabel=null, $attributes=null, $options=null) {
- global $CFG;
- $options = (array)$options;
- foreach ($options as $name=>$value) {
- if (array_key_exists($name, $this->_options)) {
- $this->_options[$name] = $value;
- }
- }
- 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);
- }
- function setHelpButton($helpbuttonargs, $function='helpbutton') {
- debugging('component setHelpButton() is not used any more, please use $mform->setHelpButton() instead');
- }
- function getHelpButton() {
- return $this->_helpbutton;
- }
- function getElementTemplateType() {
- if ($this->_flagFrozen){
- return 'nodisplay';
- } else {
- return 'default';
- }
- }
- function toHtml() {
- global $CFG, $COURSE, $USER, $PAGE, $OUTPUT;
- $id = $this->_attributes['id'];
- $elname = $this->_attributes['name'];
- if ($this->_flagFrozen) {
- return $this->getFrozenHtml();
- }
- if (!$draftitemid = (int)$this->getValue()) {
- // no existing area info provided - let's use fresh new draft area
- $draftitemid = file_get_unused_draft_itemid();
- $this->setValue($draftitemid);
- }
- if ($COURSE->id == SITEID) {
- $context = get_context_instance(CONTEXT_SYSTEM);
- } else {
- $context = get_context_instance(CONTEXT_COURSE, $COURSE->id);
- }
- $client_id = uniqid();
- $args = new stdClass();
- // need these three to filter repositories list
- $args->accepted_types = $this->_options['accepted_types']?$this->_options['accepted_types']:'*';
- $args->return_types = FILE_INTERNAL;
- $args->itemid = $draftitemid;
- $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;
- $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', '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(
- 'env'=>'filepicker',
- 'action'=>'browse',
- 'itemid'=>$draftitemid,
- 'subdirs'=>0,
- 'maxbytes'=>$options->maxbytes,
- 'maxfiles'=>1,
- 'ctx_id'=>$PAGE->context->id,
- 'course'=>$PAGE->course->id,
- 'sesskey'=>sesskey(),
- ));
- // non js file picker
- $html .= '<noscript>';
- $html .= "<div><object type='text/html' data='$nonjsfilepicker' height='160' width='600' style='border:1px solid #000'></object></div>";
- $html .= '</noscript>';
- return $html;
- }
- function exportValue(&$submitValues, $assoc = false) {
- global $USER;
- $draftitemid = $this->_findValue($submitValues);
- if (null === $draftitemid) {
- $draftitemid = $this->getValue();
- }
- // make sure max one file is present and it is not too big
- if (!is_null($draftitemid)) {
- $fs = get_file_storage();
- $usercontext = get_context_instance(CONTEXT_USER, $USER->id);
- if ($files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftitemid, 'id DESC', false)) {
- $file = array_shift($files);
- if ($this->_options['maxbytes'] and $file->get_filesize() > $this->_options['maxbytes']) {
- // bad luck, somebody tries to sneak in oversized file
- $file->delete();
- }
- foreach ($files as $file) {
- // only one file expected
- $file->delete();
- }
- }
- }
- return $this->_prepareValue($draftitemid, true);
- }
- }