openrat-cms

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

ObjectCopyAction.class.php (5036B)


      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 }