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:
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 )