1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: |
|
15: |
|
16: | namespace LucidFrame\Core;
|
17: |
|
18: | |
19: | |
20: |
|
21: | class AsynFileUploader
|
22: | {
|
23: |
|
24: | private $name;
|
25: |
|
26: | private $id;
|
27: |
|
28: | private $label;
|
29: |
|
30: | private $caption;
|
31: |
|
32: | private $value;
|
33: |
|
34: | private $hidden;
|
35: |
|
36: | private $uploadDir;
|
37: |
|
38: | private $extensions;
|
39: |
|
40: | private $maxSize;
|
41: |
|
42: | private $dimensions;
|
43: |
|
44: | private $uploadHandler;
|
45: |
|
46: | private $buttons;
|
47: |
|
48: | private $isDeletable;
|
49: |
|
50: | private $fileNameIsDisplayed;
|
51: |
|
52: | private $uploadAsOriginalFileName = false;
|
53: |
|
54: | private $onUpload;
|
55: |
|
56: | private $onDelete;
|
57: |
|
58: | |
59: | |
60: | |
61: | |
62: |
|
63: | public function __construct()
|
64: | {
|
65: | $this->name = 'file';
|
66: | $this->id = '';
|
67: | $this->label = _t('File');
|
68: | $this->caption = _t('Choose File');
|
69: | $this->value = array();
|
70: | $this->hidden = array();
|
71: | $this->maxSize = 10;
|
72: | $this->extensions = array();
|
73: | $this->uploadDir = FILE . 'tmp' . _DS_;
|
74: | $this->buttons = array();
|
75: | $this->dimensions = '';
|
76: | $this->uploadHandler = WEB_ROOT . 'lib/asyn-file-uploader.php';
|
77: | $this->isDeletable = true;
|
78: | $this->fileNameIsDisplayed = true;
|
79: | $this->onUpload = '';
|
80: | $this->onDelete = '';
|
81: |
|
82: | if (func_num_args()) {
|
83: | $arg = func_get_arg(0);
|
84: | if (is_string($arg)) {
|
85: | $this->name = $arg;
|
86: | } elseif (is_array($arg)) {
|
87: | foreach ($arg as $key => $value) {
|
88: | if (isset($this->{$key})) {
|
89: | $this->{$key} = $value;
|
90: | }
|
91: | }
|
92: | }
|
93: | }
|
94: | }
|
95: | |
96: | |
97: | |
98: |
|
99: | public function setName($name)
|
100: | {
|
101: | $this->name = $name;
|
102: | }
|
103: | |
104: | |
105: | |
106: |
|
107: | public function setId($id)
|
108: | {
|
109: | $this->id = $id;
|
110: | }
|
111: | |
112: | |
113: | |
114: |
|
115: | public function setLabel($label)
|
116: | {
|
117: | $this->label = $label;
|
118: | }
|
119: | |
120: | |
121: | |
122: |
|
123: | public function setCaption($caption)
|
124: | {
|
125: | $this->caption = $caption;
|
126: | }
|
127: | |
128: | |
129: | |
130: | |
131: | |
132: |
|
133: | public function setValue($value, $id = 0)
|
134: | {
|
135: | $this->value = array(
|
136: | $id => $value
|
137: | );
|
138: | }
|
139: | |
140: | |
141: |
|
142: | public function getValue()
|
143: | {
|
144: | return is_array($this->value) ? current($this->value) : $this->value;
|
145: | }
|
146: | |
147: | |
148: |
|
149: | public function getValueId()
|
150: | {
|
151: | if (is_array($this->value)) {
|
152: | return current(array_keys($this->value));
|
153: | }
|
154: | return 0;
|
155: | }
|
156: | |
157: | |
158: | |
159: | |
160: | |
161: |
|
162: | public function setHidden($key, $value = '')
|
163: | {
|
164: | if (!in_array($key, array('id', 'dimensions', 'fileName', 'uniqueId'))) {
|
165: |
|
166: | $this->hidden[$key] = $value;
|
167: | }
|
168: | }
|
169: | |
170: | |
171: | |
172: |
|
173: | public function setUploadDir($dir)
|
174: | {
|
175: | $this->uploadDir = $dir;
|
176: | }
|
177: | |
178: | |
179: | |
180: |
|
181: | public function setMaxSize($size)
|
182: | {
|
183: | $this->maxSize = $size;
|
184: | }
|
185: | |
186: | |
187: | |
188: |
|
189: | public function setExtensions($extensions)
|
190: | {
|
191: | $this->extensions = $extensions;
|
192: | }
|
193: | |
194: | |
195: | |
196: |
|
197: | public function setDimensions($dimensions)
|
198: | {
|
199: | $this->dimensions = $dimensions;
|
200: | }
|
201: | |
202: | |
203: | |
204: |
|
205: | public function setButtons()
|
206: | {
|
207: | $this->buttons = func_get_args();
|
208: | }
|
209: | |
210: | |
211: | |
212: |
|
213: | public function isDeletable($value)
|
214: | {
|
215: | $this->isDeletable = $value;
|
216: | }
|
217: | |
218: | |
219: | |
220: |
|
221: | public function isFileNameDisplayed($value)
|
222: | {
|
223: | $this->fileNameIsDisplayed = $value;
|
224: | }
|
225: |
|
226: | |
227: | |
228: | |
229: |
|
230: | public function setUploadAsOriginalFileName($value)
|
231: | {
|
232: | $this->uploadAsOriginalFileName = $value;
|
233: | }
|
234: | |
235: | |
236: | |
237: |
|
238: | public function setOnUpload($callable)
|
239: | {
|
240: | $this->onUpload = $callable;
|
241: | }
|
242: | |
243: | |
244: | |
245: |
|
246: | public function setOnDelete($callable)
|
247: | {
|
248: | $this->onDelete = $callable;
|
249: | }
|
250: | |
251: | |
252: | |
253: |
|
254: | public function setUploadHandler($url)
|
255: | {
|
256: | $this->uploadHandler = $url;
|
257: | }
|
258: | |
259: | |
260: | |
261: | |
262: | |
263: | |
264: | |
265: | |
266: | |
267: | |
268: |
|
269: | public function html($attributes = array())
|
270: | {
|
271: | $name = $this->name;
|
272: | $maxSize = $this->maxSize * 1024 * 1024;
|
273: |
|
274: |
|
275: | $attrHTML = array();
|
276: | $htmlIdForButton = false;
|
277: | $htmlClassForButton = false;
|
278: | foreach ($attributes as $attrName => $attrVal) {
|
279: | $attrName = strtolower($attrName);
|
280: | if ($attrName === 'class' && $attrVal) {
|
281: | $htmlClassForButton = true;
|
282: | $attrVal = 'asynfileuploader-button '.$attrVal;
|
283: | }
|
284: | if ($attrName === 'id' && $attrVal) {
|
285: | $this->id = $attrVal;
|
286: | $htmlIdForButton = true;
|
287: | }
|
288: | $attrHTML[] = $attrName.'="'.$attrVal.'"';
|
289: | }
|
290: | if ($htmlIdForButton === false) {
|
291: | $this->id = 'asynfileuploader-button-'.$name;
|
292: | $attrHTML[] = 'id="'.$this->id.'"';
|
293: | }
|
294: | if ($htmlClassForButton === false) {
|
295: | $attrHTML[] = 'class="asynfileuploader-button button"';
|
296: | }
|
297: | $buttonAttrHTML = implode(' ', $attrHTML);
|
298: |
|
299: | $args = array();
|
300: | $args[] = 'name=' . $name;
|
301: | $args[] = 'id=' . $this->id;
|
302: | $args[] = 'label=' . $this->label;
|
303: | $args[] = 'dir=' . base64_encode($this->uploadDir);
|
304: | $args[] = 'buttons=' . implode(',', $this->buttons);
|
305: | $args[] = 'onUploadHook=' . $this->onUpload;
|
306: | $args[] = 'exts=' . implode(',', $this->extensions);
|
307: | $args[] = 'maxSize=' . $maxSize;
|
308: | $args[] = 'uploadAsOriginalFileName=' . (int) $this->uploadAsOriginalFileName;
|
309: | if ($this->dimensions) {
|
310: | $args[] = 'dimensions=' . implode(',', $this->dimensions);
|
311: | }
|
312: | $args[] = 'lc_namespace=' . LC_NAMESPACE;
|
313: | $handlerURL = $this->uploadHandler.'?'.implode('&', $args);
|
314: |
|
315: |
|
316: | $id = '';
|
317: | $value = '';
|
318: | $currentFile = '';
|
319: | $currentFileURL = '';
|
320: | $extension = '';
|
321: | $uniqueId = '';
|
322: | $dimensions = array();
|
323: | $webUploadDir = str_replace('\\', '/', str_replace(ROOT, WEB_ROOT, $this->uploadDir));
|
324: |
|
325: | if ($this->value && file_exists($this->uploadDir . $value)) {
|
326: | $value = $this->getValue();
|
327: | $id = $this->getValueId();
|
328: | $currentFile = basename($this->uploadDir . $value);
|
329: | $currentFileURL = $webUploadDir . $value;
|
330: | $extension = pathinfo($this->uploadDir . $value, PATHINFO_EXTENSION);
|
331: | if (is_array($this->dimensions) && count($this->dimensions)) {
|
332: | $dimensions = $this->dimensions;
|
333: | }
|
334: | }
|
335: |
|
336: |
|
337: |
|
338: | if (count($_POST) && isset($_POST[$name]) && $_POST[$name] &&
|
339: | isset($_POST[$name.'-fileName']) && $_POST[$name.'-fileName']) {
|
340: | $post = _post();
|
341: | $value = $post[$name];
|
342: | $id = isset($post[$name.'-id']) ? $post[$name.'-id'] : '';
|
343: |
|
344: | if (file_exists($this->uploadDir . $value)) {
|
345: | $currentFile = $value;
|
346: | $currentFileURL = $webUploadDir . $value;
|
347: | $extension = pathinfo($this->uploadDir . $value, PATHINFO_EXTENSION);
|
348: | $uniqueId = $post[$name.'-uniqueId'];
|
349: | }
|
350: |
|
351: | if (isset($post[$name.'-dimensions']) && is_array($post[$name.'-dimensions']) && count($post[$name.'-dimensions'])) {
|
352: | $dimensions = $post[$name.'-dimensions'];
|
353: | }
|
354: | }
|
355: |
|
356: | $preview = $currentFile ? true : false;
|
357: | ?>
|
358: | <div class="asynfileuploader" id="asynfileuploader-<?php echo $name; ?>">
|
359: | <div id="asynfileuploader-value-<?php echo $name; ?>">
|
360: | <input type="hidden" name="<?php echo $name; ?>" value="<?php if ($value) echo $value; ?>" />
|
361: | <input type="hidden" name="<?php echo $name; ?>-id" value="<?php if ($id) echo $id; ?>" />
|
362: | <?php foreach ($dimensions as $d) { ?>
|
363: | <input type="hidden" name="<?php echo $name; ?>-dimensions[]" value="<?php echo $d; ?>" />
|
364: | <?php } ?>
|
365: | </div>
|
366: | <div id="asynfileuploader-hiddens-<?php echo $name; ?>">
|
367: | <?php foreach ($this->hidden as $hiddenName => $hiddenValue) { ?>
|
368: | <input type="hidden" name="<?php echo $name; ?>-<?php echo $hiddenName; ?>" value="<?php echo $hiddenValue; ?>" />
|
369: | <?php } ?>
|
370: | </div>
|
371: | <input type="hidden" name="<?php echo $name; ?>-dir" value="<?php echo base64_encode($this->uploadDir); ?>" />
|
372: | <input type="hidden" name="<?php echo $name; ?>-fileName" id="asynfileuploader-fileName-<?php echo $name; ?>" value="<?php echo $currentFile; ?>" />
|
373: | <input type="hidden" name="<?php echo $name; ?>-uniqueId" id="asynfileuploader-uniqueId-<?php echo $name; ?>" value="<?php echo $uniqueId; ?>" />
|
374: | <div id="asynfileuploader-progress-<?php echo $name; ?>" class="asynfileuploader-progress">
|
375: | <div></div>
|
376: | </div>
|
377: | <div <?php echo $buttonAttrHTML; ?>>
|
378: | <span><?php echo $this->caption; ?></span>
|
379: | <iframe id="asynfileuploader-frame-<?php echo $name; ?>" src="<?php echo $handlerURL; ?>" frameborder="0" scrolling="no" style="overflow:hidden;"></iframe>
|
380: | </div>
|
381: | <div class="asynfileuploader-file-info">
|
382: | <?php if ($this->fileNameIsDisplayed) { ?>
|
383: | <span id="asynfileuploader-name-<?php echo $name; ?>">
|
384: | <?php if ($currentFile) { ?>
|
385: | <a href="<?php echo $currentFileURL; ?>" target="_blank" rel="nofollow"><?php echo $currentFile ?></a>
|
386: | <?php } ?>
|
387: | </span>
|
388: | <?php } ?>
|
389: | <span id="asynfileuploader-delete-<?php echo $name; ?>" class="asynfileuploader-delete" <?php if (!$currentFile) echo 'style="display:none"'; ?>>
|
390: | <?php if ($this->isDeletable) { ?>
|
391: | <a href="javascript:" rel="<?php echo $this->onDelete; ?>" title="Delete">
|
392: | <span>Delete</span>
|
393: | </a>
|
394: | <?php } ?>
|
395: | </span>
|
396: | </div>
|
397: | <span class="asynfileuploader-error" id="asynfileuploader-error-<?php echo $name; ?>"></span>
|
398: | <script type="text/javascript">
|
399: | LC.AsynFileUploader.init('<?php echo $name; ?>');
|
400: | <?php
|
401: | if ($preview) {
|
402: | $json = array(
|
403: | 'name' => $name,
|
404: | 'value' => $value,
|
405: | 'fileName' => $currentFile,
|
406: | 'url' => $currentFileURL,
|
407: | 'extension' => $extension,
|
408: | 'caption' => $this->label
|
409: | );
|
410: | echo 'LC.AsynFileUploader.preview(' . json_encode($json) . ');';
|
411: | }
|
412: | ?>
|
413: | </script>
|
414: | </div>
|
415: | <?php
|
416: | }
|
417: | |
418: | |
419: | |
420: | |
421: |
|
422: | public static function getDirFromRequest($name)
|
423: | {
|
424: | return isset($_REQUEST[$name.'-dir']) ? _sanitize(base64_decode($_REQUEST[$name.'-dir'])) : '';
|
425: | }
|
426: | }
|
427: | |