Value.class.php (45461B)
1 <?php 2 namespace cms\model; 3 use ArrayUtils; 4 use cms\publish\Publish; 5 use MacroRunner; 6 use \ObjectNotFoundException; 7 use \Logger; 8 use \Text; 9 use \Html; 10 use \Http; 11 use \Transformer; 12 use \Code; 13 use util\FileCache; 14 15 // OpenRat Content Management System 16 // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de 17 // 18 // This program is free software; you can redistribute it and/or 19 // modify it under the terms of the GNU General Public License 20 // as published by the Free Software Foundation; either version 2 21 // of the License, or (at your option) any later version. 22 // 23 // This program is distributed in the hope that it will be useful, 24 // but WITHOUT ANY WARRANTY; without even the implied warranty of 25 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26 // GNU General Public License for more details. 27 // 28 // You should have received a copy of the GNU General Public License 29 // along with this program; if not, write to the Free Software 30 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 31 32 33 34 /** 35 * Darstellen einer Inhaltes 36 * 37 * @version $Revision$ 38 * @author $Author$ 39 * @package openrat.objects 40 */ 41 42 class Value extends ModelBase 43 { 44 /** 45 * ID dieser Inhaltes 46 * @type Integer 47 */ 48 var $valueid=0; 49 50 /** 51 * Seiten-Objekt der ?bergeordneten Seite 52 * @type Page 53 */ 54 var $page; 55 56 /** 57 * Seiten-Id der uebergeordneten Seite 58 * @type Integer 59 */ 60 var $pageid; 61 62 /** 63 * Kennzeichen, ob der Inhalt mit dem Inhalt einer anderern Seite verkn�pft wird. 64 * @type BaseObject 65 */ 66 var $isLink = false; 67 68 /** 69 * Objekt-ID, auf die verlinkt wird 70 * @type Integer 71 */ 72 var $linkToObjectId=0; 73 74 /** 75 * Text-Inhalt 76 * @type String 77 */ 78 var $text=''; 79 80 /** 81 * Zahl. Auch Flie?kommazahlen werden als Ganzzahl gespeichert 82 * @type Integer 83 */ 84 var $number=0; 85 86 87 /** 88 * Datum als Unix-Timestamp 89 * @type Integer 90 */ 91 var $date=0; 92 93 /** 94 * Element-Objekt 95 * @type Element 96 */ 97 var $element; 98 99 /** 100 * Element-Id 101 * @type Integer 102 */ 103 var $elementid; 104 105 /** 106 * Der eigentliche Inhalt des Elementes 107 * @type String 108 */ 109 var $value; 110 111 /** 112 * TimeStamp der letzten Aenderung 113 * @type Integer 114 */ 115 var $lastchangeTimeStamp; 116 117 /** 118 * Benutzer-ID der letzten Aenderung 119 * @type Integer 120 */ 121 var $lastchangeUserId; 122 123 /** 124 * Benutzername der letzten Aenderung 125 * @type Integer 126 */ 127 var $lastchangeUserName; 128 129 /** 130 * Schalter, ob dieser Inhalt der aktive Inhalt ist 131 * @type Boolean 132 */ 133 var $active; 134 135 /** 136 * @type Publish 137 */ 138 public $publisher; 139 140 /** 141 * @type Publish 142 * @deprecated use #publisher 143 */ 144 var $publish = false; 145 146 /** 147 * @type Boolean 148 * @deprecated 149 */ 150 public $simple; 151 152 153 /** 154 * Sprach-Id. 155 * @var int 156 */ 157 public $languageid; 158 159 /** 160 * Format 161 * 162 * @var int 163 */ 164 public $format = null; 165 166 /** 167 * Konstruktor 168 */ 169 function __construct() 170 { 171 $this->lastchangeUserId = 0; 172 $this->lastchangeTimeStamp = 0; 173 174 } 175 176 177 178 /** 179 * Laden des aktuellen Inhaltes aus der Datenbank 180 */ 181 function load() 182 { 183 if ( $this->publisher->isPublic() ) 184 $stmt = db()->sql( 'SELECT * FROM {{value}}'. 185 ' WHERE elementid ={elementid}'. 186 ' AND pageid ={pageid}'. 187 ' AND languageid={languageid}'. 188 ' AND publish=1' ); 189 else 190 $stmt = db()->sql( 'SELECT * FROM {{value}}'. 191 ' WHERE elementid ={elementid}'. 192 ' AND pageid ={pageid}'. 193 ' AND languageid={languageid}'. 194 ' AND active=1' ); 195 $stmt->setInt( 'elementid' ,$this->element->elementid ); 196 $stmt->setInt( 'pageid' ,$this->pageid ); 197 $stmt->setInt( 'languageid',$this->languageid); 198 $row = $stmt->getRow(); 199 200 if ( count($row) > 0 ) // Wenn Inhalt gefunden 201 { 202 $this->text = $row['text' ]; 203 $this->format = $row['format']; 204 $this->valueid = intval($row['id'] ); 205 $this->linkToObjectId = intval($row['linkobjectid']); 206 $this->number = intval($row['number' ]); 207 $this->date = intval($row['date' ]); 208 209 $this->active = ( $row['active' ]=='1' ); 210 $this->publish = ( $row['publish']=='1' ); 211 212 $this->lastchangeTimeStamp = intval($row['lastchange_date' ]); 213 $this->lastchangeUserId = intval($row['lastchange_userid']); 214 } 215 } 216 217 218 /** 219 * Laden eines bestimmten Inhaltes aus der Datenbank 220 */ 221 function loadWithId( $valueid=0 ) 222 { 223 if ( $valueid != 0 ) 224 $this->valueid = $valueid; 225 226 $db = db_connection(); 227 228 $sql = $db->sql( 'SELECT {{value}}.*,{{user}}.name as lastchange_username'. 229 ' FROM {{value}}'. 230 ' LEFT JOIN {{user}} ON {{user}}.id={{value}}.lastchange_userid'. 231 ' WHERE {{value}}.id={valueid}' ); 232 $sql->setInt( 'valueid',$this->valueid); 233 $row = $sql->getRow(); 234 235 $this->text = $row['text' ]; 236 $this->format = $row['format' ]; 237 $this->pageid = intval($row['pageid' ]); 238 $this->elementid = intval($row['elementid' ]); 239 $this->languageid = intval($row['languageid' ]); 240 $this->valueid = intval($row['id' ]); 241 $this->linkToObjectId = intval($row['linkobjectid']); 242 $this->number = intval($row['number' ]); 243 $this->date = intval($row['date' ]); 244 245 $this->active = ( $row['active' ]=='1' ); 246 $this->publish = ( $row['publish']=='1' ); 247 248 $this->lastchangeTimeStamp = intval($row['lastchange_date' ]); 249 $this->lastchangeUserId = intval($row['lastchange_userid' ]); 250 $this->lastchangeUserName = $row['lastchange_username']; 251 } 252 253 254 /** 255 * Alle Versionen des aktuellen Inhaltes werden ermittelt 256 * @return Array 257 */ 258 function getVersionList() 259 { 260 $db = db_connection(); 261 262 $sql = $db->sql( 'SELECT {{value}}.*,{{user}}.name as lastchange_username'. 263 ' FROM {{value}}'. 264 ' LEFT JOIN {{user}} ON {{user}}.id={{value}}.lastchange_userid'. 265 ' WHERE elementid ={elementid}'. 266 ' AND pageid ={pageid}'. 267 ' AND languageid={languageid}'. 268 ' ORDER BY lastchange_date' ); 269 $sql->setInt( 'elementid' ,$this->element->elementid ); 270 $sql->setInt( 'pageid' ,$this->pageid ); 271 $sql->setInt( 'languageid',$this->languageid); 272 273 $list = array(); 274 foreach($sql->getAll() as $row ) 275 { 276 $val = new Value(); 277 $val->valueid = $row['id']; 278 279 $val->text = $row['text']; 280 $val->format = $row['format']; 281 $val->valueid = intval($row['id'] ); 282 $val->linkToObjectId = intval($row['linkobjectid']); 283 $val->number = intval($row['number' ]); 284 $val->date = intval($row['date' ]); 285 286 $val->active = ( $row['active' ]=='1' ); 287 $val->publish = ( $row['publish']=='1' ); 288 289 $val->lastchangeTimeStamp = intval($row['lastchange_date' ]); 290 $val->lastchangeUserId = intval($row['lastchange_userid' ]); 291 $val->lastchangeUserName = $row['lastchange_username']; 292 $list[] = $val; 293 } 294 return $list; 295 } 296 297 298 /** 299 * Die Anzahl der Versionen des aktuellen Inhaltes wird ermittelt 300 * @return Array 301 */ 302 function getCountVersions() 303 { 304 $db = db_connection(); 305 306 $sql = $db->sql( 'SELECT COUNT(*) FROM {{value}}'. 307 ' WHERE elementid ={elementid}'. 308 ' AND pageid ={pageid}'. 309 ' AND languageid={languageid}' ); 310 $sql->setInt( 'elementid' ,$this->element->elementid ); 311 $sql->setInt( 'pageid' ,$this->pageid ); 312 $sql->setInt( 'languageid',$this->languageid); 313 314 return $sql->getOne(); 315 } 316 317 318 function getLastChangeTime() 319 { 320 $db = db_connection(); 321 322 $sql = $db->sql( 323 <<<SQL 324 SELECT lastchange_date FROM {{value}} 325 WHERE elementid ={elementid} 326 AND pageid ={pageid} 327 AND languageid={languageid} 328 ORDER BY id DESC 329 SQL 330 ); 331 $sql->setInt( 'elementid' ,$this->element->elementid ); 332 $sql->setInt( 'pageid' ,$this->pageid ); 333 $sql->setInt( 'languageid',$this->languageid); 334 335 return $sql->getOne(); 336 } 337 338 339 340 /** 341 * Inhalt freigeben 342 */ 343 function release() 344 { 345 $db = db_connection(); 346 347 $sql = $db->sql( 'UPDATE {{value}}'. 348 ' SET publish=0'. 349 ' WHERE elementid ={elementid}'. 350 ' AND pageid ={pageid}'. 351 ' AND languageid={languageid}' ); 352 $sql->setInt( 'elementid' ,$this->elementid ); 353 $sql->setInt( 'pageid' ,$this->pageid ); 354 $sql->setInt( 'languageid',$this->languageid); 355 356 $sql->query(); 357 358 $sql = $db->sql( 'UPDATE {{value}}'. 359 ' SET publish=1'. 360 ' WHERE active = 1'. 361 ' AND elementid ={elementid}'. 362 ' AND pageid ={pageid}'. 363 ' AND languageid={languageid}' ); 364 $sql->setInt( 'elementid' ,$this->elementid ); 365 $sql->setInt( 'pageid' ,$this->pageid ); 366 $sql->setInt( 'languageid',$this->languageid); 367 368 $sql->query(); 369 } 370 371 /** 372 * Inhalt speichern 373 */ 374 function save() 375 { 376 $db = db_connection(); 377 378 $sql = $db->sql( 'UPDATE {{value}}'. 379 ' SET active=0'. 380 ' WHERE elementid ={elementid}'. 381 ' AND pageid ={pageid}'. 382 ' AND languageid={languageid}' ); 383 $sql->setInt( 'elementid' ,$this->element->elementid ); 384 $sql->setInt( 'pageid' ,$this->pageid ); 385 $sql->setInt( 'languageid',$this->languageid); 386 387 $sql->query(); 388 389 if ( $this->publish ) 390 { 391 // Wenn Inhalt sofort veroeffentlicht werden kann, dann 392 // alle anderen Inhalte auf nicht-veroeffentlichen stellen 393 $sql = $db->sql( 'UPDATE {{value}}'. 394 ' SET publish=0'. 395 ' WHERE elementid ={elementid}'. 396 ' AND pageid ={pageid}'. 397 ' AND languageid={languageid}' ); 398 $sql->setInt( 'elementid' ,$this->element->elementid ); 399 $sql->setInt( 'pageid' ,$this->pageid ); 400 $sql->setInt( 'languageid',$this->languageid); 401 402 $sql->query(); 403 } 404 405 // Naechste ID aus Datenbank besorgen 406 $sql = $db->sql('SELECT MAX(id) FROM {{value}}'); 407 $this->valueid = intval($sql->getOne())+1; 408 409 $sql = $db->sql( <<<SQL 410 INSERT INTO {{value}} 411 (id ,linkobjectid ,text ,number ,date ,elementid ,format ,pageid ,languageid ,active,publish ,lastchange_date ,lastchange_userid ) 412 VALUES ({valueid},{linkobjectid},{text},{number},{date},{elementid},{format},{pageid},{languageid},1 ,{publish},{lastchange_date},{lastchange_userid}) 413 SQL 414 ); 415 $sql->setInt( 'valueid' ,$this->valueid ); 416 $sql->setInt( 'format' ,$this->format ); 417 $sql->setInt( 'elementid' ,$this->element->elementid ); 418 $sql->setInt( 'pageid' ,$this->pageid ); 419 $sql->setInt( 'languageid',$this->languageid ); 420 421 if ( intval($this->linkToObjectId)==0) 422 $sql->setNull ( 'linkobjectid' ); 423 else $sql->setInt ( 'linkobjectid',$this->linkToObjectId ); 424 425 if ( $this->text == '' ) 426 $sql->setNull ( 'text' ); 427 else $sql->setString( 'text',$this->text ); 428 429 if ( intval($this->number)==0) 430 $sql->setNull ( 'number' ); 431 else $sql->setInt ( 'number',$this->number ); 432 433 if ( intval($this->date)==0) 434 $sql->setNull ( 'date' ); 435 else $sql->setInt ( 'date',$this->date ); 436 437 $sql->setBoolean( 'publish' ,$this->publish ); 438 $sql->setInt ( 'lastchange_date' ,now() ); 439 $user = \Session::getUser(); 440 $sql->setInt ( 'lastchange_userid',$user->userid ); 441 442 $sql->query(); 443 444 // Nur ausfuehren, wenn in Konfiguration aktiviert. 445 $limit = config('content','revision-limit'); 446 if ( isset($limit['enabled']) && $limit['enabled'] ) 447 $this->checkLimit(); 448 } 449 450 451 /** 452 * Pruefen, ob maximale Anzahl von Versionen erreicht. 453 * In diesem Fall die zu alten Versionen l�schen. 454 */ 455 function checkLimit() 456 { 457 $limit = config('content','revision-limit'); 458 459 $db = db_connection(); 460 461 $sql = $db->sql( <<<SQL 462 SELECT id FROM {{value}} 463 WHERE elementid = {elementid} 464 AND pageid = {pageid} 465 AND languageid = {languageid} 466 AND active = 0 467 AND publish = 0 468 ORDER BY id 469 SQL 470 ); 471 $sql->setInt( 'elementid' ,$this->element->elementid ); 472 $sql->setInt( 'pageid' ,$this->pageid ); 473 $sql->setInt( 'languageid',$this->languageid ); 474 $values = $sql->getCol(); 475 476 if ( count($values) > $limit['min-revisions'] ) 477 { 478 $sql = $db->sql( <<<SQL 479 DELETE FROM {{value}} 480 WHERE elementid = {elementid} 481 AND pageid = {pageid} 482 AND languageid = {languageid} 483 AND active = 0 484 AND publish = 0 485 AND lastchange_date < {min_date} 486 AND id < {min_id} 487 SQL 488 ); 489 $sql->setInt( 'elementid' ,$this->element->elementid ); 490 $sql->setInt( 'pageid' ,$this->pageid ); 491 $sql->setInt( 'languageid',$this->languageid ); 492 $sql->setInt( 'min_date' ,$limit['max-age']*24*60*60); 493 $sql->setInt( 'min_id' ,$values[count($values)-$limit['min-revisions']]); 494 $sql->query(); 495 } 496 497 if ( count($values) > $limit['max-revisions'] ) 498 { 499 $sql = $db->sql( <<<SQL 500 DELETE FROM {{value}} 501 WHERE elementid = {elementid} 502 AND pageid = {pageid} 503 AND languageid = {languageid} 504 AND active = 0 505 AND publish = 0 506 AND lastchange_date < {min_date} 507 AND id < {min_id} 508 SQL 509 ); 510 $sql->setInt( 'elementid' ,$this->element->elementid ); 511 $sql->setInt( 'pageid' ,$this->pageid ); 512 $sql->setInt( 'languageid',$this->languageid ); 513 $sql->setInt( 'min_date' ,$limit['min-age']*24*60*60); 514 $sql->setInt( 'min_id' ,$values[count($values)-$limit['max-revisions']]); 515 $sql->query(); 516 } 517 } 518 519 520 521 /** 522 * Diesen Inhalt loeschen 523 */ 524 function delete() 525 { 526 $db = db_connection(); 527 $sql = $db->sql( 'DELETE * FROM {{value}}'. 528 ' WHERE elementid ={elementid}'. 529 ' AND pageid ={pageid}'. 530 ' AND languageid={languageid}' ); 531 $sql->setInt( 'elementid' ,$this->element->elementid ); 532 $sql->setInt( 'pageid' ,$this->pageid ); 533 $sql->setInt( 'languageid',$this->languageid); 534 $row = $sql->getRow(); 535 } 536 537 538 public function generate() { 539 540 return $this->getCache()->get(); 541 } 542 543 544 /** 545 * 546 * @return FileCache 547 */ 548 public function getCache() { 549 550 $cacheKey = array('db'=>db()->id, 551 'value'=>$this->valueid, 552 'page' =>is_object($this->page)?$this->page->objectid:0, 553 'el'=>is_object($this->element)?$this->element->elementid:0, 554 'language'=>$this->languageid, 555 'model' =>is_object($this->page)?$this->page->modelid:0, 556 'publish'=>\ClassUtils::getSimpleClassName($this->publisher) ); 557 return new FileCache( $cacheKey,function() { 558 return $this->generateValue(); 559 },$this->lastchangeTimeStamp ); 560 } 561 562 /** 563 * Hier findet die eigentliche Bereitstellung des Inhaltes statt, zu 564 * jedem Elementtyp wird ein Inhalt ermittelt. 565 * 566 * @return void (aber Eigenschaft 'value' wird gesetzt). 567 */ 568 private function generateValue() 569 { 570 global $conf; 571 572 if ( intval($this->valueid)==0 ) 573 $this->load(); 574 575 $inhalt = ''; 576 $raw = false; 577 578 global $conf; 579 580 // Inhalt ist mit anderer Seite verkn�pft. 581 if ( in_array($this->element->typeid,[Element::ELEMENT_TYPE_TEXT,Element::ELEMENT_TYPE_LONGTEXT,Element::ELEMENT_TYPE_DATE,Element::ELEMENT_TYPE_NUMBER]) && intval($this->linkToObjectId) != 0 && !$this->isLink ) 582 { 583 $linkedPage = new Page( $this->linkToObjectId ); 584 $linkedPage->load(); 585 586 $linkedValue = new Value(); 587 $linkedValue->isLink = true; 588 $linkedValue->pageid = $linkedPage->pageid; 589 $linkedValue->page = $linkedPage; 590 $linkedValue->element = $this->element; 591 $linkedValue->languageid = $this->languageid; 592 $linkedValue->publisher = $this->publisher; 593 //$v->modelid = $this->modelid; 594 $linkedValue->load(); 595 $linkedValue->generate(); 596 $this->value = $linkedValue->value; 597 return; 598 } 599 600 switch( $this->element->typeid ) 601 { 602 case Element::ELEMENT_TYPE_INSERT: 603 604 $objectid = $this->linkToObjectId; 605 606 if ( intval($objectid) == 0 ) 607 $objectid = $this->element->defaultObjectId; 608 609 if ( ! BaseObject::available( $objectid) ) 610 return; 611 612 $object = new BaseObject( $objectid ); 613 $object->objectLoadRaw(); 614 615 if ( $object->isFolder ) 616 { 617 if ( $this->publisher->isSimplePreview() ) 618 { 619 $f = new Folder( $objectid ); 620 $f->load(); 621 $inhalt = $f->filename; 622 unset( $f ); 623 } 624 else 625 { 626 if ( $objectid != $this->page->objectid ) // Rekursion vermeiden 627 { 628 $f = new Folder( $objectid ); 629 foreach( $f->getObjectIds() as $oid ) 630 { 631 if ( $oid != $this->page->objectid ) // Rekursion vermeiden 632 { 633 switch( $this->element->subtype ) 634 { 635 case '': 636 case 'inline': 637 $o = new BaseObject( $oid ); 638 $o->load(); 639 switch( $o->typeid ) 640 { 641 case BaseObject::TYPEID_PAGE: 642 $p = new Page( $oid ); 643 $p->enclosingObjectId = $this->page->id; 644 $p->public = $this->page->publisher->isPublic(); 645 $p->modelid = $this->page->modelid; 646 $p->languageid = $this->languageid; 647 $p->mime_type = $this->page->mimeType(); 648 $p->load(); 649 $p->generate(); 650 $inhalt .= $p->value; 651 unset( $p ); 652 break; 653 case BaseObject::TYPEID_LINK: 654 $l = new Link( $oid ); 655 $l->load(); 656 if ( $l->isLinkToObject ) 657 { 658 $op = new BaseObject( $l->linkedObjectId ); 659 $op->load(); 660 if ( $op->isPage ) 661 { 662 $p = new Page( $l->linkedObjectId ); 663 $p->enclosingObjectId = $this->page->id; 664 $p->public = $this->page->publisher->isPublic(); 665 $p->modelid = $this->page->modelid; 666 $p->languageid = $this->languageid; 667 $p->load(); 668 $p->generate(); 669 $inhalt .= $p->value; 670 unset( $p ); 671 } 672 } 673 break; 674 } 675 break; 676 677 case 'ssi': 678 $inhalt .= '<!--#include virtual="'.$this->page->path_to_object($oid).'" -->'; 679 break; 680 681 default: 682 $inhalt = '?'.$this->element->subtype.'?'; 683 } 684 } 685 else throw new \LogicException('FATAL: recursion detected'); 686 } 687 } 688 else throw new LogicException('FATAL: recursion detected'); 689 } 690 } 691 elseif ( $object->isPage ) 692 { 693 if ( $this->publisher->isSimplePreview() ) 694 { 695 $p = new Page( $objectid ); 696 $p->load(); 697 $inhalt = $p->filename; 698 unset( $p ); 699 } 700 else 701 { 702 if ( $objectid != $this->page->objectid ) // Rekursion vermeiden 703 { 704 switch( $this->element->subtype ) 705 { 706 case '': 707 case 'inline': 708 $p = new Page( $objectid ); 709 $p->enclosingObjectId = $this->page->id; 710 $p->publisher = $this->page->publisher; 711 $p->modelid = $this->page->modelid; 712 $p->languageid = $this->languageid; 713 $p->mime_type = $this->page->mimeType(); 714 $p->load(); 715 $p->generate(); 716 $inhalt = $p->value; 717 unset( $p ); 718 break; 719 720 case 'ssi': 721 $inhalt = '<!--#include virtual="'.$this->page->path_to_object($objectid).'" -->'; 722 break; 723 724 default: 725 $inhalt = '?'.$this->element->subtype.'?'; 726 break; 727 } 728 } 729 else throw new LogicException('FATAL: recursion detected'); 730 } 731 } 732 733 if ( $this->publisher->isSimplePreview() ) 734 { 735 $inhalt = strip_tags( $inhalt ); 736 $inhalt = str_replace( "\n",'',$inhalt ); 737 $inhalt = str_replace( "\r",'',$inhalt ); 738 } 739 740 break; 741 742 743 case Element::ELEMENT_TYPE_LINK: 744 745 $objectid = $this->linkToObjectId; 746 if ( intval($objectid) == 0 ) 747 $objectid = $this->element->defaultObjectId; 748 749 if ( $objectid==0 ) 750 { 751 // Link noch nicht gefuellt 752 $inhalt = ''; 753 } 754 elseif ( ! BaseObject::available($objectid) ) 755 { 756 $inhalt = $this->publisher->isSimplePreview()?'-':''; 757 } 758 elseif ( $this->publisher->isSimplePreview() ) 759 { 760 $o = new BaseObject( $objectid ); 761 $o->load(); 762 $inhalt = $o->filename; 763 } 764 elseif ($this->element->subtype == 'image_data_uri' ) 765 { 766 $file = new File($objectid); 767 $file->load(); 768 $inhalt = 'data:'.$file->mimeType().';base64,'.base64_encode($file->loadValue()); 769 } 770 else 771 { 772 $inhalt = $this->page->path_to_object( $objectid ); 773 } 774 775 break; 776 777 778 case Element::ELEMENT_TYPE_COPY: 779 780 list($linkElementName,$targetElementName) = explode('%',$this->element->name.'%'); 781 782 if ( empty($targetElementName) ) 783 break; 784 785 $element = new Element(); 786 $element->name = $linkElementName; 787 $element->load(); 788 789 if ( intval($element->elementid)==0 ) 790 break; 791 792 $linkValue = new Value(); 793 $linkValue->elementid = $element->elementid; 794 $linkValue->element = $element; 795 $linkValue->pageid = $this->pageid; 796 $linkValue->page = $this->page; 797 $linkValue->languageid = $this->languageid; 798 $linkValue->load(); 799 800 if ( !BaseObject::available( $linkValue->linkToObjectId ) ) 801 break; 802 803 $linkedPage = new Page( $linkValue->linkToObjectId ); 804 $linkedPage->load(); 805 806 $linkedPageTemplate = new Template( $linkedPage->templateid ); 807 $targetElementId = array_search( $targetElementName, $linkedPageTemplate->getElementNames() ); 808 809 if ( intval($targetElementId)==0 ) 810 break; 811 812 $targetValue = new Value(); 813 $targetValue->elementid = $targetElementId; 814 $targetValue->element = new Element($targetElementId); 815 $targetValue->element->load(); 816 $targetValue->pageid = $linkedPage->pageid; 817 $targetValue->page = $linkedPage; 818 $targetValue->generate(); 819 820 $inhalt = $targetValue->value; 821 822 break; 823 824 825 case Element::ELEMENT_TYPE_LINKINFO: 826 827 @list( $linkElementName, $name ) = explode('%',$this->element->name); 828 if ( is_null($name) ) 829 break; 830 831 $template = new Template( $this->page->templateid ); 832 $elementId = array_search( $linkElementName, $template->getElementNames() ); 833 834 835 $element = new Element($elementId); 836 $element->load(); 837 838 $linkValue = new Value(); 839 $linkValue->elementid = $element->elementid; 840 $linkValue->element = $element; 841 $linkValue->pageid = $this->pageid; 842 $linkValue->languageid = $this->languageid; 843 $linkValue->publisher = $this->publisher; 844 $linkValue->load(); 845 846 $objectid = $linkValue->linkToObjectId; 847 848 if ( intval($objectid) == 0 ) 849 $objectid = $linkValue->element->defaultObjectId; 850 851 if ( !BaseObject::available( $objectid ) ) 852 break; 853 854 $linkedObject = new BaseObject( $objectid ); 855 $linkedObject->languageid = $this->languageid; 856 $linkedObject->load(); 857 858 switch( $this->element->subtype ) 859 { 860 case 'width': 861 $f = new Image( $objectid ); 862 $f->load(); 863 if ( $f->isImage() ) 864 { 865 $f->getImageSize(); 866 $inhalt = $f->width; 867 } 868 unset($f); 869 break; 870 871 case 'height': 872 $f = new Image( $objectid ); 873 $f->load(); 874 if ( $f->isImage() ) 875 { 876 $f->getImageSize(); 877 $inhalt = $f->height; 878 } 879 unset($f); 880 break; 881 882 case 'id': 883 $inhalt = $objectid; 884 break; 885 886 case 'name': 887 $inhalt = $linkedObject->name; 888 break; 889 890 case 'description': 891 $inhalt = $linkedObject->description; 892 break; 893 894 case 'create_user_desc': 895 $user = $linkedObject->createUser; 896 try 897 { 898 $user->load(); 899 $inhalt = $user->desc; 900 } 901 catch( ObjectNotFoundException $e ) 902 { 903 } 904 break; 905 906 case 'create_user_fullname': 907 $user = $linkedObject->createUser; 908 try 909 { 910 $user->load(); 911 $inhalt = $user->fullname; 912 } 913 catch( ObjectNotFoundException $e ) 914 { 915 } 916 break; 917 918 case 'create_user_mail': 919 $user = $linkedObject->createUser; 920 try 921 { 922 $user->load(); 923 $inhalt = $user->mail; 924 } 925 catch( ObjectNotFoundException $e ) 926 { 927 } 928 break; 929 930 case 'create_user_tel': 931 $user = $linkedObject->createUser; 932 try 933 { 934 $user->load(); 935 $inhalt = $user->tel; 936 } 937 catch( ObjectNotFoundException $e ) 938 { 939 } 940 break; 941 942 case 'create_user_username': 943 $user = $linkedObject->createUser; 944 try 945 { 946 $user->load(); 947 $inhalt = $user->name; 948 } 949 catch( ObjectNotFoundException $e ) 950 { 951 } 952 break; 953 954 case 'lastch_user_desc': 955 $user = $linkedObject->lastchangeUser; 956 try 957 { 958 $user->load(); 959 $inhalt = $user->desc; 960 } 961 catch( ObjectNotFoundException $e ) 962 { 963 } 964 break; 965 966 case 'lastch_user_fullname': 967 $user = $linkedObject->lastchangeUser; 968 try 969 { 970 $user->load(); 971 $inhalt = $user->fullname; 972 } 973 catch( ObjectNotFoundException $e ) 974 { 975 } 976 break; 977 978 case 'lastch_user_mail': 979 $user = $linkedObject->lastchangeUser; 980 try 981 { 982 $user->load(); 983 $inhalt = $user->mail; 984 } 985 catch( ObjectNotFoundException $e ) 986 { 987 } 988 break; 989 990 case 'lastch_user_tel': 991 $user = $linkedObject->lastchangeUser; 992 try 993 { 994 $user->load(); 995 $inhalt = $user->tel; 996 } 997 catch( ObjectNotFoundException $e ) 998 { 999 } 1000 1001 break; 1002 1003 case 'lastch_user_username': 1004 $user = $linkedObject->lastchangeUser; 1005 try 1006 { 1007 $user->load(); 1008 $inhalt = $user->name; 1009 } 1010 catch( ObjectNotFoundException $e ) 1011 { 1012 } 1013 break; 1014 1015 case 'mime-type': 1016 if ( $linkedObject->isFile || $linkedObject->isImage || $linkedObject->isText ) 1017 { 1018 $f = new File( $objectid ); 1019 $f->load(); 1020 $inhalt = $f->mimeType(); 1021 unset($f); 1022 } 1023 break; 1024 1025 case 'filename': 1026 $inhalt = $linkedObject->filename(); 1027 break; 1028 1029 case 'full_filename': 1030 $inhalt = $linkedObject->full_filename(); 1031 break; 1032 1033 default: 1034 $inhalt = ''; 1035 Logger::error('subtype for linkinfo not implemented:'.$this->element->subtype); 1036 } 1037 1038 break; 1039 1040 case Element::ELEMENT_TYPE_LINKDATE: 1041 1042 @list( $linkElementName, $name ) = explode('%',$this->element->name); 1043 if ( is_null($name) ) 1044 break; 1045 1046 $template = new Template( $this->page->templateid ); 1047 $elementId = array_search( $linkElementName, $template->getElementNames() ); 1048 1049 $element = new Element($elementId); 1050 $element->load(); 1051 1052 $linkValue = new Value(); 1053 $linkValue->elementid = $element->elementid; 1054 $linkValue->element = $element; 1055 $linkValue->pageid = $this->pageid; 1056 $linkValue->languageid = $this->languageid; 1057 $linkValue->load(); 1058 1059 $objectid = $linkValue->linkToObjectId; 1060 1061 if ( intval($objectid) == 0 ) 1062 $objectid = $linkValue->element->defaultObjectId; 1063 1064 if ( !BaseObject::available( $objectid ) ) 1065 break; 1066 1067 $linkedObject = new BaseObject( $objectid ); 1068 $linkedObject->load(); 1069 1070 1071 switch( $this->element->subtype ) 1072 { 1073 case 'date_published': 1074 // START_TIME wird zu Beginn im Controller gesetzt. 1075 // So erh�lt jede Datei das gleiche Ver�ffentlichungsdatum. 1076 $date = START_TIME; 1077 break; 1078 1079 case 'date_saved': 1080 $date = $linkedObject->lastchangeDate; 1081 break; 1082 1083 case 'date_created': 1084 $date = $linkedObject->createDate; 1085 break; 1086 1087 default: 1088 Logger::warn('element:'.$this->element->name.', '. 1089 'type:'.$this->element->type.', '. 1090 'unknown subtype:'.$this->element->subtype); 1091 $date = START_TIME; 1092 } 1093 1094 if ( strpos($this->element->dateformat,'%')!==FALSE ) 1095 $inhalt = strftime( $this->element->dateformat,$date ); 1096 else 1097 $inhalt = date ( $this->element->dateformat,$date ); 1098 break; 1099 1100 case Element::ELEMENT_TYPE_LONGTEXT: 1101 case Element::ELEMENT_TYPE_TEXT: 1102 case Element::ELEMENT_TYPE_SELECT: 1103 1104 $inhalt = $this->text; 1105 $format = $this->format; 1106 1107 // Wenn Inhalt leer, dann versuchen, den Inhalt der Default-Sprache zu laden. 1108 if ( $inhalt == '' && $conf['content']['language']['use_default_language'] ) 1109 { 1110 $project = new Project($this->page->projectid); 1111 $this->languageid = $project->getDefaultLanguageId(); 1112 $this->load(); 1113 $inhalt = $this->text; 1114 } 1115 1116 // Wenn Inhalt leer, dann Vorbelegung verwenden 1117 if ( $inhalt == '' ) { 1118 1119 $inhalt = $this->element->defaultText; 1120 $format = $this->element->format; 1121 } 1122 1123 // Wenn HTML nicht erlaubt und Wiki-Formatierung aktiv, dann einfache HTML-Tags in Wiki umwandeln 1124 $pageIsHtml = $this->page->isHtml(); 1125 1126 // 1127 switch( $format ) 1128 { 1129 case Element::ELEMENT_FORMAT_TEXT: 1130 case Element::ELEMENT_FORMAT_HTML: 1131 1132 if ( !$this->element->html ) 1133 { 1134 // HTML not allowed. 1135 $inhalt = Text::encodeHtml( $inhalt ); 1136 $inhalt = Text::encodeHtmlSpecialChars( $inhalt ); 1137 } 1138 1139 break; 1140 1141 case Element::ELEMENT_FORMAT_WIKI: 1142 1143 if ( $conf['editor']['wiki']['convert_bbcode'] ) 1144 $inhalt = Text::bbCode2Wiki( $inhalt ); 1145 1146 if ( !$this->element->html && $conf['editor']['wiki']['convert_html'] && $pageIsHtml) 1147 $inhalt = Text::html2Wiki( $inhalt ); 1148 1149 $transformer = new Transformer(); 1150 $transformer->text = $inhalt; 1151 $transformer->page = $this->page; 1152 $transformer->element = $this->element; 1153 1154 $transformer->transform(); 1155 $inhalt = $transformer->text; 1156 break; 1157 1158 case Element::ELEMENT_FORMAT_MARKDOWN: 1159 1160 $mdConfig = Config()->subset('editor')->subset('markdown'); 1161 1162 $parser = new \Parsedown(); 1163 $parser->setUrlsLinked( $mdConfig->is('urls-linked',true)); 1164 $parser->setMarkupEscaped( !$this->element->html ); 1165 1166 $inhalt = $parser->parse( $inhalt ); 1167 break; 1168 1169 default: 1170 throw new \LogicException('Unknown format: '.$this->format ); 1171 } 1172 1173 if ( $this->publisher->isSimplePreview() ) 1174 { 1175 // Simple Preview with bare text. 1176 $inhalt = strip_tags( $inhalt ); 1177 $inhalt = str_replace( "\n",'',$inhalt ); 1178 $inhalt = str_replace( "\r",'',$inhalt ); 1179 } 1180 1181 // "__OID__nnn__" ersetzen durch einen richtigen Link 1182 foreach( Text::parseOID($inhalt) as $oid=>$t ) 1183 { 1184 $url = $this->page->path_to_object($oid); 1185 1186 foreach( $t as $match ) 1187 $inhalt = str_replace($match,$url,$inhalt); 1188 } 1189 1190 break; 1191 1192 1193 // Zahl 1194 // 1195 // wird im entsprechenden Format angezeigt. 1196 case Element::ELEMENT_TYPE_NUMBER: 1197 1198 if ( $this->number == 0 ) 1199 { 1200 // Zahl ist gleich 0, dann Default-Text 1201 $inhalt = $this->element->defaultText; 1202 break; 1203 } 1204 1205 $number = $this->number / pow(10,$this->element->decimals); 1206 $inhalt = number_format( $number,$this->element->decimals,$this->element->decPoint,$this->element->thousandSep ); 1207 1208 break; 1209 1210 1211 // Datum 1212 case Element::ELEMENT_TYPE_DATE: 1213 1214 $date = $this->date; 1215 1216 if ( intval($date) == 0 ) 1217 { 1218 // Datum wurde noch nicht eingegeben 1219 $inhalt = $this->element->defaultText; 1220 break; 1221 } 1222 1223 // Datum gemaess Elementeinstellung formatieren 1224 if ( strpos($this->element->dateformat,'%')!==FALSE ) 1225 $inhalt = strftime( $this->element->dateformat,$date ); 1226 else 1227 $inhalt = date ( $this->element->dateformat,$date ); 1228 break; 1229 1230 1231 // Programmcode (PHP) 1232 case Element::ELEMENT_TYPE_CODE: 1233 1234 if ( $this->publisher->isSimplePreview() ) 1235 break; 1236 1237 // Die Ausführung von benutzer-erzeugtem PHP-Code kann in der 1238 // Konfiguration aus Sicherheitsgründen deaktiviert sein. 1239 if ( $conf['security']['disable_dynamic_code'] ) 1240 { 1241 Logger::warn("Execution of dynamic code elements is disabled by configuration. Set security/disable_dynamic_code to true to allow this"); 1242 break; 1243 } 1244 1245 $this->page->load(); 1246 1247 // Das Ausführen geschieht über die Klasse "Code". 1248 // In dieser wird der Code in eine Datei geschrieben und 1249 // von dort eingebunden. 1250 $code = new Code(); 1251 $code->setContextPage($this->page ); 1252 $code->code = $this->element->code; 1253 1254 ob_start(); 1255 1256 // Jetzt ausfuehren des temporaeren PHP-Codes 1257 $code->execute(); 1258 1259 $output = ob_get_contents(); 1260 ob_end_clean(); 1261 1262 // Ausgabe ermitteln. 1263 $inhalt = $output; 1264 1265 1266 break; 1267 1268 1269 // Makros (dynamische Klassen) 1270 case Element::ELEMENT_TYPE_DYNAMIC: 1271 1272 if ( $this->publisher->isSimplePreview() ) 1273 break; 1274 1275 $this->page->load(); 1276 $macroName = $this->element->subtype; 1277 $macroSettings = $this->element->getDynamicParameters(); 1278 1279 $runner = new MacroRunner(); 1280 try { 1281 $inhalt .= $runner->executeMacro($macroName, $macroSettings,$this->page); 1282 } 1283 catch( \OpenRatException $e ) { 1284 if ( !$this->publisher->isPublic() ) 1285 $inhalt = lang($e->key).' ('.$e->getMessage().')'; // Inform the viewer 1286 else 1287 ; // Keep empty value in public mode. 1288 } 1289 1290 // Wenn HTML-Ausgabe, dann Sonderzeichen in HTML �bersetzen 1291 if ( $this->page->isHtml() ) 1292 $inhalt = Text::encodeHtmlSpecialChars( $inhalt ); 1293 1294 break; 1295 1296 1297 // Info-Feld als Datum 1298 case Element::ELEMENT_TYPE_INFODATE: 1299 1300 if ( $this->publisher->isSimplePreview() ) 1301 break; 1302 1303 switch( $this->element->subtype ) 1304 { 1305 case 'date_published': 1306 // START_TIME wird zu Beginn im Controller gesetzt. 1307 // So erh�lt jede Datei das gleiche Ver�ffentlichungsdatum. 1308 $date = START_TIME; 1309 break; 1310 1311 case 'date_saved': 1312 $date = $this->page->lastchangeDate; 1313 break; 1314 1315 case 'date_created': 1316 $date = $this->page->createDate; 1317 break; 1318 1319 default: 1320 Logger::warn('element:'.$this->element->name.', '. 1321 'type:'.$this->element->type.', '. 1322 'unknown subtype:'.$this->element->subtype); 1323 if ( !$this->publisher->isPublic() ) 1324 $inhalt = lang('ERROR_IN_ELEMENT'); 1325 } 1326 1327 if ( strpos($this->element->dateformat,'%')!==FALSE ) 1328 $inhalt = strftime( $this->element->dateformat,$date ); 1329 else 1330 $inhalt = date ( $this->element->dateformat,$date ); 1331 1332 break; 1333 1334 1335 // Info-Feld 1336 case Element::ELEMENT_TYPE_INFO: 1337 1338 if ( $this->publisher->isSimplePreview() ) 1339 break; 1340 1341 switch( $this->element->subtype ) 1342 { 1343 case 'db_id': 1344 $inhalt = $SESS['dbid']; 1345 break; 1346 case 'db_name': 1347 $inhalt = $conf['database_'.$SESS['dbid']]['description']; 1348 break; 1349 case 'project_id': 1350 $inhalt = $this->page->projectid; 1351 break; 1352 case 'project_name': 1353 $inhalt = Project::create( $this->page->projectid )->load()->name; 1354 break; 1355 case 'language_id': 1356 $inhalt = $this->page->languageid; 1357 break; 1358 case 'language_iso': 1359 $language = new Language( $this->page->languageid ); 1360 $language->load(); 1361 $inhalt = $language->isoCode; 1362 break; 1363 case 'language_name': 1364 $language = new Language( $this->page->languageid ); 1365 $language->load(); 1366 $inhalt = $language->name; 1367 break; 1368 case 'page_id': 1369 $inhalt = $this->page->objectid; 1370 break; 1371 case 'page_name': 1372 $inhalt = $this->page->name; 1373 break; 1374 case 'page_desc': 1375 $inhalt = $this->page->desc; 1376 break; 1377 case 'page_fullfilename': 1378 $inhalt = $this->page->full_filename(); 1379 break; 1380 case 'page_filename': 1381 $inhalt = $this->page->filename(); 1382 break; 1383 case 'page_extension': 1384 $inhalt = ''; 1385 break; 1386 case 'edit_url': 1387 $raw = true; 1388 $db = \Session::getDatabase(); 1389 $inhalt = Html::url('page',null,$this->page->objectid,array('dbid'=>$db->id)); 1390 break; 1391 case 'edit_fullurl': 1392 $raw = true; 1393 $inhalt = Http::getServer(); 1394 1395 // Der Link soll nicht auf die API, sondern auf das UI zeigen. 1396 if ( substr($inhalt,-4) == 'api/' ) 1397 $inhalt = substr($inhalt,0,-4); 1398 1399 $db = db(); 1400 $inhalt .= '/#/page/'.$this->page->objectid; 1401 break; 1402 case 'lastch_user_username': 1403 $user = $this->page->lastchangeUser; 1404 if ( $user->userid ) 1405 $user->load(); 1406 $inhalt = $user->name; 1407 break; 1408 case 'lastch_user_fullname': 1409 $user = $this->page->lastchangeUser; 1410 if ( $user->userid ) 1411 $user->load(); 1412 $inhalt = $user->fullname; 1413 break; 1414 case 'lastch_user_mail': 1415 $user = $this->page->lastchangeUser; 1416 if ( $user->userid ) 1417 $user->load(); 1418 $inhalt = $user->mail; 1419 break; 1420 case 'lastch_user_desc': 1421 $user = $this->page->lastchangeUser; 1422 if ( $user->userid ) 1423 $user->load(); 1424 $inhalt = $user->desc; 1425 break; 1426 case 'lastch_user_tel': 1427 $user = $this->page->lastchangeUser; 1428 if ( $user->userid ) 1429 $user->load(); 1430 $inhalt = $user->tel; 1431 break; 1432 1433 case 'create_user_username': 1434 $user = $this->page->createUser; 1435 if ( $user->userid ) 1436 $user->load(); 1437 $inhalt = $user->name; 1438 break; 1439 case 'create_user_fullname': 1440 $user = $this->page->createUser; 1441 if ( $user->userid ) 1442 $user->load(); 1443 $inhalt = $user->fullname; 1444 break; 1445 case 'create_user_mail': 1446 $user = $this->page->createUser; 1447 if ( $user->userid ) 1448 $user->load(); 1449 $inhalt = $user->mail; 1450 break; 1451 case 'create_user_desc': 1452 $user = $this->page->createUser; 1453 if ( $user->userid ) 1454 $user->load(); 1455 $inhalt = $user->desc; 1456 break; 1457 case 'create_user_tel': 1458 $user = $this->page->createUser; 1459 if ( $user->userid ) 1460 $user->load(); 1461 $inhalt = $user->tel; 1462 break; 1463 1464 case 'act_user_username': 1465 $user = \Session::getUser(); 1466 if ( $user ) 1467 $inhalt = $user->name; 1468 break; 1469 case 'act_user_fullname': 1470 $user = \Session::getUser(); 1471 if ( $user ) 1472 $inhalt = $user->fullname; 1473 break; 1474 case 'act_user_mail': 1475 $user = \Session::getUser(); 1476 if ( $user ) 1477 $inhalt = $user->mail; 1478 break; 1479 case 'act_user_desc': 1480 $user = \Session::getUser(); 1481 if ( $user ) 1482 $inhalt = $user->desc; 1483 break; 1484 case 'act_user_tel': 1485 $user = \Session::getUser(); 1486 if ( $user ) 1487 $inhalt = $user->tel; 1488 break; 1489 default: 1490 Logger::warn('element:'.$this->element->name.', '. 1491 'type:'.$this->element->type.', '. 1492 'unknown subtype:'.$this->element->subtype); 1493 // Keine Fehlermeldung in erzeugte Seite schreiben. 1494 } 1495 1496 break; 1497 1498 default: 1499 // this should never happen in production. 1500 if ( ! $this->publisher->isPublic() ) 1501 // inform the user. 1502 throw new \LogicException( 'Error in element '.$this->element->name.': '. 1503 'unknown type: '.$this->element->typeid.''); 1504 else 1505 ; // do not crash the public publishing process. 1506 1507 } 1508 1509 1510 switch( $this->element->type ) 1511 { 1512 case 'longtext': 1513 case 'text': 1514 case 'select': 1515 1516 if ( $conf['publish']['encode_utf8_in_html'] ) 1517 // Wenn HTML-Ausgabe, dann UTF-8-Zeichen als HTML-Code uebersetzen 1518 if ( $this->page->isHtml() ) 1519 $inhalt = translateutf8tohtml($inhalt); 1520 break; 1521 1522 default: 1523 } 1524 1525 1526 1527 if ( $this->page->icons && $this->element->withIcon && $this->page->isHtml() ) 1528 { 1529 // Anklickbaren Link voranstellen. 1530 $iconLink = '<a href="javascript:parent.openNewAction(\''.$this->element->name.'\',\'pageelement\',\''.$this->page->objectid.'_'.$this->element->elementid.'\');" title="'.$this->element->desc.'"><img src="'.OR_THEMES_DIR.$conf['interface']['theme'].'/images/icon_el_'.$this->element->type.IMG_ICON_EXT.'" border="0" align="left"></a>'; 1531 $inhalt = $iconLink.$inhalt; 1532 } 1533 1534 $this->value = $inhalt; 1535 1536 return $this->value; 1537 } 1538 1539 1540 /** 1541 * Es werden Objekte mit einem Inhalt gesucht. 1542 * @param String Suchbegriff 1543 * @return Array Liste der gefundenen Objekt-IDs 1544 */ 1545 function getObjectIdsByValue( $text ) 1546 { 1547 $db = db_connection(); 1548 1549 $sql = $db->sql( 'SELECT {{object}}.id FROM {{value}} '. 1550 ' LEFT JOIN {{page}} '. 1551 ' ON {{page}}.id={{value}}.pageid '. 1552 ' LEFT JOIN {{object}} '. 1553 ' ON {{object}}.id={{page}}.objectid '. 1554 ' WHERE {{value}}.text LIKE {text}'. 1555 ' AND {{value}}.languageid={languageid}'. 1556 ' ORDER BY {{object}}.lastchange_date DESC' ); 1557 1558 $sql->setInt ( 'languageid',$this->languageid ); 1559 $sql->setString( 'text' ,'%'.$text.'%' ); 1560 return $sql->getCol(); 1561 } 1562 1563 1564 /** 1565 * Es werden Objekte mit einer UserId ermittelt 1566 * @param Integer Benutzer-Id der letzten ?nderung 1567 * @return Array Liste der gefundenen Objekt-IDs 1568 */ 1569 function getObjectIdsByLastChangeUserId( $userid ) 1570 { 1571 1572 $db = db_connection(); 1573 1574 $sql = $db->sql( 'SELECT {{object}}.id FROM {{value}} '. 1575 ' LEFT JOIN {{page}} '. 1576 ' ON {{page}}.id={{value}}.pageid '. 1577 ' LEFT JOIN {{object}} '. 1578 ' ON {{object}}.id={{page}}.objectid '. 1579 ' WHERE {{value}}.lastchange_userid={userid}'. 1580 ' AND {{value}}.languageid={languageid}'. 1581 ' ORDER BY {{object}}.lastchange_date DESC' ); 1582 $sql->setInt ( 'languageid',$this->languageid ); 1583 $sql->setInt ( 'userid' ,$userid ); 1584 1585 return $sql->getCol(); 1586 } 1587 1588 1589 1590 /** 1591 * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat. 1592 * 1593 * @return Integer Objekt-Id 1594 */ 1595 public static function getLastChangedObjectByUserId( $userid ) 1596 { 1597 $db = db_connection(); 1598 1599 $sql = $db->sql( <<<SQL 1600 SELECT {{object}}.id 1601 FROM {{value}} 1602 LEFT JOIN {{page}} 1603 ON {{page}}.id={{value}}.pageid 1604 LEFT JOIN {{object}} 1605 ON {{object}}.id={{page}}.objectid 1606 WHERE {{value}}.lastchange_userid={userid} 1607 ORDER BY {{value}}.lastchange_date DESC 1608 SQL 1609 ); 1610 $sql->setInt ( 'userid' ,$userid ); 1611 return $sql->getOne(); 1612 } 1613 1614 1615 /** 1616 * Es wird das Objekt ermittelt, welches der Benutzer zuletzt ge�ndert hat. 1617 * 1618 * @return Integer Objekt-Id 1619 */ 1620 public static function getLastChangedObjectInProjectByUserId( $projectid, $userid ) 1621 { 1622 $db = db_connection(); 1623 1624 $sql = $db->sql( <<<SQL 1625 SELECT {{object}}.id 1626 FROM {{value}} 1627 LEFT JOIN {{page}} 1628 ON {{page}}.id={{value}}.pageid 1629 LEFT JOIN {{object}} 1630 ON {{object}}.id={{page}}.objectid 1631 WHERE {{value}}.lastchange_userid={userid} 1632 AND {{object}}.projectid = {projectid} 1633 ORDER BY {{value}}.lastchange_date DESC 1634 SQL 1635 ); 1636 $sql->setInt ( 'userid' ,$userid ); 1637 $sql->setInt ( 'projectid' ,$projectid ); 1638 return $sql->getOne(); 1639 } 1640 1641 1642 /** 1643 * Ermittelt einen tempor�ren Dateinamen f�r diesen Inhalt. 1644 */ 1645 function tmpfile() 1646 { 1647 $db = db_connection(); 1648 $filename = \FileUtils::getTempFileName( ); 1649 return $filename; 1650 } 1651 1652 1653 1654 /** 1655 * Ermittelt den unbearbeiteten, "rohen" Inhalt. 1656 * 1657 * @return mixed Inhalt 1658 */ 1659 public function getRawValue() 1660 { 1661 switch( $this->element->typeid ) 1662 { 1663 case Element::ELEMENT_TYPE_LINK: 1664 return $this->linkToObjectId; 1665 1666 case Element::ELEMENT_TYPE_DATE; 1667 return $this->date; 1668 1669 default: 1670 return $this->text; 1671 } 1672 } 1673 1674 1675 public function getName() 1676 { 1677 return ''; 1678 } 1679 1680 1681 public function __toString() 1682 { 1683 return "Value: ".print_r($this,true); 1684 } 1685 }