openrat-cms

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

PageAction.class.php (23936B)


      1 <?php
      2 
      3 namespace cms\action;
      4 
      5 use cms\model\Acl;
      6 use cms\model\Project;
      7 use cms\model\Value;
      8 use cms\model\Element;
      9 use cms\model\Template;
     10 use cms\model\Page;
     11 use cms\model\Folder;
     12 use cms\model\BaseObject;
     13 use cms\model\Language;
     14 use cms\model\Model;
     15 use cms\publish\PublishPreview;
     16 use cms\publish\PublishPublic;
     17 use \Html;
     18 use Http;
     19 use Logger;
     20 use Session;
     21 
     22 
     23 /**
     24  * Action-Klasse zum Bearbeiten einer Seite
     25  * @author $Author$
     26  * @version $Revision$
     27  * @package openrat.actions
     28  */
     29 
     30 class PageAction extends ObjectAction
     31 {
     32 	public $security = Action::SECURITY_USER;
     33 
     34     /**
     35      * @var Page
     36      */
     37 	private $page;
     38 
     39 
     40 	function __construct()
     41 	{
     42 	    parent::__construct();
     43 
     44     }
     45 
     46 
     47     public function init()
     48     {
     49         $page = new Page( $this->getRequestId() );
     50 
     51 		if  ( $this->request->hasLanguageId())
     52 		    $page->languageid = $this->request->getLanguageId();
     53 
     54 		if  ( $this->request->hasModelId())
     55 		    $page->modelid = $this->request->getModelId();
     56 
     57 		$page->load();
     58 
     59         if  ( !$page->languageid )
     60             $page->languageid = $page->getProject()->getDefaultLanguageId();
     61 
     62         if  ( !$page->modelid )
     63             $page->modelid = $page->getProject()->getDefaultModelId();
     64 
     65 		// Hier kann leider nicht das Datum der letzten Änderung verwendet werden,
     66 		// da sich die Seite auch danach ändern kann, z.B. durch Includes anderer
     67 		// Seiten oder Änderung einer Vorlage oder Änderung des Dateinamens einer
     68 		// verlinkten Datei.
     69 		$this->lastModified( time() );
     70 
     71 		$this->setBaseObject($page);
     72     }
     73 
     74 
     75 
     76 	protected function setBaseObject($folder ) {
     77 
     78 		$this->page = $folder;
     79 
     80 		parent::setBaseObject( $folder );
     81 	}
     82 
     83 
     84 	/**
     85 	 * Alle Daten aus dem Formular speichern
     86 	 */
     87 	function formPost()
     88 	{
     89 		$this->page->public = true;
     90 		$this->page->simple = true;
     91 
     92 		foreach( $this->page->getElements() as $elementid=>$name )
     93 		{
     94 			if   ( $this->hasRequestVar('saveid'.$elementid) )
     95 			{
     96 				$value = new Value();
     97 				$value->objectid   = $this->page->objectid;
     98 				$value->pageid     = Page::getPageIdFromObjectId( $value->objectid );
     99 				$value->element = new Element( $elementid );
    100 				$value->element->load();
    101 				$value->load();
    102 
    103 				// Eingegebenen Inhalt aus dem Request lesen
    104 				$inhalt  = $this->getRequestVar( 'id'.$elementid );
    105 
    106 				// Den Inhalt speichern.
    107 				switch( $value->element->type )
    108 				{
    109 					case 'number':
    110 						$value->number = $inhalt * pow(10,$value->element->decimals);
    111 						break;
    112 
    113 					case 'date':
    114 						$value->date = strtotime( $inhalt );
    115 						break;
    116 
    117 					case 'text':
    118 					case 'longtext':
    119 					case 'select':
    120 						$value->text = $inhalt;
    121 						break;
    122 
    123 					case 'link':
    124 					case 'list':
    125 					case 'insert':
    126 						$value->linkToObjectId = intval($inhalt);
    127 						break;
    128 				}
    129 
    130 				$value->page = &$this->page;
    131 
    132 				// Ermitteln, ob Inhalt sofort freigegeben werden kann und soll
    133 				if	( $this->page->hasRight( Acl::ACL_RELEASE ) && $this->hasRequestVar('release') )
    134 					$value->publish = true;
    135 				else
    136 					$value->publish = false;
    137 
    138 //				Html::debug($inhalt,'Eingabe');
    139 //				Html::debug($value,'Inhalt');
    140 
    141 				// Inhalt speichern.
    142 				// Inhalt in allen Sprachen gleich?
    143 				if	( $value->element->allLanguages )
    144 				{
    145 					// Inhalt fuer jede Sprache einzeln speichern.
    146 					$p = new Project();
    147 					foreach( $p->getLanguageIds() as $languageid )
    148 					{
    149 						$value->languageid = $languageid;
    150 						$value->save();
    151 					}
    152 				}
    153 				else
    154 				{
    155 					// sonst nur 1x speichern (fuer die aktuelle Sprache)
    156 					$value->languageid = $this->getSessionVar(REQ_PARAM_LANGUAGE_ID);
    157 					$value->save();
    158 				}
    159 			}
    160 		}
    161 		$this->page->setTimestamp(); // "Letzte Aenderung" setzen
    162 
    163 		if	( $this->hasRequestVar('publish') )
    164 			$this->callSubAction( 'pubnow' );
    165 		else
    166 			$this->callSubAction( 'el' );
    167 	}
    168 
    169 
    170 	/**
    171 	 * Element speichern
    172 	 *
    173 	 * Der Inhalt eines Elementes wird abgespeichert
    174 	 */
    175 	function editPost()
    176 	{
    177 		$value = new Value();
    178 		$value->languageid = $this->page->languageid;
    179 		$value->objectid   = $this->page->objectid;
    180 		$value->pageid     = Page::getPageIdFromObjectId( $this->page->objectid );
    181 
    182 		if	( ! $this->hasRequestVar('elementid') )
    183             $this->addValidationError('elementid' );
    184 
    185         $value->element = new Element( $this->getRequestVar('elementid') );
    186 
    187 		$value->element->load();
    188 		$value->load();
    189 
    190 		$value->number         = $this->getRequestVar('number') * pow(10,$value->element->decimals);
    191 		$value->linkToObjectId = intval($this->getRequestVar('linkobjectid'));
    192 		$value->text           = $this->getRequestVar('text');
    193 
    194 		// Vorschau anzeigen
    195 		if	( $value->element->type=='longtext' && ($this->hasRequestVar('preview')||$this->hasRequestVar('addmarkup')) )
    196 		{
    197 			if	( $this->hasRequestVar('preview') )
    198 			{
    199 				$value->page             = $this->page;
    200 				$value->simple           = false;
    201 				$value->page->languageid = $value->languageid;
    202 				$value->page->load();
    203 				$value->generate();
    204 				$this->setTemplateVar('preview_text',$value->value );
    205 			}
    206 
    207 			if	( $this->hasRequestVar('addmarkup') )
    208 			{
    209 				$addText = $this->getRequestVar('addtext');
    210 
    211 				if	( !empty($addText) ) // Nur, wenn ein Text eingegeben wurde
    212 				{
    213 					$addText = $this->getRequestVar('addtext');
    214 
    215 					if	( $this->hasRequestVar('strong') )
    216 						$value->text .= '*'.$addText.'*';
    217 
    218 					if	( $this->hasRequestVar('emphatic') )
    219 						$value->text .= '_'.$addText.'_';
    220 
    221 					if	( $this->hasRequestVar('link') )
    222 						$value->text .= '"'.$addText.'"->"'.$this->getRequestVar('objectid').'"';
    223 				}
    224 
    225 				if	( $this->hasRequestVar('table') )
    226 					$value->text .= "|$addText  |  |\n|$addText  |  |\n|$addText  |  |\n";
    227 
    228 				if	( $this->hasRequestVar('list') )
    229 					$value->text .= "\n- ".$addText."\n".'- '.$addText."\n".'- '.$addText."\n";
    230 
    231 				if	( $this->hasRequestVar('numlist') )
    232 					$value->text .= "\n# ".$addText."\n".'# '.$addText."\n".'# '.$addText."\n";
    233 
    234 				if	( $this->hasRequestVar('image') )
    235 					$value->text .= '{'.$this->getRequestVar('objectid').'}';
    236 			}
    237 
    238 			// Ermitteln aller verlinkbaren Objekte (fuer Editor)
    239 			$objects = array();
    240 
    241 			foreach( Folder::getAllObjectIds() as $id )
    242 			{
    243 				$o = new BaseObject( $id );
    244 				$o->load();
    245 
    246 				if	( $o->getType() != 'folder' )
    247 				{
    248 					$f = new Folder( $o->parentid );
    249 					$objects[ $id ]  = lang( 'GLOBAL_'.$o->getType() ).': ';
    250 					$objects[ $id ] .=  implode( FILE_SEP,$f->parentObjectNames(false,true) );
    251 					$objects[ $id ] .= FILE_SEP.$o->name;
    252 				}
    253 			}
    254 			asort($objects);
    255 			$this->setTemplateVar( 'objects' ,$objects );
    256 
    257 			$this->setTemplateVar( 'release' ,$this->page->hasRight(Acl::ACL_RELEASE) );
    258 			$this->setTemplateVar( 'publish' ,$this->page->hasRight(Acl::ACL_PUBLISH) );
    259 			$this->setTemplateVar( 'html'    ,$value->element->html );
    260 			$this->setTemplateVar( 'wiki'    ,$value->element->wiki );
    261 			$this->setTemplateVar( 'text'    ,$value->text          );
    262 			$this->setTemplateVar( 'name'    ,$value->element->name );
    263 			$this->setTemplateVar( 'desc'    ,$value->element->desc );
    264 			$this->setTemplateVar( 'objectid',$this->page->objectid );
    265 			return;
    266 		}
    267 
    268 		if	( $this->hasRequestVar('year') ) // Wird ein Datum gespeichert?
    269 		{
    270 			// Wenn ein ANSI-Datum eingegeben wurde, dann dieses verwenden
    271 			if   ( $this->getRequestVar('ansidate') != $this->getRequestVar('ansidate_orig') )
    272 				$value->date = strtotime($this->getRequestVar('ansidate') );
    273 			else
    274 				// Sonst die Zeitwerte einzeln zu einem Datum zusammensetzen
    275 				$value->date = mktime( $this->getRequestVar('hour'  ),
    276 				                       $this->getRequestVar('minute'),
    277 				 	                   $this->getRequestVar('second'),
    278 				 	                   $this->getRequestVar('month' ),
    279 					                   $this->getRequestVar('day'   ),
    280 					                   $this->getRequestVar('year'  ) );
    281 		}
    282 		else $value->date = 0; // Datum nicht gesetzt.
    283 
    284 		$value->text = $this->getRequestVar('text');
    285 
    286 		$value->page = new Page( $value->objectid );
    287 		$value->page->load();
    288 
    289 		// Inhalt sofort freigegeben, wenn
    290 		// - Recht vorhanden
    291 		// - Freigabe gewuenscht
    292 		if	( $value->page->hasRight( Acl::ACL_RELEASE ) && $this->getRequestVar('release')!='' )
    293 			$value->publish = true;
    294 		else
    295 			$value->publish = false;
    296 
    297 		// Inhalt speichern
    298 
    299 		// Wenn Inhalt in allen Sprachen gleich ist, dann wird der Inhalt
    300 		// fuer jede Sprache einzeln gespeichert.
    301 		if	( $value->element->allLanguages )
    302 		{
    303 			$project = new Project( $this->page->projectid );
    304 			foreach( $project->getLanguageIds() as $languageid )
    305 			{
    306 				$value->languageid = $languageid;
    307 				$value->save();
    308 			}
    309 		}
    310 		else
    311 		{
    312 			// sonst nur 1x speichern (fuer die aktuelle Sprache)
    313 			$value->save();
    314 		}
    315 
    316 		$this->page->setTimestamp(); // "Letzte Aenderung" setzen
    317 
    318 		// Falls ausgewaehlt die Seite sofort veroeffentlichen
    319 		if	( $this->hasRequestVar('publish') )
    320 			$this->callSubAction( 'pubnow' ); // Weiter zum veroeffentlichen
    321 		else
    322 			$this->callSubAction( 'el' ); // Element-Liste anzeigen
    323 	}
    324 
    325 
    326 
    327 	/**
    328 	 * Die Eigenschaften der Seite anzeigen
    329 	 */
    330 	function infoView()
    331 	{
    332 		$this->setTemplateVar('id',$this->page->objectid);
    333 
    334 		$this->page->publisher = new PublishPublic( $this->page->projectid );
    335 		$this->page->load();
    336 		$this->page->full_filename();
    337 
    338 		if	( $this->page->filename == $this->page->objectid )
    339 			$this->page->filename = '';
    340 
    341 		$this->setTemplateVars( $this->page->getProperties() );
    342 
    343         $alias = $this->page->getAliasForLanguage(null);
    344         $this->setTemplateVar( 'alias', $alias->full_filename() );
    345 
    346         $languages = $this->page->getProject()->getLanguages();
    347         $languagesVars = array();
    348 
    349         foreach( $languages as $id => $name )
    350         {
    351             $this->page->languageid = $id;
    352             $this->page->load();
    353 
    354             $languagesVar = $this->page->getProperties();
    355             $languagesVar['languagename'] = $name;
    356             $languagesVar['languageid'  ] = $id;
    357             $alias = $this->page->getAliasForLanguage( $id );
    358             $languagesVar['alias'       ] = $alias->full_filename();
    359 
    360             $languagesVars[] = $languagesVar;
    361 
    362         }
    363 
    364         $this->setTemplateVar('languages',$languagesVars );
    365 
    366         if   ( $this->userIsProjectAdmin() )
    367 		{
    368 			$this->setTemplateVar('templateid',$this->page->templateid);
    369 			$this->setTemplateVar('modelid',$this->page->modelid);
    370 		}
    371 
    372 		$template = new Template( $this->page->templateid );
    373 		$template->load();
    374 		$this->setTemplateVar('template_name',$template->name );
    375 		$this->setTemplateVar('tmp_filename' ,$this->page->getCache()->getFilename() );
    376 
    377 	}
    378 
    379 
    380 
    381 
    382 	/**
    383 	 * Die Eigenschaften der Seite anzeigen
    384 	 */
    385 	function nameView()
    386 	{
    387         $this->page->load();
    388 
    389         $this->setTemplateVars( $this->page->getProperties() );
    390         $this->setTemplateVar( 'languageid', $this->page->languageid );
    391 
    392         $alias = $this->page->getAliasForLanguage( $this->page->languageid );
    393 
    394         $this->setTemplateVar( 'alias_filename', $alias->filename );
    395         $this->setTemplateVar( 'alias_folderid', $alias->parentid );
    396 
    397         $project = Project::create( $this->page->projectid );
    398         $this->setTemplateVar( 'folders' , $project->getAllFlatFolders() );
    399     }
    400 
    401 
    402 
    403 
    404     function namePost() {
    405 
    406 	    parent::namePost(); // Save name and description
    407 
    408         $alias = $this->page->getAliasForLanguage( $this->getRequestId('languageid'));
    409 
    410         $alias->filename = BaseObject::urlify( $this->getRequestVar( 'alias_filename') );
    411         $alias->parentid = $this->getRequestId('alias_folderid');
    412 
    413         // If no alias, remove the alias
    414         if   ( ! $alias->filename ) {
    415 
    416             $alias->delete();
    417             $this->addNotice($alias->getType(),'','DELETED','ok');
    418         }
    419         else
    420         {
    421             $alias->save();
    422             $this->addNotice($alias->getType(),$alias->filename,'SAVED','ok');
    423         }
    424 
    425     }
    426 
    427 
    428 	/**
    429 	 * Austauschen der Vorlage vorbereiten
    430 	 *
    431 	 * Es wird ein Formualar erzeugt, in dem der Benutzer auswaehlen kann, welche Elemente
    432 	 * in welches Element uebernommen werden sollen
    433 	 */
    434 	public function changetemplateselectelementsView()
    435 	{
    436 		$newTemplateId = $this->getRequestVar( 'newtemplateid' );
    437 
    438 		if   ( $newTemplateId != 0  )
    439 		{
    440 			$this->setTemplateVar('newtemplateid',$newTemplateId );
    441 
    442 			$oldElements = array();
    443 			$oldTemplate = new Template( $this->page->templateid );
    444 			$newTemplate = new Template( $newTemplateId );
    445 
    446 			foreach( $oldTemplate->getElementIds() as $elementid )
    447 			{
    448 				$e = new Element( $elementid );
    449 				$e->load();
    450 
    451 				if	( !$e->isWritable() )
    452 					continue;
    453 
    454 				$oldElement = array();
    455 				$oldElement['name'] = $e->name.' - '.lang('EL_'.$e->type );
    456 				$oldElement['id'  ] = $e->elementid;
    457 
    458 				$newElements = Array();
    459 				$newElements[0] = lang('ELEMENT_DELETE_VALUES');
    460 
    461 				foreach( $newTemplate->getElementIds() as $newelementid )
    462 				{
    463 					$ne = new Element( $newelementid );
    464 					$ne->load();
    465 
    466 					// Nur neue Elemente anbieten, deren Typ identisch ist
    467 					if	( $ne->type == $e->type )
    468 						$newElements[$newelementid] = lang('ELEMENT').': '.$ne->name.' - '.lang('EL_'.$e->type );
    469 				}
    470 				$oldElement['newElementsName'] = 'from'.$e->elementid;
    471 				$oldElement['newElementsList'] = $newElements;
    472 				$oldElements[$elementid] = $oldElement;
    473 			}
    474 			$this->setTemplateVar('elements',$oldElements );
    475 		}
    476 		else
    477 		{
    478 			$this->callSubAction('prop');
    479 		}
    480 	}
    481 
    482 
    483 
    484 	/**
    485 	 * Die Vorlage der Seite austauschen
    486 	 *
    487 	 * Die Vorlage wird ausgetauscht, die Inhalte werden gemaess der Benutzereingaben kopiert
    488 	 */
    489 	public function changetemplateselectelementsPost()
    490 	{
    491 		$newTemplateId = $this->getRequestVar('newtemplateid');
    492 		$replaceElementMap = Array();
    493 
    494 		$oldTemplate = new Template( $this->page->templateid );
    495 		foreach( $oldTemplate->getElementIds() as $elementid )
    496 			$replaceElementMap[$elementid] = $this->getRequestVar('from'.$elementid);
    497 
    498 		if	( $newTemplateId != 0  )
    499 		{
    500 			$this->page->replaceTemplate( $newTemplateId,$replaceElementMap );
    501 			$this->addNotice('page',$this->page->name,'SAVED',OR_NOTICE_OK);
    502 		}
    503 		else
    504 			$this->addNotice('page',$this->page->name,'NOT_SAVED',OR_NOTICE_WARN);
    505 	}
    506 
    507 
    508 
    509 
    510 	/**
    511 	 * Alle Elemente der Seite anzeigen
    512 	 */
    513 	function editView()
    514 	{
    515         $template = new Template( $this->page->templateid );
    516         $template->load();
    517 
    518         /** @var Element[] $elements */
    519         $elements = $template->getElements();
    520 
    521         $elements = array_filter(/**
    522          * @param $element Element
    523          * @return Element
    524          */ $elements, function($element ) {
    525             return $element->isWritable();
    526         } );
    527 
    528         $elements = array_map( function( $element ) {
    529             return get_object_vars( $element ) + array('pageelementid'=>$this->page->id.'_'.$element->elementid,'typename'=>$element->getTypeName() );
    530         }, $elements);
    531 
    532 		$this->setTemplateVar('elements',$elements);
    533 	}
    534 
    535 
    536 	/**
    537 	 * Alle editierbaren Felder in einem Formular bereitstellen
    538 	 */
    539 	function formView()
    540 	{
    541 		global $conf_php;
    542 
    543 		$this->page->public = false;
    544 		$this->page->simple = true;
    545 		$this->page->generate_elements();
    546 
    547 		$list = array();
    548 
    549 		foreach( $this->page->values as $id=>$value )
    550 		{
    551 			if   ( $value->element->isWritable() )
    552 			{
    553 				$list[$id] = array();
    554 				$list[$id]['name']        = $value->element->name;
    555 				$list[$id]['desc']        = $value->element->desc;
    556 				$list[$id]['type']        = $value->element->type;
    557 				$list[$id]['id'  ]        = 'id'.$value->element->elementid;
    558 				$list[$id]['saveid']      = 'saveid'.$value->element->elementid;
    559 
    560 				switch( $value->element->type )
    561 				{
    562 					case 'text':
    563 					case 'longtext':
    564 						$list[$id]['value'] = $value->text;
    565 						break;
    566 
    567 					case 'date':
    568 						$list[$id]['value'] = date( 'Y-m-d H:i:s',$value->date );
    569 						break;
    570 
    571 					case 'number':
    572 						$list[$id]['value'] = $value->number / pow(10,$value->element->decimals);
    573 						break;
    574 
    575 					case 'select':
    576 						$list[$id]['list' ] = $value->element->getSelectItems();
    577 						$list[$id]['value'] = $value->text;
    578 						break;
    579 
    580 					case 'link':
    581 						$objects = array();
    582 
    583 						foreach( Folder::getAllObjectIds() as $oid )
    584 						{
    585 							$o = new BaseObject( $oid );
    586 							$o->load();
    587 
    588 							if	( $o->getType() != 'folder' )
    589 							{
    590 								$f = new Folder( $o->parentid );
    591 								$f->load();
    592 
    593 								$objects[ $oid ]  = lang( $o->getType() ).': ';
    594 								$objects[ $oid ] .=  implode( ' &raquo; ',$f->parentObjectNames(false,true) );
    595 								$objects[ $oid ] .= ' &raquo; '.$o->name;
    596 							}
    597 						}
    598 
    599 						asort( $objects ); // Sortieren
    600 
    601 						$list[$id]['list' ] = $objects;
    602 						$list[$id]['value'] = $value->linkToObjectId;
    603 						break;
    604 
    605 					case 'list':
    606 						$objects = array();
    607 						foreach( Folder::getAllFolders() as $oid )
    608 						{
    609 							$f = new Folder( $oid );
    610 							$f->load();
    611 
    612 							$objects[ $oid ]  = lang( $f->getType() ).': ';
    613 							$objects[ $oid ] .=  implode( ' &raquo; ',$f->parentObjectNames(false,true) );
    614 						}
    615 
    616 						asort( $objects ); // Sortieren
    617 
    618 						$this->setTemplateVar('list' ,$objects);
    619 						$this->setTemplateVar('value',$this->value->linkToObjectId);
    620 
    621 						break;
    622 				}
    623 			}
    624 		}
    625 
    626 		$this->setTemplateVar( 'release',$this->page->hasRight(Acl::ACL_RELEASE) );
    627 		$this->setTemplateVar( 'publish',$this->page->hasRight(Acl::ACL_PUBLISH) );
    628 
    629 		$this->setWindowMenu( 'elements' );
    630 		$this->setTemplateVar('el',$list);
    631 	}
    632 
    633 
    634 
    635 	/**
    636 	 * Seite anzeigen
    637 	 */
    638 	public function previewView()
    639 	{
    640 	    $this->setModelAndLanguage();
    641 
    642 		$this->setTemplateVar('preview_url',Html::url('page','show',$this->page->objectid,array(REQ_PARAM_LANGUAGE_ID=>$this->page->languageid,REQ_PARAM_MODEL_ID=>$this->page->modelid) ) );
    643 	}
    644 
    645 
    646 
    647 		/**
    648 	 * Seite anzeigen
    649 	 */
    650 	function showView()
    651 	{
    652 	    // Do NOT use CSP here.
    653         // The output is only shown in an iframe, so there is no security impact to the CMS.
    654         // But if the template is using inline JS or CSS, we would break this with a CSP-header.
    655         header('Content-Security-Policy:');
    656         // TODO: Read CSP from root folder settings.
    657 
    658         // Seite definieren
    659 		if	( $this->hasRequestVar('withIcons') )
    660 			$this->page->icons = true;
    661 
    662 		$publisher = new PublishPreview();
    663 
    664 		$this->page->publisher = $publisher;
    665 
    666 		$this->page->load();
    667 		$this->page->generate();
    668 
    669 		header('Content-Type: '.$this->page->mimeType().'; charset=UTF-8' );
    670 
    671 		// HTTP-Header mit Sprachinformation setzen.
    672 		$language = new Language( $this->page->languageid);
    673 		$language->load();
    674 		header('Content-Language: '.$language->isoCode);
    675 
    676 		Logger::debug("Preview page: ".$this->page->__toString() );
    677 
    678 		// Executing PHP in Pages.
    679 		if	( ( config('publish','enable_php_in_page_content')=='auto' && $this->page->template->extension == 'php') ||
    680 		        config('publish','enable_php_in_page_content')===true )
    681         {
    682             ob_start();
    683             require( $this->page->getCache()->getFilename() );
    684             $this->setTemplateVar('output',ob_get_contents() );
    685             ob_end_clean();
    686         }
    687 		else
    688             $this->setTemplateVar('output',file_get_contents( $this->page->getCache()->getFilename() ) );
    689 	}
    690 
    691 
    692 
    693 	/**
    694 	 * Den Quellcode der Seite anzeigen
    695 	 *
    696 	 * Alle HTML-Sonderzeichen werden maskiert
    697 	 */
    698 	function srcView()
    699 	{
    700 		$project = new Project( $this->page->projectid );
    701 
    702 		$this->page->withLanguage = config('publish','filename_language') == 'always' || count($project->getLanguageIds()) > 1;
    703 		$this->page->withModel    = config('publish','filename_type'    ) == 'always' || count($project->getModelIds()   ) > 1;
    704 
    705 		$this->page->publisher = new PublishPublic( $this->page->projectid );
    706 		$this->page->load();
    707 
    708 		$this->setModelAndLanguage();
    709 
    710 		$src = $this->page->generate();
    711 
    712 		$this->setTemplateVar('src',$src);
    713 	}
    714 
    715 
    716 
    717 
    718 	/**
    719 	 * Die Eigenschaften der Seite anzeigen
    720 	 */
    721 	function changetemplateView()
    722 	{
    723 		$this->page->public = true;
    724 		$this->page->load();
    725 
    726 
    727         $this->setTemplateVars( $this->page->getProperties() );
    728 
    729 		if   ( $this->userIsAdmin() )
    730 		{
    731 			$this->setTemplateVar('template_url',Html::url('main','template',$this->page->templateid,array(REQ_PARAM_MODEL_ID=>$this->page->modelid)));
    732 		}
    733 
    734 		$template = new Template( $this->page->templateid );
    735 		$template->load();
    736 		$this->setTemplateVar('template_name',$template->name);
    737 
    738 		$templates = Array();
    739         $project = new Project( $this->page->projectid );
    740 		foreach( $project->getTemplates() as $id=>$name )
    741 		{
    742 			if	( $id != $this->page->templateid )
    743 				$templates[$id]=$name;
    744 		}
    745 		$this->setTemplateVar('templates',$templates);
    746 	}
    747 
    748 
    749 
    750 
    751 
    752 	/**
    753 	 * Seite veroeffentlichen
    754 	 *
    755 	 * Es wird ein Formular angzeigt, mit dem die Seite veroeffentlicht
    756 	 * werden kann
    757 	 */
    758 	function pubView()
    759 	{
    760 	}
    761 
    762 
    763 
    764 	/**
    765 	 * Seite veroeffentlichen
    766 	 *
    767 	 * Die Seite wird generiert.
    768 	 */
    769 	function pubPost()
    770 	{
    771 		if	( !$this->page->hasRight( Acl::ACL_PUBLISH ) )
    772             throw new \SecurityException( 'no right for publish' );
    773 
    774 		Session::close();
    775 
    776 		$publisher = new PublishPublic( $this->page->projectid );
    777 
    778 		$this->page->publisher = $publisher;
    779 		$this->page->publish();
    780 		$publisher->close();
    781 
    782 		$this->addNotice( 'page',
    783 		                  $this->page->fullFilename,
    784 		                  'PUBLISHED',
    785 		                  OR_NOTICE_OK,
    786 		                  array(),
    787 		                  array_map(function($obj) {
    788 		                      return $obj['full_filename'];
    789                           },$publisher->publishedObjects)
    790          );
    791 	}
    792 
    793 
    794 	function setWindowMenu( $type ) {
    795 		switch( $type)
    796 		{
    797 			case 'elements':
    798 				$menu = array( array('subaction'=>'el'  ,'text'=>'all'),
    799 				               array('subaction'=>'form','text'=>'change'    )  );
    800 				$this->setTemplateVar('windowMenu',$menu);
    801 				break;
    802 			case 'acl':
    803 				$menu = array( array('subaction'=>'rights' ,'text'=>'show'),
    804 		                       array('subaction'=>'aclform','text'=>'add' ) );
    805 				$this->setTemplateVar('windowMenu',$menu);
    806 				break;
    807 
    808 		}
    809 	}
    810 
    811 
    812 	/**
    813 	 * Liefert die Struktur zu diesem Ordner:
    814 	 * - Mit den übergeordneten Ordnern und
    815 	 * - den in diesem Ordner enthaltenen Objekten
    816 	 *
    817 	 * Beispiel:
    818 	 * <pre>
    819 	 * - A
    820 	 *   - B
    821 	 *     - C (dieser Ordner)
    822 	 *       - Unterordner
    823 	 *       - Seite
    824 	 *       - Seite
    825 	 *       - Datei
    826 	 * </pre>
    827 	 */
    828 	public function structureView()
    829 	{
    830 
    831 		$structure = array();
    832 		$tmp = &$structure;
    833 		$nr  = 0;
    834 
    835 		$folder = new Folder( $this->page->parentid );
    836 		$parents = $folder->parentObjectNames(false,true);
    837 
    838 		foreach( $parents as $id=>$name)
    839 		{
    840 			unset($children);
    841 			unset($o);
    842 			$children = array();
    843 			$o = array('id'=>$id,'name'=>$name,'type'=>'folder','level'=>++$nr,'children'=>&$children);
    844 
    845 			$tmp[$id] = &$o;;
    846 
    847 			unset($tmp);
    848 
    849 			$tmp = &$children;
    850 		}
    851 
    852 
    853 
    854 		unset($children);
    855 		unset($id);
    856 		unset($name);
    857 
    858 		$elementChildren = array();
    859 
    860 		$tmp[ $this->page->objectid ] = array('id'=>$this->page->objectid,'name'=>$this->page->name,'type'=>'page','self'=>true,'children'=>&$elementChildren);
    861 
    862 		$template = new Template( $this->page->templateid );
    863 		$elements = $template->getElementNames();
    864 
    865 		foreach( $elements as $id=>$name )
    866 		{
    867 			$elementChildren[$id] = array('id'=>$this->page->objectid.'_'.$id,'name'=>$name,'type'=>'pageelement','children'=>array() );
    868 		}
    869 
    870 		//Html::debug($structure);
    871 
    872 		$this->setTemplateVar('outline',$structure);
    873 	}
    874 
    875 
    876 
    877 
    878     public function removeView()
    879     {
    880         $this->setTemplateVar( 'name',$this->page->filename );
    881     }
    882 
    883 
    884     public function removePost()
    885     {
    886         if   ( $this->getRequestVar('delete') != '' )
    887         {
    888             $this->page->delete();
    889             $this->addNotice('page',$this->page->filename,'DELETED',OR_NOTICE_OK);
    890         }
    891         else
    892         {
    893             $this->addNotice('page',$this->page->filename,'CANCELED',OR_NOTICE_WARN);
    894         }
    895     }
    896 
    897     protected function setModelAndLanguage()
    898     {
    899         $this->setTemplateVar('languages' ,$this->page->getProject()->getLanguages());
    900         $this->setTemplateVar('languageid',$this->page->languageid );
    901 
    902         $this->setTemplateVar('models'    ,$this->page->getProject()->getModels()   );
    903         $this->setTemplateVar('modelid'   ,$this->page->modelid    );
    904     }
    905 
    906 
    907 }
    908 
    909 ?>