openrat-cms

# OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs

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 }