Folder.class.php (18324B)
1 <?php 2 3 namespace cms\model; 4 5 use cms\publish\Publish; 6 use Exception; 7 8 9 /** 10 * Darstellen eines Ordners. 11 * 12 * @author Jan Dankert 13 */ 14 class Folder extends BaseObject 15 { 16 public $folderid; 17 18 var $subfolders = array(); 19 var $filenames = true; 20 21 22 function __construct( $objectid='' ) 23 { 24 parent::__construct( $objectid ); 25 $this->isFolder = true; 26 $this->typeid = BaseObject::TYPEID_FOLDER; 27 } 28 29 30 public function add() 31 { 32 parent::add(); 33 34 $db = db_connection(); 35 36 $sql = $db->sql('SELECT MAX(id) FROM {{folder}}'); 37 $this->folderid = intval($sql->getOne())+1; 38 39 $sql = $db->sql('INSERT INTO {{folder}}'. 40 ' (id,objectid)'. 41 ' VALUES( {folderid},{objectid} )' ); 42 $sql->setInt ('folderid' ,$this->folderid ); 43 $sql->setInt ('objectid' ,$this->objectid ); 44 45 $sql->query(); 46 } 47 48 49 50 public function hasFilename( $filename ) 51 { 52 $db = db_connection(); 53 54 $sql = $db->sql('SELECT COUNT(*) FROM {{object}}'.' WHERE parentid={objectid} AND filename={filename}'); 55 56 if ( intval($this->objectid)== 0 ) 57 $sql->setNull('objectid'); 58 else 59 $sql->setString('objectid', $this->objectid); 60 61 $sql->setString('filename', $filename ); 62 63 return( $sql->getOne() > 0 ); 64 } 65 66 67 public function load() 68 { 69 // $db = db_connection(); 70 // 71 // $sql = $db->sql('SELECT * FROM {{folder}} WHERE objectid={objectid}'); 72 // $sql->setInt('objectid',$this->objectid); 73 // 74 // $row = $sql->getRow( $sql ); 75 // 76 $this->objectLoad(); 77 78 // $this->folderid = $row['id' ]; 79 } 80 81 82 83 function save() 84 { 85 $this->objectSave(); 86 } 87 88 89 90 function setOrderId( $orderid ) 91 { 92 $db = db_connection(); 93 94 $sql = $db->sql('UPDATE {{folder}} '. 95 ' SET orderid={orderid}'. 96 ' WHERE id={folderid}'); 97 $sql->setInt('folderid',$this->folderid); 98 $sql->setInt('orderid' ,$orderid ); 99 100 $sql->query(); 101 } 102 103 104 105 // function getSubFolders() 106 // { 107 // global $SESS; 108 // $db = db_connection(); 109 // 110 // $sql = $db->sql('SELECT id FROM {{folder}}'. 111 // ' WHERE parentid={folderid}'. 112 // ' AND projectid={projectid}'. 113 // ' ORDER BY orderid ASC' ); 114 // $sql->setInt('folderid' ,$SESS['folderid' ]); 115 // $sql->setInt('projectid',$SESS['projectid']); 116 // 117 // return( $sql->getCol( $sql )); 118 // } 119 120 121 // Liest alle Objekte in diesem Ordner 122 function getObjectIds() 123 { 124 $db = db_connection(); 125 126 $sql = $db->sql('SELECT id FROM {{object}}'. 127 ' WHERE parentid={objectid}'. 128 ' ORDER BY orderid ASC' ); 129 $sql->setInt('objectid' ,$this->objectid ); 130 131 return( $sql->getCol() ); 132 } 133 134 135 136 /** 137 * Liest alle Objekte in diesem Ordner 138 * @return array[Object] Objekte 139 */ 140 function getObjects() 141 { 142 $db = db_connection(); 143 144 $sql = $db->sql('SELECT {{object}}.*,{{name}}.name,{{name}}.descr'. 145 ' FROM {{object}}'. 146 ' LEFT JOIN {{name}} '. 147 ' ON {{object}}.id={{name}}.objectid AND {{name}}.languageid={languageid} '. 148 ' WHERE parentid={objectid}'. 149 ' ORDER BY orderid ASC' ); 150 $sql->setInt('languageid',$this->languageid ); 151 $sql->setInt('objectid' ,$this->objectid ); 152 153 $liste = array(); 154 $res = $sql->getAll(); 155 foreach( $res as $row ) 156 { 157 $o = new BaseObject( $row['id'] ); 158 $o->setDatabaseRow( $row ); 159 $liste[] = $o; 160 } 161 162 return $liste; 163 } 164 165 166 // Liest alle Objekte in diesem Ordner 167 function getObjectIdsByType() 168 { 169 $db = db_connection(); 170 171 $sql = $db->sql('SELECT id FROM {{object}}'. 172 ' WHERE parentid={objectid}'. 173 ' ORDER BY typeid,orderid ASC' ); 174 $sql->setInt('objectid' ,$this->objectid ); 175 176 return( $sql->getCol() ); 177 } 178 179 180 // Liest alle Objekte in diesem Ordner sortiert nach dem Namen (nicht Dateinamen!) 181 function getChildObjectIdsByName() 182 { 183 $db = db_connection(); 184 185 $sql = $db->sql('SELECT {{object}}.id FROM {{object}}'. 186 ' LEFT JOIN {{name}} ON {{object}}.id={{name}}.objectid AND {{name}}.languageid={languageid} '. 187 ' WHERE parentid={objectid}'. 188 ' ORDER BY {{name}}.name,{{object}}.filename ASC'); 189 $sql->setInt('objectid' , $this->objectid ); 190 $sql->setInt('languageid', $this->languageid); 191 return( $sql->getCol() ); 192 } 193 194 195 // Liest alle Objekte in diesem Ordner 196 function getObjectIdsByLastChange() 197 { 198 $db = db_connection(); 199 200 $sql = $db->sql('SELECT id FROM {{object}}'. 201 ' WHERE parentid={objectid}'. 202 ' ORDER BY lastchange_date,orderid ASC' ); 203 $sql->setInt('projectid',$this->projectid ); 204 $sql->setInt('objectid' ,$this->objectid ); 205 206 return( $sql->getCol() ); 207 } 208 209 210 public function publish( $withPages,$withFiles,$subdirs = false ) 211 { 212 set_time_limit(300); 213 214 foreach( $this->getObjectIds() as $oid ) 215 { 216 try { 217 $o = new BaseObject($oid); 218 $o->objectLoadRaw(); 219 220 if ($o->isPage && $withPages) { 221 $p = new Page($oid); 222 $p->load(); 223 $p->publisher = &$this->publisher; 224 $p->publish(); 225 } 226 227 if ($o->isFile && $withFiles) { 228 $f = new File($oid); 229 $f->load(); 230 $f->publisher = &$this->publisher; 231 $f->publish(); 232 } 233 234 if ($o->isImage && $withFiles) { 235 $f = new Image($oid); 236 $f->load(); 237 $f->publisher = &$this->publisher; 238 $f->publish(); 239 } 240 241 if ($o->isText && $withFiles) { 242 $f = new Text($oid); 243 $f->load(); 244 $f->publisher = &$this->publisher; 245 $f->publish(); 246 } 247 248 if ($o->isFolder && $subdirs) { 249 $f = new Folder($oid); 250 $f->load(); 251 $f->publisher = &$this->publisher; 252 $f->publish($withPages, $withFiles, true); 253 } 254 } 255 catch( Exception $e) 256 { 257 // Maybe it is possible to start on with the next one? 258 // But we have to throw an exception here to inform the UI... 259 260 // Lets wrap it. 261 throw new \LogicException("Could not publish ".$o->__toString().": ".$e->getMessage(),$e->getCode(),$e); 262 } 263 } 264 } 265 266 267 function getObjectIdByFileName( $filename ) 268 { 269 $db = db_connection(); 270 271 $sql = $db->sql('SELECT id FROM {{object}}'. 272 ' WHERE parentid={objectid}'. 273 ' AND filename={filename}' ); 274 $sql->setInt ('objectid' ,$this->objectid ); 275 $sql->setString('filename' ,$filename ); 276 277 return( intval($sql->getOne()) ); 278 } 279 280 281 282 public function getPages() 283 { 284 $db = db_connection(); 285 286 $sql = $db->sql('SELECT id FROM {{object}} '. 287 ' WHERE parentid={objectid} AND typeid='.BaseObject::TYPEID_PAGE. 288 ' ORDER BY orderid ASC' ); 289 $sql->setInt( 'objectid' ,$this->objectid ); 290 291 return $sql->getCol(); 292 } 293 294 295 /** 296 * Ermittelt die erste Seite oder Verkn�pfung in diesem Ordner. 297 * 298 * @return BaseObject Objekt 299 */ 300 public function getFirstPage() 301 { 302 $db = db_connection(); 303 304 $sql = $db->sql('SELECT id FROM {{object}} '. 305 ' WHERE parentid={objectid}'. 306 ' AND (typeid='.BaseObject::TYPEID_PAGE.')'. 307 ' ORDER BY orderid ASC' ); 308 $sql->setInt( 'objectid' ,$this->objectid ); 309 310 $oid = intval($sql->getOne()); 311 312 if ( $oid != 0 ) 313 $o = new BaseObject($oid); 314 else 315 $o = null; 316 317 return $o; 318 } 319 320 321 /** 322 * Ermittelt die erste Seite oder Verkn�pfung in diesem Ordner. 323 * 324 * @return BaseObject Objekt 325 */ 326 function getFirstPageOrLink() 327 { 328 $db = db_connection(); 329 330 $sql = $db->sql('SELECT id FROM {{object}} '. 331 ' WHERE parentid={objectid}'. 332 ' AND (typeid='.BaseObject::TYPEID_PAGE.' OR typeid='.BaseObject::TYPEID_LINK.')'. 333 ' ORDER BY orderid ASC' ); 334 $sql->setInt( 'objectid' ,$this->objectid ); 335 336 $oid = intval($sql->getOne()); 337 338 if ( $oid != 0 ) 339 $o = new BaseObject($oid); 340 else 341 $o = null; 342 343 return $o; 344 } 345 346 347 function getLastPageOrLink() 348 { 349 $db = db_connection(); 350 351 $sql = $db->sql('SELECT id FROM {{object}} '. 352 ' WHERE parentid={objectid}'. 353 ' AND (typeid='.BaseObject::TYPEID_PAGE.' OR typeid='.BaseObject::TYPEID_LINK.')'. 354 ' ORDER BY orderid DESC' ); 355 $sql->setInt( 'objectid' ,$this->objectid ); 356 357 $oid = intval($sql->getOne()); 358 359 if ( $oid != 0 ) 360 $o = new BaseObject($oid); 361 else 362 $o = null; 363 364 return $o; 365 } 366 367 368 function getFiles() 369 { 370 $db = db_connection(); 371 372 $sql = $db->sql('SELECT id FROM {{object}} '. 373 ' WHERE parentid={objectid} AND typeid='.BaseObject::TYPEID_FILE. 374 ' ORDER BY orderid ASC' ); 375 $sql->setInt( 'objectid' ,$this->objectid ); 376 377 return $sql->getCol(); 378 } 379 380 381 382 /** 383 * Liefert eine Liste von allen Dateien in diesem Ordner. 384 * 385 * @return Array Schl�ssel=Objekt-Id, Wert=Dateiname 386 */ 387 function getFileFilenames() 388 { 389 $db = db_connection(); 390 391 $sql = $db->sql('SELECT id,filename FROM {{object}} '. 392 ' WHERE parentid={objectid} AND typeid='.BaseObject::TYPEID_FILE. 393 ' ORDER BY orderid ASC' ); 394 $sql->setInt( 'objectid' ,$this->objectid ); 395 396 return $sql->getAssoc(); 397 } 398 399 400 function getLinks() 401 { 402 $db = db_connection(); 403 404 $sql = $db->sql('SELECT id FROM {{object}} '. 405 ' WHERE parentid={objectid} AND typeid='.BaseObject::TYPEID_LINK. 406 ' ORDER BY orderid ASC' ); 407 $sql->setInt( 'objectid' ,$this->objectid ); 408 409 return $sql->getCol(); 410 } 411 412 413 // Rechte f?r diesen Ordner hinzuf?gen 414 function addrights( $rights,$inherit = true ) 415 { 416 global $SESS; 417 418 $SESS['rights'][$rights['projectid']][$this->folderid]['show'] = true; 419 420 if ($rights['read'] == '1') 421 $SESS['rights'][$rights['projectid']][$this->folderid]['read'] = 1; 422 if ($rights['write'] == '1') 423 $SESS['rights'][$rights['projectid']][$this->folderid]['write'] = 1; 424 if ($rights['create'] == '1') 425 $SESS['rights'][$rights['projectid']][$this->folderid]['create'] = 1; 426 if ($rights['delete'] == '1') 427 $SESS['rights'][$rights['projectid']][$this->folderid]['delete'] = 1; 428 if ($rights['publish'] == '1') 429 $SESS['rights'][$rights['projectid']][$this->folderid]['publish'] = 1; 430 431 // Rechte auf Unterordner vererben 432 // sowie f?r ?bergeordnete Ordner die Anzeige erzwingen 433 if ( $inherit ) 434 { 435 // ?bergeordnete Ordner ermitteln 436 $parentfolder = $this->parentObjectFileNames(); 437 438 // ?bergeordnete Ordner immer anzeigen (Schalter 'show'=true) 439 foreach( $parentfolder as $folderid=>$name ) 440 { 441 $f = new Folder( $folderid ); 442 $f->projectid = $this->projectid; 443 $f->addrights( array('projectid'=>$rights['projectid']),false ); 444 unset($f); 445 } 446 447 $f = new Folder( 'null' ); 448 $f->projectid = $this->projectid; 449 $f->addrights( array('projectid'=>$rights['projectid']),false ); 450 unset($f); 451 452 453 // Unterordner ermitteln 454 //echo "Kurz vor subfolderberechnung, folderid ist ".$this->folderid.'<br>'; 455 $subfolder = $this->subfolder(); 456 457 // Rechte weitergeben 458 foreach( $subfolder as $folderid=>$name ) 459 { 460 $f = new Folder( $folderid ); 461 $f->projectid = $this->projectid; 462 $f->addrights( $rights,false ); 463 unset($f); 464 } 465 } 466 } 467 468 469 /** 470 * Ermitteln des Dateinamens. 471 * @return String Dateiname 472 */ 473 public function filename() 474 { 475 $filenameConfig = config('filename'); 476 477 if ( $filenameConfig['edit'] ) 478 { 479 if ( $this->filename == '' ) 480 // Filename ist eigentlich ein Pflichtfeld, daher kann dies nahezu nie auftreten. 481 // Rein technisch kann der Filename aber leer sein. 482 return $this->objectid; 483 else 484 return BaseObject::urlify($this->name); 485 } 486 else 487 { 488 // Filename is not edited, so we are generating a pleasant filename. 489 switch( $filenameConfig['style'] ) 490 { 491 case 'longid': 492 // Eine etwas laengere ID als Dateinamen benutzen 493 return base_convert(str_pad($this->objectid,6,'a'),11,10); 494 495 case 'short': 496 // So kurz wie moeglich: Erhoehen der Basis vom 10 auf 36. 497 // Beispiele: 498 // 1 -> 1 499 // 10 -> a 500 return base_convert($this->objectid,10,36); 501 502 case 'md5': 503 // MD5-Summe als Dateinamen verwenden 504 // Achtung: Kollisionen sind unwahrscheinlich, aber theoretisch möglich. 505 return md5(md5($this->objectid)); 506 507 case 'ss': 508 // Imitieren von "StoryServer" URLs. Wers braucht. 509 return $this->objectid; 510 511 case 'title': 512 // Achtung: Kollisionen sind möglich. 513 // COLLISION ALARM! THIS IS NOT A GOOD IDEA! 514 return BaseObject::urlify($this->name); 515 516 case 'id': 517 default: 518 // Einfach die Objekt-Id als Dateinamen verwenden. 519 return $this->objectid; 520 521 } 522 } 523 } 524 525 526 527 528 // Ermitteln aller Unterordner 529 // 530 public function subfolder() 531 { 532 $stmt = db()->sql(<<<SQL 533 534 SELECT id FROM {{object}} 535 WHERE parentid={objectid} AND typeid={typeid} 536 ORDER BY orderid ASC 537 SQL 538 ); 539 540 $stmt->setInt( 'objectid' ,$this->objectid ); 541 $stmt->setInt( 'typeid' ,BaseObject::TYPEID_FOLDER ); 542 543 $this->subfolders = $stmt->getCol(); 544 545 return $this->subfolders; 546 } 547 548 549 550 public function getSubfolderFilenames() 551 { 552 $stmt = db()->sql(<<<SQL 553 SELECT id,filename FROM {{object}} 554 WHERE parentid={objectid} AND typeid={typeid} 555 ORDER BY orderid ASC 556 SQL 557 ); 558 559 $stmt->setInt( 'objectid' ,$this->objectid ); 560 $stmt->setInt( 'typeid' ,BaseObject::TYPEID_FOLDER ); 561 562 return $stmt->getAssoc(); 563 } 564 565 566 567 /** 568 * Ermitteln aller Unterordner (rekursives Absteigen). 569 * 570 */ 571 function getAllSubFolderIds() 572 { 573 $ids = array(); 574 575 foreach( $this->getSubFolderIds() as $id ) 576 { 577 $ids[] = $id; 578 579 $f = new Folder( $id ); 580 if ( !empty($this->projectid) ) 581 $f->projectid = $this->projectid; 582 583 // Rekursiver Aufruf für alle Unterordner 584 foreach( $f->getAllSubFolderIds() as $xid ) 585 { 586 $ids[] = $xid; 587 } 588 } 589 590 return $ids; 591 } 592 593 594 /** 595 * Loeschen dieses Ordners. 596 * Der Ordner wird nur geloescht, wenn er keine Unterelemente mehr enth?lt. 597 * Zum Loeschen inklusive Unterelemente dient die Methode deleteAll() 598 * 599 * @throws \Exception if folder contains elements 600 */ 601 function delete() 602 { 603 $db = db_connection(); 604 605 // Nur loeschen, wenn es keine Unterelemente gibt 606 if ( count( $this->getObjectIds() ) == 0 ) 607 { 608 $sql = $db->sql( 'UPDATE {{element}} '. 609 ' SET folderobjectid=NULL '. 610 ' WHERE folderobjectid={objectid}' ); 611 $sql->setInt('objectid',$this->objectid); 612 $sql->query(); 613 614 $sql = $db->sql( 'DELETE FROM {{folder}} '. 615 ' WHERE objectid={objectid}' ); 616 $sql->setInt('objectid',$this->objectid); 617 $sql->query(); 618 619 $this->objectDelete(); 620 } 621 else { 622 throw new \RuntimeException('There are children in the folder '.$this->objectid.'.'); 623 } 624 } 625 626 627 /** 628 * Rekursives loeschen aller Inhalte 629 * 630 * Loeschen aller Inhalte dieses Ordners 631 * inclusive aller Unterelemente 632 */ 633 function deleteAll() 634 { 635 $db = db_connection(); 636 637 // L?schen aller Unterordner 638 foreach( $this->subfolder() as $folderid ) 639 { 640 $folder = new Folder( $folderid ); 641 { 642 $folder->deleteAll(); 643 } 644 } 645 646 // L?schen aller Seiten,Verknuepfungen und Dateien in 647 // diesem Ordner 648 foreach( $this->getObjectIds() as $oid ) 649 { 650 $object = new BaseObject( $oid ); 651 { 652 $object->load(); 653 654 if ( $object->isPage ) 655 { 656 $page = new Page( $oid ); 657 $page->load(); 658 $page->delete(); 659 } 660 661 if ( $object->isLink ) 662 { 663 $link = new Link( $oid ); 664 $link->load(); 665 $link->delete(); 666 } 667 668 if ( $object->isUrl ) 669 { 670 $url = new Url( $oid ); 671 $url->load(); 672 $url->delete(); 673 } 674 675 if ( $object->isFile ) 676 { 677 $file = new File( $oid ); 678 $file->load(); 679 $file->delete(); 680 } 681 if ( $object->isImage ) 682 { 683 $file = new Image( $oid ); 684 $file->load(); 685 $file->delete(); 686 } 687 if ( $object->isText ) 688 { 689 $file = new Text( $oid ); 690 $file->load(); 691 $file->delete(); 692 } 693 } 694 } 695 696 // Zum Abschluss den aktuellen Ordner loeschen 697 $this->delete(); 698 } 699 700 701 function getSubFolderIds() 702 { 703 return $this->subfolder(); 704 } 705 706 707 708 /** 709 * Ermittelt die letzten Änderung in diesem Ordner. 710 * @return Array[Objektid]=Array()) 711 */ 712 public function getLastChanges() 713 { 714 715 $db = db_connection(); 716 717 $sql = $db->sql( <<<SQL 718 SELECT {{object}}.id as objectid, 719 {{object}}.lastchange_date as lastchange_date, 720 {{object}}.filename as filename, 721 {{object}}.typeid as typeid, 722 {{name}}.name as name, 723 {{user}}.name as username, 724 {{user}}.id as userid, 725 {{user}}.mail as usermail, 726 {{user}}.fullname as userfullname 727 FROM {{object}} 728 LEFT JOIN {{name}} 729 ON {{name}}.objectid = {{object}}.id 730 AND {{name}}.languageid = {languageid} 731 LEFT JOIN {{user}} 732 ON {{user}}.id = {{object}}.lastchange_userid 733 WHERE {{object}}.parentid = {folderid} 734 ORDER BY {{object}}.lastchange_date DESC 735 SQL 736 ); 737 738 // Variablen setzen. 739 $sql->setInt( 'folderid', $this->objectid ); 740 741 $sql->setInt( 'languageid', $this->languageid ); 742 743 return $sql->getAll(); 744 } 745 746 747 /** 748 * Stellt fest, ob der Ordner Unterelemente besitzt. 749 * @return bool 750 */ 751 public function hasChildren() 752 { 753 return count($this->getObjectIds()) > 0; 754 } 755 756 } 757