openrat-cms

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

commit 7e71b3a27e6fb9e01e8e3c85a1a3a20d7e6455dd
parent 23643712d2102514d5488ace5a7087193080c31a
Author: Jan Dankert <devnull@localhost>
Date:   Wed, 30 Jul 2014 01:25:39 +0200

Drag and Drop von Dateiobjekten: Verschieben funktioniert jetzt.

Diffstat:
action/FolderAction.class.php | 6+++---
action/ObjectAction.class.php | 171++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
init.php | 6+++---
themes/default/js/openrat.js | 6+++---
themes/default/templates/object/copy.tpl.src.xml | 20++++++++++++++++++++
util/ProjectTree.class.php | 4++--
6 files changed, 201 insertions(+), 12 deletions(-)

diff --git a/action/FolderAction.class.php b/action/FolderAction.class.php @@ -1239,9 +1239,9 @@ class FolderAction extends ObjectAction $this->setTemplateVar('rootfoldername',$rootFolder->name); } - - - + + + public function rootView() { $rootFolder = new Folder( Folder::getRootFolderId() ); diff --git a/action/ObjectAction.class.php b/action/ObjectAction.class.php @@ -30,6 +30,175 @@ class ObjectAction extends Action private $objectid; + public function copyView() + { + $this->actionName = 'object'; + global $conf_php; + + $sourceObject = new Object( $this->getRequestId()); + $sourceObject->load(); + + $targetFolder = new Object( $this->getRequestVar('targetFolderId',OR_FILTER_NUMBER)); + $targetFolder->load(); + + $this->setTemplateVar('source' ,$sourceObject->getProperties() ); + $this->setTemplateVar('sourceId',$sourceObject->objectid ); + $this->setTemplateVar('target' ,$targetFolder->getProperties() ); + $this->setTemplateVar('targetId',$targetFolder->objectid ); + $this->setTemplateVar('types' ,array('move'=>'move','moveandlink'=>'moveandlink','copy'=>'copy','link'=>'link') ); + + if ( ! $targetFolder->hasRight(ACL_WRITE) ) + { + $this->addNotice('folder', $targetFolder->name, 'NOT_WRITABLE',OR_NOTICE_ERROR); + } + } + + + /** + * Ein Fileobjekt wird in einen neuen Ordner kopiert oder verschoben. + */ + public function copyPost() + { + $type = $this->getRequestVar('type'); + $targetObjectId = $this->getRequestVar('targetid',OR_FILTER_NUMBER); + $sourceObjectId = $this->getRequestVar('sourceid',OR_FILTER_NUMBER); + + $sourceObject = new Object( $sourceObjectId ); + $sourceObject->load(); + + $targetFolder = new Object( $targetObjectId ); + $targetFolder->load(); + + // Prüfen, ob Schreibrechte im Zielordner bestehen. + if ( ! $targetFolder->hasRight(ACL_WRITE) ) + { + $this->addNotice('folder', $targetFolder->name, 'NOT_WRITABLE',OR_NOTICE_ERROR); + return; + } + + switch( $type ) + { + case 'move': + + if ( $sourceObject->isFolder ) + { + $f = new Folder( $sourceObjectId ); + $allsubfolders = $f->getAllSubFolderIds(); + + // Plausibilisierungsprüfung: + // + // Wenn + // - Das Zielverzeichnis sich nicht in einem Unterverzeichnis des zu verschiebenen Ordners liegt + // und + // - Das Zielverzeichnis nicht der zu verschiebene Ordner ist + // dann verschieben + if ( in_array($targetObjectId,$allsubfolders) || $sourceObjectId == $targetObjectId ) + { + $this->addNotice('folder',$sourceObject->name,'ERROR',OR_NOTICE_ERROR); + return; + } + } + + // TODO: + // Beim Verschieben und Kopieren muss im Zielordner die Berechtigung + // zum Erstellen von Ordner, Dateien oder Seiten vorhanden sein. + $sourceObject->setParentId( $targetObjectId ); + $this->addNotice($sourceObject->type, $sourceObject->name, 'moved'); + break; + + case 'moveandlink': + + $oldParentId = $sourceObject->parentid; + + $sourceObject->setParentId( $targetObjectId ); + $this->addNotice($sourceObject->type, $sourceObject->name, 'moved'); + + $link = new Link(); + $link->parentid = $oldParentId; + $link->name = lang('LINK_TO').' '.$sourceObject->name; + $link->filename = $sourceObject->filename; + $link->linkedObjectId = $sourceObjectId; + $link->add(); + $this->addNotice('link', $link->name, 'added'); + + break; + + case 'copy': + + switch( $sourceObject->getType() ) + { + case 'folder': + // Ordner zur Zeit nicht kopieren + // Funktion waere zu verwirrend + $this->addNotice($sourceObject->getType(),$sourceObject->name,'CANNOT_COPY_FOLDER','error'); + break; + + case 'file': + $f = new File( $sourceObjectId ); + $f->load(); + $f->filename = ''; + $f->name = lang('COPY_OF').' '.$f->name; + $f->parentid = $targetObjectId; + $f->add(); + $f->copyValueFromFile( $id ); + + $this->addNotice($sourceObject->getType(),$sourceObject->name,'COPIED','ok'); + break; + + case 'page': + $p = new Page( $sourceObjectId ); + $p->load(); + $p->filename = ''; + $p->name = lang('COPY_OF').' '.$p->name; + $p->parentid = $targetObjectId; + $p->add(); + $p->copyValuesFromPage( $id ); + $this->addNotice($sourceObject->getType(),$sourceObject->name,'COPIED','ok'); + break; + + case 'link': + $l = new Link( $sourceObjectId ); + $l->load(); + $l->filename = ''; + $l->name = lang('COPY_OF').' '.$l->name; + $l->parentid = $targetObjectId; + $l->add(); + $this->addNotice($sourceObject->getType(),$sourceObject->name,'COPIED','ok'); + break; + + default: + Http::serverError('fatal: unknown type while deleting'); + } + break; + + case 'link': + + // Beim Verkn�pfen muss im Zielordner die Berechtigung zum Erstellen + // von Verkn�pfungen vorhanden sein. + if ( ! $targetFolder->hasRight(ACL_CREATE_LINK) ) + { + $this->addNotice('folder', $targetFolder->name, 'NOT_WRITABLE',OR_NOTICE_ERROR); + return; + } + + $link = new Link(); + $link->parentid = $targetObjectId; + $link->name = lang('LINK_TO').' '.$sourceObject->name; + $link->filename = $sourceObject->filename; + $link->linkedObjectId = $sourceObjectId; + $link->add(); + $this->addNotice('link', $link->name, 'added'); + // OK + break; + + default: + Http::serverError('Unknown type for copying'); + break; + } + + $targetFolder->setTimestamp(); + + } /** * ACL zu einem Objekt setzen @@ -288,7 +457,7 @@ class ObjectAction extends Action $o = new Object( $this->getRequestId() ); if ( !$o->hasRight( ACL_GRANT ) ) - die('ehm?'); // Da wollte uns wohl einer vereimern. + Http::notAuthorized('no grant rights'); // Da wollte uns wohl einer vereimern. $acl->delete(); // Weg mit der ACL diff --git a/init.php b/init.php @@ -49,9 +49,9 @@ define('OR_CONTROLLER_FILE' ,defined('OR_EXT_CONTROLLER_FILE')?OR_EXT_CONTROLL define('START_TIME' ,time() ); define('REQUEST_ID' ,'req'.time().rand() ); -define('SECURITY_GUEST',1); -define('SECURITY_USER' ,2); -define('SECURITY_ADMIN',3); +define('SECURITY_GUEST',1); // Jeder (auch nicht angemeldete) dürfen diese Aktion ausführen +define('SECURITY_USER' ,2); // Angemeldete Benutzer dürfen diese Aktion ausführen +define('SECURITY_ADMIN',3); // Nur Administratoren dürfen diese Aktion ausführen define('REQ_PARAM_TOKEN' ,'token' ); define('REQ_PARAM_ACTION' ,'action' ); diff --git a/themes/default/js/openrat.js b/themes/default/js/openrat.js @@ -609,7 +609,7 @@ function registerViewEvents( viewEl ) var droppedOn = $(this).parent(); //alert('Moving '+$(dropped).attr('data-id')+' to folder '+$(droppedOn).attr('data-id') ); - startDialog($(this).text(),'folder','edit',$(droppedOn).attr('data-id'),{'action':'folder','subaction':'edit','id':$(droppedOn).attr('data-id'),'source_id':$(dropped).attr('data-id')}); + startDialog($(this).text(),$(dropped).attr('data-type'),'copy',$(droppedOn).attr('data-id'),{'action':$(dropped).attr('data-type'),'subaction':'copy','id':$(dropped).attr('data-id'),'targetFolderId':$(droppedOn).attr('data-id')}); /* if ( $(dropped).closest('div.panel').attr('id') == $(droppedOn).closest('div.panel').attr('id') ) $(dropped).css({top: 0,left: 0}); // Nicht auf das eigene Fenster fallen lassen. @@ -799,8 +799,8 @@ function startDialog( name,action,method,id,params ) action = $('#panel-content').find('li.active').data('action'); if (id==null) id = $('#panel-content').find('li.active').data('id' ); - if (params==null) - params = {}; +// if (params==null) +// params = {}; $('div#filler').fadeTo(500,0.5); $('div#dialog').html('<div class="header"><ul class="views"><li class="action active"><img class="icon" title="" src="./themes/default/images/icon/'+method+'.png" /><div class="tabname" style="width:100px;">'+name+'</div></li></ul></div><div class="content" />'); diff --git a/themes/default/templates/object/copy.tpl.src.xml b/themes/default/templates/object/copy.tpl.src.xml @@ -0,0 +1,19 @@ +<output xmlns="http://www.openrat.de/template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.openrat.de/template ../template.xsd"> + <form> + <part class="line"> + <hidden name="sourceid" default="var:sourceId" /> + <text text="arrayvar:source:name" /> + </part> + + <part class="line"> + <hidden name="targetid" default="var:targetId" /> + <text text="arrayvar:target:name" /> + </part> + + <part class="line"> + <selectbox name="type" list="types" /> + </part> + </form> + +</output>+ \ No newline at end of file diff --git a/util/ProjectTree.class.php b/util/ProjectTree.class.php @@ -40,7 +40,7 @@ class ProjectTree extends AbstractTree - function pageelements( $id ) + function page( $id ) { $page = new Page( $id ); $page->load(); @@ -214,7 +214,7 @@ class ProjectTree extends AbstractTree // Nur wenn die Seite beschreibbar ist, werden die // Elemente im Baum angezeigt if ( $o->hasRight( ACL_WRITE ) ) - $treeElement->type='pageelements'; + $treeElement->type='page'; } if ( $o->isFile )