Commit | Line | Data |
---|---|---|
c5704ec6 | 1 | <?php |
6c1fd304 RT |
2 | // This file is part of Moodle - http://moodle.org/ |
3 | // | |
4 | // Moodle is free software: you can redistribute it and/or modify | |
5 | // it under the terms of the GNU General Public License as published by | |
6 | // the Free Software Foundation, either version 3 of the License, or | |
7 | // (at your option) any later version. | |
8 | // | |
9 | // Moodle is distributed in the hope that it will be useful, | |
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | // GNU General Public License for more details. | |
13 | // | |
14 | // You should have received a copy of the GNU General Public License | |
15 | // along with Moodle. If not, see <http://www.gnu.org/licenses/>. | |
16 | ||
17 | ||
18 | /** | |
19 | * Filepicker form element | |
20 | * | |
21 | * Contains HTML class for a single filepicker form element | |
22 | * | |
23 | * @package core_form | |
24 | * @copyright 2009 Dongsheng Cai <dongsheng@moodle.com> | |
25 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
26 | */ | |
ae4a98a1 | 27 | |
28 | global $CFG; | |
c5704ec6 | 29 | |
30 | require_once("HTML/QuickForm/button.php"); | |
ae4a98a1 | 31 | require_once($CFG->dirroot.'/repository/lib.php'); |
c5704ec6 | 32 | |
33 | /** | |
6c1fd304 RT |
34 | * Filepicker form element |
35 | * | |
757f30a2 | 36 | * HTML class for a single filepicker element (based on button) |
c5704ec6 | 37 | * |
6c1fd304 RT |
38 | * @package core_form |
39 | * @category form | |
40 | * @copyright 2009 Dongsheng Cai <dongsheng@moodle.com> | |
58b7d48f | 41 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
c5704ec6 | 42 | */ |
b8d9c719 | 43 | class MoodleQuickForm_filepicker extends HTML_QuickForm_input { |
6c1fd304 | 44 | /** @var string html for help button, if empty then no help will icon will be dispalyed. */ |
12f11f23 | 45 | public $_helpbutton = ''; |
6c1fd304 RT |
46 | |
47 | /** @var array options provided to initalize filemanager */ | |
67233725 DC |
48 | // PHP doesn't support 'key' => $value1 | $value2 in class definition |
49 | // We cannot do $_options = array('return_types'=> FILE_INTERNAL | FILE_REFERENCE); | |
50 | // So I have to set null here, and do it in constructor | |
51 | protected $_options = array('maxbytes'=>0, 'accepted_types'=>'*', 'return_types'=>null); | |
b7335412 | 52 | |
6c1fd304 RT |
53 | /** |
54 | * Constructor | |
55 | * | |
56 | * @param string $elementName (optional) name of the filepicker | |
57 | * @param string $elementLabel (optional) filepicker label | |
58 | * @param array $attributes (optional) Either a typical HTML attribute string | |
59 | * or an associative array | |
60 | * @param array $options set of options to initalize filepicker | |
61 | */ | |
9d54b8cd | 62 | function MoodleQuickForm_filepicker($elementName=null, $elementLabel=null, $attributes=null, $options=null) { |
2d7c1117 | 63 | global $CFG, $PAGE; |
4287fc0d | 64 | |
9d54b8cd | 65 | $options = (array)$options; |
66 | foreach ($options as $name=>$value) { | |
67 | if (array_key_exists($name, $this->_options)) { | |
68 | $this->_options[$name] = $value; | |
69 | } | |
70 | } | |
2d7c1117 MG |
71 | if (empty($options['return_types'])) { |
72 | $this->_options['return_types'] = FILE_INTERNAL; | |
67233725 | 73 | } |
2d7c1117 | 74 | $fpmaxbytes = 0; |
9d54b8cd | 75 | if (!empty($options['maxbytes'])) { |
2d7c1117 | 76 | $fpmaxbytes = $options['maxbytes']; |
9d54b8cd | 77 | } |
2d7c1117 | 78 | $coursemaxbytes = 0; |
703ffaea | 79 | if (!empty($PAGE->course->maxbytes)) { |
2d7c1117 MG |
80 | $coursemaxbytes = $PAGE->course->maxbytes; |
81 | } | |
845c2ae1 | 82 | $this->_options['maxbytes'] = get_user_max_upload_file_size($PAGE->context, $CFG->maxbytes, $coursemaxbytes, $fpmaxbytes); |
c6aa3670 | 83 | $this->_type = 'filepicker'; |
b8d9c719 | 84 | parent::HTML_QuickForm_input($elementName, $elementLabel, $attributes); |
43023002 | 85 | } |
4287fc0d | 86 | |
6c1fd304 RT |
87 | /** |
88 | * Returns html for help button. | |
89 | * | |
90 | * @return string html for help button | |
91 | */ | |
b8d9c719 | 92 | function getHelpButton() { |
c5704ec6 | 93 | return $this->_helpbutton; |
94 | } | |
4287fc0d | 95 | |
6c1fd304 RT |
96 | /** |
97 | * Returns type of filepicker element | |
98 | * | |
99 | * @return string | |
100 | */ | |
b8d9c719 | 101 | function getElementTemplateType() { |
c5704ec6 | 102 | if ($this->_flagFrozen){ |
103 | return 'nodisplay'; | |
104 | } else { | |
105 | return 'default'; | |
106 | } | |
107 | } | |
4287fc0d | 108 | |
6c1fd304 RT |
109 | /** |
110 | * Returns HTML for filepicker form element. | |
111 | * | |
112 | * @return string | |
113 | */ | |
c5704ec6 | 114 | function toHtml() { |
bb496de7 DC |
115 | global $CFG, $COURSE, $USER, $PAGE, $OUTPUT; |
116 | $id = $this->_attributes['id']; | |
117 | $elname = $this->_attributes['name']; | |
dd070162 | 118 | |
c5704ec6 | 119 | if ($this->_flagFrozen) { |
120 | return $this->getFrozenHtml(); | |
b8d9c719 | 121 | } |
bb496de7 | 122 | if (!$draftitemid = (int)$this->getValue()) { |
2289c0e4 | 123 | // no existing area info provided - let's use fresh new draft area |
842f2914 PS |
124 | $draftitemid = file_get_unused_draft_itemid(); |
125 | $this->setValue($draftitemid); | |
b8d9c719 | 126 | } |
bb496de7 | 127 | |
b8d9c719 | 128 | if ($COURSE->id == SITEID) { |
b0c6dc1c | 129 | $context = context_system::instance(); |
b8d9c719 | 130 | } else { |
b0c6dc1c | 131 | $context = context_course::instance($COURSE->id); |
b8d9c719 | 132 | } |
99eaca9d | 133 | |
e189ec00 | 134 | $client_id = uniqid(); |
4287fc0d | 135 | |
6bdfef5d | 136 | $args = new stdClass(); |
99eaca9d DC |
137 | // need these three to filter repositories list |
138 | $args->accepted_types = $this->_options['accepted_types']?$this->_options['accepted_types']:'*'; | |
2d7c1117 | 139 | $args->return_types = $this->_options['return_types']; |
bb496de7 | 140 | $args->itemid = $draftitemid; |
b817205b | 141 | $args->maxbytes = $this->_options['maxbytes']; |
99eaca9d | 142 | $args->context = $PAGE->context; |
4b72f9eb | 143 | $args->buttonname = $elname.'choose'; |
63d5c4ac | 144 | $args->elementname = $elname; |
99eaca9d | 145 | |
7e074670 | 146 | $html = $this->_getTabs(); |
bb496de7 DC |
147 | $fp = new file_picker($args); |
148 | $options = $fp->options; | |
be85f7ab | 149 | $options->context = $PAGE->context; |
7e074670 | 150 | $html .= $OUTPUT->render($fp); |
4b72f9eb | 151 | $html .= '<input type="hidden" name="'.$elname.'" id="'.$id.'" value="'.$draftitemid.'" class="filepickerhidden"/>'; |
7e074670 | 152 | |
f08fac7c | 153 | $module = array('name'=>'form_filepicker', 'fullpath'=>'/lib/form/filepicker.js', 'requires'=>array('core_filepicker', 'node', 'node-event-simulate', 'core_dndupload')); |
7e074670 DC |
154 | $PAGE->requires->js_init_call('M.form_filepicker.init', array($fp->options), true, $module); |
155 | ||
563d0417 DC |
156 | $nonjsfilepicker = new moodle_url('/repository/draftfiles_manager.php', array( |
157 | 'env'=>'filepicker', | |
158 | 'action'=>'browse', | |
159 | 'itemid'=>$draftitemid, | |
160 | 'subdirs'=>0, | |
161 | 'maxbytes'=>$options->maxbytes, | |
162 | 'maxfiles'=>1, | |
163 | 'ctx_id'=>$PAGE->context->id, | |
164 | 'course'=>$PAGE->course->id, | |
71267723 | 165 | 'sesskey'=>sesskey(), |
563d0417 DC |
166 | )); |
167 | ||
168 | // non js file picker | |
169 | $html .= '<noscript>'; | |
6ef1402e | 170 | $html .= "<div><object type='text/html' data='$nonjsfilepicker' height='160' width='600' style='border:1px solid #000'></object></div>"; |
563d0417 DC |
171 | $html .= '</noscript>'; |
172 | ||
7e074670 | 173 | return $html; |
c5704ec6 | 174 | } |
4287fc0d | 175 | |
6c1fd304 RT |
176 | /** |
177 | * export uploaded file | |
178 | * | |
179 | * @param array $submitValues values submitted. | |
180 | * @param bool $assoc specifies if returned array is associative | |
181 | * @return array | |
182 | */ | |
21599d8c | 183 | function exportValue(&$submitValues, $assoc = false) { |
b7335412 | 184 | global $USER; |
185 | ||
b1eca344 JP |
186 | $draftitemid = $this->_findValue($submitValues); |
187 | if (null === $draftitemid) { | |
188 | $draftitemid = $this->getValue(); | |
189 | } | |
190 | ||
b7335412 | 191 | // make sure max one file is present and it is not too big |
b1eca344 | 192 | if (!is_null($draftitemid)) { |
b7335412 | 193 | $fs = get_file_storage(); |
b0c6dc1c | 194 | $usercontext = context_user::instance($USER->id); |
64f93798 | 195 | if ($files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftitemid, 'id DESC', false)) { |
b7335412 | 196 | $file = array_shift($files); |
bc8da017 AD |
197 | if ($this->_options['maxbytes'] |
198 | and $this->_options['maxbytes'] !== USER_CAN_IGNORE_FILE_SIZE_LIMITS | |
199 | and $file->get_filesize() > $this->_options['maxbytes']) { | |
200 | ||
b7335412 | 201 | // bad luck, somebody tries to sneak in oversized file |
202 | $file->delete(); | |
203 | } | |
204 | foreach ($files as $file) { | |
205 | // only one file expected | |
206 | $file->delete(); | |
207 | } | |
208 | } | |
209 | } | |
5b5206e1 JP |
210 | |
211 | return $this->_prepareValue($draftitemid, true); | |
21599d8c | 212 | } |
c5704ec6 | 213 | } |