File modules/cms/action/object/ObjectCopyAction.class.php

Last commit: Sun Dec 5 20:33:24 2021 +0100	dankert	Cleanup: Removed unusable properties from class 'Value' and 'BaseObject'.
1 <?php 2 namespace cms\action\object; 3 use cms\action\Action; 4 use cms\action\Method; 5 use cms\action\ObjectAction; 6 use cms\action\RequestParams; 7 use cms\model\Name; 8 use cms\model\Permission; 9 use cms\model\BaseObject; 10 use cms\model\File; 11 use cms\model\Folder; 12 use cms\model\Link; 13 use cms\model\Page; 14 use language\Messages; 15 16 17 class ObjectCopyAction extends ObjectAction implements Method { 18 public function getRequiredPermission() 19 { 20 return Permission::ACL_WRITE; 21 } 22 23 public function view() { 24 $sourceObject = new BaseObject( $this->request->getId()); 25 $sourceObject->load(); 26 27 $targetFolder = new BaseObject( $this->request->getNumber('targetFolderId')); 28 $targetFolder->load(); 29 30 $this->setTemplateVar('source' ,$sourceObject->getProperties() ); 31 $this->setTemplateVar('sourceId',$sourceObject->objectid ); 32 $this->setTemplateVar('target' ,$targetFolder->getProperties() ); 33 $this->setTemplateVar('targetId',$targetFolder->objectid ); 34 $this->setTemplateVar('types' ,array('move'=>'move','moveandlink'=>'moveandlink','copy'=>'copy','link'=>'link') ); 35 36 if ( ! $targetFolder->hasRight(Permission::ACL_WRITE) ) 37 { 38 $this->addErrorFor( $this->baseObject,Messages::FOLDER_NOT_WRITABLE ); 39 } 40 } 41 public function post() { 42 $type = $this->request->getText('type'); 43 $targetObjectId = $this->request->getNumber('targetid'); 44 $sourceObjectId = $this->request->getNumber('sourceid'); 45 46 $sourceObject = new BaseObject( $sourceObjectId ); 47 $sourceObject->load(); 48 49 $targetFolder = new BaseObject( $targetObjectId ); 50 $targetFolder->load(); 51 52 // Prüfen, ob Schreibrechte im Zielordner bestehen. 53 if ( ! $targetFolder->hasRight(Permission::ACL_WRITE) ) 54 { 55 $this->addErrorFor( $targetFolder,Messages::FOLDER_NOT_WRITABLE ); 56 return; 57 } 58 59 switch( $type ) 60 { 61 case 'move': 62 63 if ( $sourceObject->isFolder ) 64 { 65 $f = new Folder( $sourceObjectId ); 66 $allsubfolders = $f->getAllSubFolderIds(); 67 68 // Plausibilisierungsprüfung: 69 // 70 // Wenn 71 // - Das Zielverzeichnis sich nicht in einem Unterverzeichnis des zu verschiebenen Ordners liegt 72 // und 73 // - Das Zielverzeichnis nicht der zu verschiebene Ordner ist 74 // dann verschieben 75 if ( in_array($targetObjectId,$allsubfolders) || $sourceObjectId == $targetObjectId ) 76 { 77 $this->addErrorFor( $sourceObject,Messages::ERROR); 78 return; 79 } 80 } 81 82 // TODO: 83 // Beim Verschieben und Kopieren muss im Zielordner die Berechtigung 84 // zum Erstellen von Ordner, Dateien oder Seiten vorhanden sein. 85 $sourceObject->setParentId( $targetObjectId ); 86 $this->addNoticeFor( $sourceObject,Messages::MOVED); 87 break; 88 89 case 'moveandlink': 90 91 $oldParentId = $sourceObject->parentid; 92 93 $sourceObject->setParentId( $targetObjectId ); 94 $this->addNoticeFor($sourceObject,Messages::MOVED); 95 96 $link = new Link(); 97 $link->parentid = $oldParentId; 98 $link->filename = $sourceObject->filename; 99 $link->linkedObjectId = $sourceObjectId; 100 $link->persist(); 101 $this->addNoticeFor($link,Messages::ADDED); 102 103 break; 104 105 case 'copy': 106 107 $destObject = null; 108 switch( $sourceObject->getType() ) 109 { 110 case 'folder': 111 // this is a little bit too complicated :( 112 $this->addErrorFor($sourceObject,Messages::CANNOT_COPY_FOLDER); 113 break 2; 114 115 case 'file': 116 $f = new File(); 117 $f->filename = ''; 118 $f->parentid = $targetObjectId; 119 $f->persist(); 120 $f->copyValueFromFile( $sourceObjectId ); 121 $f->copyNamesFrom( $sourceObjectId); 122 123 $destObject = $f; 124 break; 125 126 case 'page': 127 $p = new Page( $sourceObjectId ); 128 $p->load(); 129 $p->filename = ''; 130 $p->parentid = $targetObjectId; 131 $p->persist(); 132 $p->copyValuesFromPage( $sourceObjectId ); 133 $p->copyNamesFrom( $sourceObjectId ); 134 $destObject = $p; 135 break; 136 137 case 'link': 138 $l = new Link( $sourceObjectId ); 139 $l->load(); 140 $l->filename = ''; 141 $l->parentid = $targetObjectId; 142 $l->persist(); 143 $destObject = $l; 144 break; 145 146 default: 147 throw new \LogicException('fatal: unknown type while deleting'); 148 } 149 $this->addNoticeFor($sourceObject,Messages::COPIED); 150 151 break; 152 153 case 'link': 154 155 // Beim Verkn�pfen muss im Zielordner die Berechtigung zum Erstellen 156 // von Verkn�pfungen vorhanden sein. 157 if ( ! $targetFolder->hasRight(Permission::ACL_CREATE_LINK) ) 158 { 159 $this->addErrorFor($targetFolder,Messages::FOLDER_NOT_WRITABLE); 160 return; 161 } 162 163 $link = new Link(); 164 $link->parentid = $targetObjectId; 165 $link->filename = $sourceObject->filename; 166 $link->linkedObjectId = $sourceObjectId; 167 $link->isLinkToObject = true; 168 $link->persist(); 169 $this->addNoticeFor($link,Messages::ADDED); 170 // OK 171 break; 172 173 default: 174 throw new \LogicException('Unknown type for copying'); 175 break; 176 } 177 178 $targetFolder->setTimestamp(); 179 180 } 181 }
Download modules/cms/action/object/ObjectCopyAction.class.php
History Sun, 5 Dec 2021 20:33:24 +0100 dankert Cleanup: Removed unusable properties from class 'Value' and 'BaseObject'. Wed, 10 Mar 2021 23:51:22 +0100 Jan Dankert Refactoring: Cleaned the Request params. Sat, 6 Mar 2021 03:42:38 +0100 Jan Dankert New: Better permission checks. Fri, 26 Feb 2021 01:06:01 +0100 Jan Dankert Refactoring accessing the request parameter values. Mon, 4 Jan 2021 19:03:18 +0100 Jan Dankert Refactoring: ACL class is renamed to Permission, because most RBAC/DMAC concepts are calling it a permission. Thu, 19 Nov 2020 14:49:58 +0100 Jan Dankert Fix: Action::addNotice() is replaced by Action::addNoticeFor() Wed, 18 Nov 2020 01:46:36 +0100 Jan Dankert Refactoring of model classes: New method persist() and some other cleanups. Tue, 17 Nov 2020 23:51:00 +0100 Jan Dankert Refactoring: Every Actionmethod has now its own class.