Source of file UploadField.php
Size: 8,045 Bytes - Last Modified: 2021-12-24T05:19:46+00:00
/var/www/docs.ssmods.com/process/src/src/Form/UploadField.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 | <?php /** * UploadField **/ namespace jamesbolitho\frontenduploadfield; use SilverStripe\AssetAdmin\Controller\AssetAdmin; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; use SilverStripe\Forms\FileField; use SilverStripe\View\Requirements; use SilverStripe\Control\Controller; use SilverStripe\Assets\Folder; use SilverStripe\Assets\File; class UploadField extends \SilverStripe\AssetAdmin\Forms\UploadField { private static $allowed_actions = [ 'upload', ]; public static $allowedMaxFileSize; /** * Set the timeout (in milliseconds) allowed by dropzone * (defaults to Dropzone default of 30 seconds). * * @var int */ protected $timeout = 30000; public function __construct($name, $title = null, SS_List $items = null) { parent::__construct($name, $title, $items); $this->setAttribute('data-schema', ''); $this->setAttribute('data-state', ''); $this->setAttribute('name', $name); } /** * @param array $properties * @return string */ public function Field($properties = array()) { $field = parent::Field($properties); Requirements::javascript('jamesbolitho/silverstripe-frontenduploadfield: resources/javascript/dropzone.js'); Requirements::css('jamesbolitho/silverstripe-frontenduploadfield: resources/css/dropzone.css'); Requirements::css('jamesbolitho/silverstripe-frontenduploadfield: resources/css/custom.css'); //Check to see if data exists for this field in relation to uploaded files... $data = Controller::curr()->getRequest()->getSession()->get("FormData.{$this->getForm()->Name}.data"); $files = "''"; if(isset($data[$this->name]['Files'])) { $files = $this->uploadedFiles($data[$this->name]['Files']); } Requirements::customScript( " jQuery.noConflict(); (function($) { Dropzone.autoDiscover = false; var name = '" . $this->name . "'; multipleUpload = '". $this->IsMultiUpload ."'; token = '".Controller::curr()->getRequest()->getSession()->get('SecurityID')."', fileurl = '".$this->Link()."/upload', maxFileSize = '".$this->getAllowedMaxFileSize()."', allowedFileTypes = '".$this->getAcceptFileTypes()."', numberAllowed = '". $this->AllowedMaxFileNumber."', uploadedFiles = ".$files."; timeout = {$this->getTimeOut()}; if(multipleUpload == 1){ if(numberAllowed) var maxFilesAllowed = numberAllowed; } else { var maxFilesAllowed = '1'; } var config = {}; config['previewsContainer'] = '.' + name + '-previews-container'; config['params'] = {SecurityID: token}; config['url'] = fileurl; if(timeout) config['timeout'] = timeout; if(maxFileSize) config['maxFilesize'] = maxFileSize; if(maxFilesAllowed) config['maxFiles'] = maxFilesAllowed; if(allowedFileTypes) config['acceptedFiles'] = allowedFileTypes; config['clickable'] = '#' + name + '-dropzone .droparea a'; config['success'] = function(file, response){ addFileFieldID(response[0].id); if (file.previewElement) { return file.previewElement.classList.add('dz-success'); } }; window[name+'Dropzone'] = new Dropzone('#' + name + '-dropzone .droparea', config); //Show files that have already been uploaded as per the form session data i.e. during server side form error. if(uploadedFiles) { $.each(uploadedFiles, function(index, value) { console.log(value.ID) addFileFieldID(value.ID); var File = { 'name': value.Name, 'size': value.Size}; window[name+'Dropzone'].emit('addedfile', File); window[name+'Dropzone'].emit('thumbnail', File, value.URL); window[name+'Dropzone'].createThumbnailFromUrl(value.Name, value.URL); window[name+'Dropzone'].emit('complete', File); var existingFileCount = 1; // The number of files already uploaded window[name+'Dropzone'].options.maxFiles = window[name+'Dropzone'].options.maxFiles - existingFileCount; }); } function addFileFieldID(ID){ $('.dropzone .placeholder').append('<input type=\"hidden\" name=\"' + name + '[Files][]\" value=\"' + ID + '\" />'); } }(jQuery)); " ); return $field; } public function Type() { return "frontenduploadfield uploadfield"; } public function upload(HTTPRequest $request) { if ($this->isDisabled() || $this->isReadonly()) { return $this->httpError(403); } // CSRF check $token = $this->getForm()->getSecurityToken(); if (!$token->checkRequest($request)) { return $this->httpError(400); } $tmpFile = $request->postVar('file'); /** * @var File $file */ $file = $this->saveTemporaryFile($tmpFile, $error); // Prepare result if ($error) { $result = [ 'error' => $error, ]; $this->getUpload()->clearErrors(); return (new HTTPResponse(json_encode($result), 400)) ->addHeader('Content-Type', 'application/json'); } // Return success response $result = [ AssetAdmin::singleton()->getObjectFromData($file) ]; // Don't discard pre-generated client side canvas thumbnail if ($result[0]['category'] === 'image') { unset($result[0]['thumbnail']); } $this->getUpload()->clearErrors(); return (new HTTPResponse(json_encode($result))) ->addHeader('Content-Type', 'application/json'); } /* If files have already been uploaded we need to specify which files have been uploaded to ensure that people can not upload more than they are supposed to if limits are set */ public function uploadedFiles($ids = []) { if(empty($ids)) { return false; } $files = []; foreach($ids as $id) { if($file = File::get()->byID((int) $id)) { $size = $file->ini2bytes($file->getSize()); $files[] = ["ID" => $file->ID,"Name" => $file->Name, 'URL' => $file->getAbsoluteURL(), 'Size' => $size]; } } return json_encode($files); } public function getAttributes() { $attributes = parent::getAttributes(); unset($attributes['type']); return $attributes; } /** * Sets the file size allowed for this field * * @param $count * @return $this */ public function getAllowedMaxFileSize() { $size = $this->getValidator()->getAllowedMaxFileSize(); if($size) { $sizeMB = $size / 1024 / 1024; return $sizeMB; } } /** * Returns a list of file extensions (and corresponding mime types) that will be accepted * * @return array */ protected function getAcceptFileTypes() { $extensions = $this->getValidator()->getAllowedExtensions(); if (!$extensions) { return []; } $extentionString = ""; $i = 0; foreach ($extensions as $extension) { if ($i == 0) { $extentionString .= ".{$extension}"; } else { $extentionString .= ", .{$extension}"; } $i++; } return $extentionString; } /** * Get set the timeout allowed by dropzone (defaults to null/Dropzone default) * * @return int|null */ public function getTimeout() { return $this->timeout; } /** * Set set the timeout allowed by dropzone (defaults to null/Dropzone default) * * @param int $timout Set the timeout in milliseconds * * @return self */ public function setTimeout(int $timeout) { $this->timeout = $timeout; return $this; } } |