openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit f75b97273b96f4c9f5d28a287fb9224b9140d02b
parent 2c4a2254b167bd30a462b49a96e95f4373730781
Author: Jan Dankert <devnull@localhost>
Date:   Fri, 11 Jan 2019 22:28:11 +0100

Fix: Uploads von Bildern müssen auch als Bild gespeichert werden.

Diffstat:
modules/cms-core/action/FolderAction.class.php | 60++++++++++++++++++++----------------------------------------
modules/cms-ui/themes/default/html/views/folder/order.php | 2+-
modules/cms-ui/themes/default/html/views/folder/order.tpl.src.xml | 2+-
modules/cms-ui/themes/default/production/combined.min.js | 2+-
modules/template-engine/components/html/upload/upload.js | 2+-
modules/template-engine/components/html/upload/upload.min.js | 4++--
modules/util/Upload.class.php | 40++++++++++++++++++++++++++++++++--------
7 files changed, 58 insertions(+), 54 deletions(-)

diff --git a/modules/cms-core/action/FolderAction.class.php b/modules/cms-core/action/FolderAction.class.php @@ -196,34 +196,27 @@ class FolderAction extends ObjectAction { $upload = new Upload(); - $upload->processUpload(); - if ( $upload->isValid() ) - { - $image->desc = $description; - $image->filename = BaseObject::urlify( $upload->filename ); - $image->name = !empty($name)?$name:$upload->filename; - $image->extension = $upload->extension; - $image->size = $upload->size; - $image->parentid = $this->folder->objectid; - $image->projectid = $this->folder->projectid; - - $image->value = $upload->value; - } - else - { - if ( $this->hasRequestVar('name') ) - { - $image->filename = BaseObject::urlify( $name ); - $image->parentid = $this->folder->objectid; - } - else - { - $this->addValidationError('file','COMMON_VALIDATION_ERROR',array(),$upload->error); - $this->callSubAction('createfile'); - return; - } + try + { + $upload->processUpload(); + } + catch( \Exception $e ) + { + // technical error. + throw new \RuntimeException('Exception while processing the upload: '.$e->getMessage(), 0, $e); - } + //throw new \ValidationException( $upload->parameterName ); + } + + $image->desc = $description; + $image->filename = BaseObject::urlify( $upload->filename ); + $image->name = !empty($name)?$name:$upload->filename; + $image->extension = $upload->extension; + $image->size = $upload->size; + $image->parentid = $this->folder->objectid; + $image->projectid = $this->folder->projectid; + + $image->value = $upload->value; } $image->add(); // Datei hinzufuegen @@ -1121,19 +1114,6 @@ class FolderAction extends ObjectAction $list[$id]['icon'] = $o->getType(); - if ( $o->getType() == 'file' ) - { - $file = new File( $id ); - $file->load(); - $list[$id]['size'] = $file->size; - $list[$id]['desc'] .= ' - '.intval($file->size/1000).'kB'; - - if ( substr($file->mimeType(),0,6) == 'image/' ) - $list[$id]['icon'] = 'image'; -// if ( substr($file->mimeType(),0,5) == 'text/' ) -// $list[$id]['icon'] = 'text'; - } - $list[$id]['url' ] = Html::url($o->getType(),'',$id); $list[$id]['date'] = date( lang('DATE_FORMAT'),$o->lastchangeDate ); $list[$id]['user'] = $o->lastchangeUser; diff --git a/modules/cms-ui/themes/default/html/views/folder/order.php b/modules/cms-ui/themes/default/html/views/folder/order.php @@ -33,7 +33,7 @@ <td> <span class="sort-value"><?php echo nl2br(encodeHtml(htmlentities($icon))); ?></span> - <img src="./modules/cms-ui/themes/default/images/icon_<?php echo $icon ?>.png" /> + <i class="image-icon image-icon--action-<?php echo $icon ?>"></i> </td> <td> diff --git a/modules/cms-ui/themes/default/html/views/folder/order.tpl.src.xml b/modules/cms-ui/themes/default/html/views/folder/order.tpl.src.xml @@ -27,7 +27,7 @@ </column> <column> <text class="sort-value" value="var:icon" /> - <image type="var:icon"></image> + <image action="var:icon"></image> </column> <column> <text var="name"></text> diff --git a/modules/cms-ui/themes/default/production/combined.min.js b/modules/cms-ui/themes/default/production/combined.min.js @@ -11012,7 +11012,7 @@ jQuery.trumbowyg={langs:{en:{viewHTML:"View HTML",undo:"Undo",redo:"Redo",format /* ./modules//template-engine/components/html/form/form.min.js */;$(document).on('orViewLoaded',function(e,t){if($('div.panel form input[type=password]').length>0&&$('#uname').attr('value')!=''){$('div.panel form input[name=login_name] ').attr('value',$('#uname').attr('value'));$('div.panel form input[name=login_password]').attr('value',$('#upassword').attr('value'))};$(e.target).find('form[data-autosave="true"] input[type="checkbox"]').click(function(){$(this).closest('form').submit()});$(e.target).find('input.submit.cancel').click(function(){});$(e.target).find('form').submit(function(e){if($(this).data('target')=='view'){formSubmit($(this));e.preventDefault()}})});function formSubmit(e){var r=$('<div class="notice info"><div class="text loader"></div></div>');$('#noticebar').prepend(r);$(r).show();$(e).find('.error').removeClass('error');var a=$(e).serializeArray(),t={};$(a).each(function(e,r){t[r.name]=r.value});var s=$(e).attr('method').toUpperCase();if(s=='GET'){Workbench.loadViewIntoElement($(e).parent('.view'),t.action,t.subaction,t.id,t)} else{var o='./api/';$(e).closest('div.content').addClass('loader');o+='?output=json';a['output']='json';if($(e).data('async')||$(e).data('async')=='true'){$('#dialog > .view').html('');$('#dialog').removeClass('is-open').addClass('is-closed')};$.ajax({'type':'POST',url:o,data:a,success:function(t,a,o){$(e).closest('div.content').removeClass('loader');$(r).remove();doResponse(t,a,e)},error:function(t,a,o){$(e).closest('div.content').removeClass('loader');$(r).remove();try{let error=jQuery.parseJSON(t.responseText);notify('','','error',error.error,[error.description])}catch(s){let msg=t.responseText;notify('','','error','Server Error',[msg])}}});$(e).fadeIn()}};function doResponse(e,t,r){if(t!='success'){alert('Server error: '+t);return};$.each(e['notices'],function(t,e){if($(r).data('async')=='true')notifyBrowser(e.text);notify(e.type,e.name,e.status,e.text,e.log);if(e.status=='ok'){if($(r).data('async')!='true'){$('#dialog > .view').html('').hide();$('#dialog').removeClass('is-open').addClass('is-closed');$(r).closest('div.panel').find('div.header ul.views li.action.active').removeClass('dirty')}} else{}});$.each(e['errors'],function(e,t){$('input[name='+t+']').addClass('error').parent().addClass('error').parents('fieldset').addClass('show').addClass('open')});if(!e.control){};if(e.control.redirect)window.location.href=e.control.redirect}; -/* ./modules//template-engine/components/html/upload/upload.min.js */;$(document).on('orViewLoaded',function(e,n){var a=$(e.target).find('form'),o=$(e.target).find('div.or-dropzone-upload > div.input');o.on('dragenter',function(e){e.stopPropagation();e.preventDefault();$(this).css('border','1px dotted gray')});o.on('dragover',function(e){e.stopPropagation();e.preventDefault()});o.on('drop',function(e){$(this).css('border','1px dotted red');e.preventDefault();var n=e.originalEvent.dataTransfer.files;handleFileUpload(a,n)});$(e.target).find('input[type=file]').change(function(){var e=$(this).prop('files');handleFileUpload(a,e)})});function handleFileUpload(e,o){for(var t=0,r;r=o[t];t++){var n=new FormData();n.append('file',r);n.append('action','folder');n.append('subaction','createfile');n.append('output','json');n.append('token',$(e).find('input[name=token]').val());n.append('id',$(e).find('input[name=id]').val());var a=$('<div class="notice info"><div class="text loader"></div></div>');$('#noticebar').prepend(a);$(a).show();$.ajax({'type':'POST',url:'./api/',cache:!1,contentType:!1,processData:!1,data:n,success:function(n,o,t){$(a).remove();doResponse(n,o,e)},error:function(n,o,i){$(e).closest('div.content').removeClass('loader');$(a).remove();var r;try{var t=jQuery.parseJSON(n.responseText);r=t.error+'/'+t.description+': '+t.reason}catch(d){r=n.responseText};notify('error',r)}})}}; +/* ./modules//template-engine/components/html/upload/upload.min.js */;$(document).on('orViewLoaded',function(e,n){var a=$(e.target).find('form'),o=$(e.target).find('div.or-dropzone-upload > div.input');o.on('dragenter',function(e){e.stopPropagation();e.preventDefault();$(this).css('border','1px dotted gray')});o.on('dragover',function(e){e.stopPropagation();e.preventDefault()});o.on('drop',function(e){$(this).css('border','1px dotted red');e.preventDefault();var n=e.originalEvent.dataTransfer.files;handleFileUpload(a,n)});$(e.target).find('input[type=file]').change(function(){var e=$(this).prop('files');handleFileUpload(a,e)})});function handleFileUpload(e,o){for(var t=0,r;r=o[t];t++){var n=new FormData();n.append('file',r);n.append('action','folder');n.append('subaction',$(e).data('method'));n.append('output','json');n.append('token',$(e).find('input[name=token]').val());n.append('id',$(e).find('input[name=id]').val());var a=$('<div class="notice info"><div class="text loader"></div></div>');$('#noticebar').prepend(a);$(a).show();$.ajax({'type':'POST',url:'./api/',cache:!1,contentType:!1,processData:!1,data:n,success:function(n,o,t){$(a).remove();doResponse(n,o,e)},error:function(n,o,d){$(e).closest('div.content').removeClass('loader');$(a).remove();var r;try{var t=jQuery.parseJSON(n.responseText);r=t.error+'/'+t.description+': '+t.reason}catch(i){r=n.responseText};notify('error',r)}})}}; /* ./modules//template-engine/components/html/tree/tree.min.js */;$(document).on('orViewLoaded',function(o,n){}); /* ./modules/cms-ui/themes/default/script/openrat.min.js */;var OR_THEMES_EXT_DIR='modules/cms-ui/themes/';$(function(){$('html').removeClass('nojs');$('.initial-hidden').removeClass('initial-hidden');registerHeaderEvents();registerWorkbenchEvents();$('.view').each(function(e){afterViewLoaded(this)});window.onpopstate=function(e){Navigator.navigateTo(e.state)};initActualHistoryState();Workbench.initialize();loadTree();$(document).keyup(function(e){if(e.keyCode==27){$('#dialog .view').fadeOut('fast').html('');$('#dialog').removeClass('is-open').addClass('is-closed')}});$('.keystroke').each(function(){let keystrokeElement=$(this);let keystroke=keystrokeElement.text();if(keystroke.length==0)return;let keyaction=function(){keystrokeElement.click()};$(document).bind('keydown',keystroke,keyaction)});$('#noticebar .notice .image-icon--menu-close').click(function(){$(this).closest('.notice').fadeOut('fast',function(){$(this).remove()})});$('#noticebar .notice').each(function(){let noticeToClose=this;setTimeout(function(){$(noticeToClose).fadeOut('slow',function(){$(this).remove()})},30*1000)});registerOpenClose($('section.toggle-open-close'));$('section.toggle-open-close .on-click-open-close').click(function(){var t=$(this).closest('section');if(t.hasClass('disabled'))return;var e=t.find('div.view-loader');if(e.children().length==0)Workbench.loadNewActionIntoElement(e)})});function initActualHistoryState(){var e={};e.name=window.document.title;var t=new URLSearchParams(window.location.search);if(t.has('action')){e.action=t.get('action');e.id=t.get('id');e.name=window.document.title;e.data={};var t=Array.from(t.entries());for(var i in t){e.data[t[i][0]]=t[i][1]};Navigator.toActualHistory(e);filterMenus(e.action,e.id,e.data)}};var Navigator=new function(){'use strict';this.navigateTo=function(e){Workbench.loadNewActionState(e)};this.navigateToNew=function(e){Workbench.loadNewActionState(e);window.history.pushState(e,e.name,createUrl(e.action,null,e.id,e.data,!1))};this.navigateToNewAction=function(e,t,i,n){var o={action:e,method:t,id:i,data:n};this.navigateToNew(o)};this.toActualHistory=function(e){window.history.replaceState(e,e.name,createUrl(e.action,null,e.id,e.data,!1))}},Workbench=new function(){'use strict';this.initialize=function(){this.initializePingTimer()};this.initializePingTimer=function(){var e=function(){$.ajax(createUrl('title','ping',0))},t=5;window.setInterval(e,t*60*1000)};this.loadNewActionState=function(e){Workbench.loadNewAction(e.action,e.id,e.data)};this.loadNewAction=function(e,t,i){$('#editor').attr('data-action',e);$('#editor').attr('data-id',t);$('#editor').attr('data-extra',JSON.stringify(i));$('#workbench section.closed .view-loader').empty();$('#workbench section.open .view-loader').each(function(e){var t=$(this);Workbench.loadNewActionIntoElement(t)});filterMenus(e,t,i)};this.loadNewActionIntoElement=function(e){var t=$('#editor').attr('data-action'),i=$('#editor').attr('data-id'),n=$('#editor').attr('data-extra'),o=e.data('method');Workbench.loadViewIntoElement(e,t,o,i,n)};this.loadViewIntoElement=function(e,t,i,n,o){var a=createUrl(t,i,n,o,!0);e.empty().fadeTo(1,0.7).addClass('loader').html('').load(a,function(n,o,a){e.fadeTo(350,1);$(e).removeClass('loader');if(o=='error'){$(e).html('');notify('','','error','Server Error',['Server Error while requesting '+t+' -> '+i,n]);return};afterViewLoaded(e)})}};function registerWorkbenchEvents(){$('div.header').dblclick(function(){fullscreen(this)});$('div#filler').click(function(){if($('div#dialog').hasClass('modal')){} else{$('div#dialog').removeClass('is-open').addClass('is-closed');$('div#dialog > .view').html('')}})};function loadView(e,t,i,n,o){Navigator.navigateToNewAction(t,i,n,o)};function afterViewLoaded(e){var t=$(e).closest('section');t.toggleClass('is-empty',$(e).is(':empty'));$(e).trigger('orViewLoaded');$(e).closest('div.panel').find('div.header div.dropdown div.entry.perview').remove();$(e).find('.toggle-nav-open-close').click(function(){$('nav').toggleClass('open')});$(e).find('.toggle-nav-small').click(function(){$('nav').toggleClass('small')});$(e).find('div.headermenu > a').each(function(e,t){});$(e).find('div.header > a.back').each(function(t,i){$(i).removeClass('button').wrap('<div class="entry perview" />').parent().appendTo($(e).closest('div.panel').find('div.header div.dropdown').first())});$(e).find('div.selector.tree').each(function(){var e=this;$(this).orTree({type:'project',selectable:$(e).attr('data-types').split(','),id:$(e).attr('data-init-folderid'),onSelect:function(t,i,n){var o=$(e).parent();$(o).find('input[type=text]').attr('value',t);$(o).find('input[type=hidden]').attr('value',n)}})});registerDragAndDrop(e);$(e).find('input').change(function(){$(this).parent('div.view').addClass('dirty')});$(e).find('.or-theme-chooser').change(function(){setUserStyle(this.value)})};function registerDragAndDrop(e){registerDraggable(e);registerDroppable(e)};function registerDraggable(e){$(e).find('.or-draggable').draggable({helper:'clone',opacity:0.7,zIndex:2,distance:10,cursor:'move',revert:'false'})};function registerTreeBranchEvents(e){registerDraggable(e)};function registerDroppable(e){$(e).find('.or-droppable').droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;$(this).find('.or-selector-link-value').val(dropped.data('id'));$(this).find('.or-selector-link-name').val(dropped.data('id'))}})};function registerHeaderEvents(){$('body').click(function(){$('.toolbar-icon.menu').parents('.or-menu').removeClass('open')});$('#title .toolbar-icon.menu').click(function(e){e.stopPropagation();$(this).parents('.or-menu').toggleClass('open')});$('#title .toolbar-icon.menu').mouseover(function(){$(this).parents('.or-menu').find('.toolbar-icon.menu').removeClass('open');$(this).addClass('open')});$('#title div.search input').orSearch({dropdown:'#title div.search div.dropdown'})};function fullscreen(e){$(e).closest('div.panel').fadeOut('fast',function(){$(this).toggleClass('fullscreen').fadeIn('fast')})};function loadTree(){$('.or-navtree .or-navtree-node').orTree()};function submitUrl(e,t){postUrl(t,e)};function postUrl(e,t){e+='&output=json';$.ajax({'type':'POST',url:e,data:{},success:function(e,i,n){$('div.panel div.status div.loader').html('&nbsp;');doResponse(e,i,t)}})};function startDialog(e,t,i,n,o){if(!t)t=$('#editor').attr('data-action');n=$('#editor').attr('data-id');$('div#dialog > .view').html('<div class="header"><img class="icon" title="" src="./themes/default/images/icon/'+i+'.png" />'+e+'</div>');$('div#dialog > .view').data('id',n);$('div#dialog').removeClass('is-closed').addClass('is-open');Workbench.loadViewIntoElement($('div#dialog > .view'),t,i,n,o)};function modalView(e,t){alert('modalView() called');return};function setTitle(e){if(e)$('head > title').text(e+' - '+$('head > title').data('default'));else $('head > title').text($('head > title').data('default'))};function openNewAction(e,t,i,n){$('nav').removeClass('open');setTitle(e);setNewAction(t,i,n)};function filterMenus(e,t,i){$('div.clickable').addClass('active');$('div.clickable.filtered').removeClass('active').addClass('inactive');$('div.clickable.filtered.on-action-'+e).addClass('active').removeClass('inactive');$('div.clickable.filtered a').attr('data-action',e);$('div.clickable.filtered a').attr('data-id',t);$('div.clickable.filtered a').attr('data-extra',JSON.stringify(i))};function setNewAction(e,t,i){Navigator.navigateToNewAction(e,'edit',t,i)};function setNewId(e){};function notifyBrowser(e){if(!('Notification' in window)){return} diff --git a/modules/template-engine/components/html/upload/upload.js b/modules/template-engine/components/html/upload/upload.js @@ -48,7 +48,7 @@ function handleFileUpload(form,files) var form_data = new FormData(); form_data.append('file' , f); form_data.append('action' ,'folder'); - form_data.append('subaction','createfile'); + form_data.append('subaction',$(form).data('method')); form_data.append('output' ,'json'); form_data.append('token' ,$(form).find('input[name=token]').val() ); form_data.append('id' ,$(form).find('input[name=id]' ).val() ); diff --git a/modules/template-engine/components/html/upload/upload.min.js b/modules/template-engine/components/html/upload/upload.min.js @@ -1 +1 @@ -;$(document).on('orViewLoaded',function(e,n){var a=$(e.target).find('form'),o=$(e.target).find('div.or-dropzone-upload > div.input');o.on('dragenter',function(e){e.stopPropagation();e.preventDefault();$(this).css('border','1px dotted gray')});o.on('dragover',function(e){e.stopPropagation();e.preventDefault()});o.on('drop',function(e){$(this).css('border','1px dotted red');e.preventDefault();var n=e.originalEvent.dataTransfer.files;handleFileUpload(a,n)});$(e.target).find('input[type=file]').change(function(){var e=$(this).prop('files');handleFileUpload(a,e)})});function handleFileUpload(e,o){for(var t=0,r;r=o[t];t++){var n=new FormData();n.append('file',r);n.append('action','folder');n.append('subaction','createfile');n.append('output','json');n.append('token',$(e).find('input[name=token]').val());n.append('id',$(e).find('input[name=id]').val());var a=$('<div class="notice info"><div class="text loader"></div></div>');$('#noticebar').prepend(a);$(a).show();$.ajax({'type':'POST',url:'./api/',cache:!1,contentType:!1,processData:!1,data:n,success:function(n,o,t){$(a).remove();doResponse(n,o,e)},error:function(n,o,i){$(e).closest('div.content').removeClass('loader');$(a).remove();var r;try{var t=jQuery.parseJSON(n.responseText);r=t.error+'/'+t.description+': '+t.reason}catch(d){r=n.responseText};notify('error',r)}})}};- \ No newline at end of file +;$(document).on('orViewLoaded',function(e,n){var a=$(e.target).find('form'),o=$(e.target).find('div.or-dropzone-upload > div.input');o.on('dragenter',function(e){e.stopPropagation();e.preventDefault();$(this).css('border','1px dotted gray')});o.on('dragover',function(e){e.stopPropagation();e.preventDefault()});o.on('drop',function(e){$(this).css('border','1px dotted red');e.preventDefault();var n=e.originalEvent.dataTransfer.files;handleFileUpload(a,n)});$(e.target).find('input[type=file]').change(function(){var e=$(this).prop('files');handleFileUpload(a,e)})});function handleFileUpload(e,o){for(var t=0,r;r=o[t];t++){var n=new FormData();n.append('file',r);n.append('action','folder');n.append('subaction',$(e).data('method'));n.append('output','json');n.append('token',$(e).find('input[name=token]').val());n.append('id',$(e).find('input[name=id]').val());var a=$('<div class="notice info"><div class="text loader"></div></div>');$('#noticebar').prepend(a);$(a).show();$.ajax({'type':'POST',url:'./api/',cache:!1,contentType:!1,processData:!1,data:n,success:function(n,o,t){$(a).remove();doResponse(n,o,e)},error:function(n,o,d){$(e).closest('div.content').removeClass('loader');$(a).remove();var r;try{var t=jQuery.parseJSON(n.responseText);r=t.error+'/'+t.description+': '+t.reason}catch(i){r=n.responseText};notify('error',r)}})}};+ \ No newline at end of file diff --git a/modules/util/Upload.class.php b/modules/util/Upload.class.php @@ -29,6 +29,7 @@ class Upload public $extension; public $value; public $size; + public $mimeType; public $parameterName; @@ -37,7 +38,6 @@ class Upload /** * Bearbeitet den Upload einer Datei.<br> - * Bei der Objekterzeugung wird die Datei bereits geladen.<br> * * @return Upload */ @@ -46,25 +46,49 @@ class Upload $this->parameterName = $name; } + /** + * Provision of an uploaded file. + */ public function processUpload() { $name = $this->parameterName; - if ( !isset($_FILES[$name]) || - !isset($_FILES[$name]['tmp_name']) || - !is_file($_FILES[$name]['tmp_name']) ) + if ( !isset($_FILES[$name]) || !is_array($_FILES[$name]) ) + throw new InvalidArgumentException('No file received under the key "'.$name.'"' ); + + $uFile = $_FILES[$name]; + + if ( !isset($uFile['tmp_name']) ) + throw new InvalidArgumentException('No temporary filename found for uploaded file key "'.$name.'"' ); + + if ( !is_file($uFile['tmp_name']) ) + throw new InvalidArgumentException('Not a file: '.$uFile['tmp_name'] ); + + switch( $uFile['error'] ) { - throw new InvalidArgumentException('No file received under the key '.$name ); + case UPLOAD_ERR_OK: + break; + + case UPLOAD_ERR_INI_SIZE: + throw new InvalidArgumentException('Uploaded file is bigger than allowed in server configuration'); + + case UPLOAD_ERR_FORM_SIZE: + throw new InvalidArgumentException('Uploaded file is bigger than allowed in form'); + + default: + throw new InvalidArgumentException('Error code while uploading file: '.$uFile['error'] ); } - $this->size = filesize($_FILES[$name]['tmp_name']); + $this->mimeType = $uFile['type']; + + $this->size = filesize($uFile['tmp_name']); - $fh = fopen( $_FILES[$name]['tmp_name'],'r' ); + $fh = fopen( $uFile['tmp_name'],'r' ); $this->value = fread($fh,$this->size); fclose( $fh ); - $this->filename = $_FILES[$name]['name']; + $this->filename = $uFile['name']; $this->extension = ''; $p = strrpos( $this->filename,'.' ); // Letzten Punkt suchen