0251 / 590 837 15
info@a-coding-project.de
;

Seiten-Templates (CMS)

In unserem CMS wird heute im Admin-Bereich alles was mit Seiten zu tun hat mit Templates ausgestattet. So kann man dort schon sein eigenes Design verwenden.

Fangen wir an mit der Seitenübersicht. Hier wird neben der Einführung des Templates auch noch ein kleiner Bug behoben: Seiten, die nicht vom Typ WYSIWYG waren, wurden dort bisher nicht aufgelistet. Das Template /system/templates/sites.html lagert nun den Html-Code der Seite aus:

<h1>Seiten</h1>

{VAR:MESSAGE}

<p>

{VAR:NEWPAGELINK}

</p>

<form action=„{VAR:FORMURL}“ method=„POST“>

<p>

Path:

{LOOP:PATH}

<a href=„{VAR:URL}“>{VAR:LABEL}</a>

{/LOOP:PATH}

<input name=„name“ style=„width:100px;“ />

<input name=„newFolder“ type=„submit“ value=„Neu“ />

</p>

</form>

<ul style=„list-style-type:none;“>

{LOOP:DIRS}

<li>

<img src=„{VAR:ICON_DIR}“ />

<a href=„{VAR:URL}“>{VAR:LABEL}</a>

</li>

{/LOOP:DIRS}

</ul>

{VAR:DELETEFOLDERLINK}

<table>

<thead>

<td><strong>Titel</strong></td>

<td><strong>Alias</strong></td>

<td><strong>Aktionen</strong></td>

</thead>

<tbody>

{LOOP:PAGES}

<tr>

<td>{VAR:TITLE}</td>

<td>{VAR:ALIAS}</td>

<td>

<a title=„Bearbeiten“ href=„{VAR:EDITURL}“>

<img src=„{VAR:ICON_EDIT}“ />

</a>

<a title=„L&ouml;schen“ href=„{VAR:DELETEURL}“>

<img src=„{VAR:ICON_DELETE}“ />

</a>

</td>

</tr>

{/LOOP:PAGES}

</tbody>

</table>

{VAR:NOPAGES}

Die dazugehörige Seite /admin/includes/sites.php sieht nun so aus:

<?PHP

$template = new Template();

$template->load(„sites“,„..“);

$template->assign_var(„FORMURL“,„/admin/index.php?page=sites&dir=“.urlencode($_GET[‚dir‘]));

$dir = $_GET[‚dir‘];

if($_POST[’newFolder‘]){

FileServer::createFolder(„../content/articles/“.$dir,$_POST[’name‘]);

}

if($_GET[‚rmdir‘]){

rmdir(„../content/articles/“.$_GET[‚rmdir‘]);

$template->assign_var(„MESSAGE“,„Verzeichnis „.$_GET[‚rmdir‘].“ wurde gel&ouml;scht!“);

}

else{

$template->assign_var(„MESSAGE“,„“);

}

$verzeichnis = openDir(„../content/articles/“.$dir);

if($dir){

$template->assign_var(„NEWPAGELINK“,„<a href=/admin/index.php?page=site-new&dir=“.substr($dir,1).>Neue Seite</a>“);

}

else{

$template->assign_var(„NEWPAGELINK“,“ <a href=/admin/index.php?page=site-new>Neue Seite</a>“);

}

$pre = „“;

foreach(split(„/“,$dir) as $cDir){

$index = $template->add_loop_item(„PATH“);

$path .= „/“.$cDir;

if($path == „/“){

$template->assign_loop_var(„PATH“, $index, „URL“,„/admin/index.php?page=sites“);

$template->assign_loop_var(„PATH“, $index, „LABEL“,„/“);

$path = „“;

}

else{

$template->assign_loop_var(„PATH“, $index, „URL“,„/admin/index.php?page=sites&dir=“.$path);

$template->assign_loop_var(„PATH“, $index, „LABEL“,$cDir);

}

}

$subFolders = FileServer::getFolders(„../content/articles/“.$dir);

if($subFolders){

foreach($subFolders as $folder){

$index = $template->add_loop_item(„DIRS“);

$template->assign_loop_var(„DIRS“,$index,„ICON_DIR“,„/system/images/icons/folder.png“);

$template->assign_loop_var(„DIRS“,$index,„URL“,„/admin/index.php?page=sites&dir=“.$dir.„/“.$folder);

$template->assign_loop_var(„DIRS“,$index,„LABEL“,$folder);

}

}

if(trim($_GET[‚dir‘]) != „“ & trim($_GET[‚dir‘]) != „/“){

$template->assign_var(„DELETEFOLDERLINK“,„<a href=/admin/index.php?page=sites&rmdir=“.$_GET[‚dir‘].>Ordner l&ouml;schen</a>“);

}

else{

$template->assign_var(„DELETEFOLDERLINK“,„“);

}

$pages = Page::getPagesByDir($dir);

if(substr($dir,0,1) == „/“){

$shortdir = substr($dir,1);

}

else{

$shortdir = $dir;

}

if($pages){

foreach($pages as $page){

$shortalias = substr($page->alias,strlen($shortdir));

if(substr($shortalias,0,1) == „/“){

$shortalias = substr($shortalias,1);

}

else{

$shortalias = $shortalias;

}

if(!strpos($shortalias,„/“)){

$index = $template->add_loop_item(„PAGES“);

$template->assign_loop_var(„PAGES“,$index,„TITLE“,$page->title);

$template->assign_loop_var(„PAGES“,$index,„ALIAS“,$shortalias);

$template->assign_loop_var(„PAGES“,$index,„EDITURL“,„index.php?page=site-edit&site=“.$page->alias);

$template->assign_loop_var(„PAGES“,$index,„DELETEURL“,„index.php?page=site-delete&site=“.$page->alias);

$template->assign_loop_var(„PAGES“,$index,„ICON_EDIT“,„/system/images/icons/page_edit.png“);

$template->assign_loop_var(„PAGES“,$index,„ICON_DELETE“,„/system/images/icons/cross.png“);

}

}

$template->assign_var(„NOPAGES“,„“);

}

else{

$template->assign_var(„NOPAGES“,„Es sind keine Seiten vorhanden.“);

}

$template->output();

?>

Eine der wohl wichtigsten Seiten im CMS ist die ‚Seite Bearbeiten‘-Seite. Und genau um diese geht es jetzt. Diese bekommt das Template /system/templates/site_edit.html:

<h1>Seite bearbeiten</h1>

<form name=„form“ action=„{VAR:PATH}“ method=„post“>

<div style=„float:right;width:20%;“>

<label for=„alias“>Alias:</label>

<input name=„alias“ value=„{VAR:ALIAS}“ /><br />

<h2>Rechte</h2>

<select name=„rights[]“ size=„4“ multiple=„yes“ style=„width:150px;“>

{LOOP:RIGHTS}

<option {VAR:SELECTED} value=„{VAR:VALUE}“>{VAR:NAME}</option>

{/LOOP:RIGHTS}

</select>

<h2>Seitenmen&uuml;</h2>

<select name=„menu“ onchange=„document.form.submit();“>

{LOOP:MENU}

<option {VAR:SELECTED} value=„{VAR:VALUE}“>{VAR:NAME}</option>

{/LOOP:MENU}

</select>

<div id=„menupreview“>

{VAR:MENUPREVIEW}

</div>

<h2>Meta Daten</h2>

<label for=„meta-description“>Description:</label>

<input name=„meta-description“ value=„{VAR:METADESCRIPTION}“ /><br />

<label for=„meta-keywords“>Keywords:</label>

<input name=„meta-keywords“ value=„{VAR:METAKEYWORDS}“ /><br />

<label for=„meta-robots“>Robots:</label>

<input name=„meta-robots“ value=„{VAR:METAROBOTS}“ /><br />

</div>

<div>

<input name=„title“ value=„{VAR:TITLE}“ style=„width:70%;height:25px;margin-bottom:5px;font-size:20px;“ /><br />

{VAR:EDITOR}

</div>

</form>

Für die Menüvorschau müssen wir alserstes der Klasse /system/classes/menu.php die Methode getCode geben. Nur so können wir Menüs auch im Template verwenden:

<?PHP

class Menu{

function display($id, $globalstart,$globalend, $elementstart,$elementend,$class){

echo self::getCode($id, $globalstart,$globalend, $elementstart,$elementend,$class);

}

function getCode($id, $globalstart,$globalend, $elementstart,$elementend,$class){

$entries = self::getEntries($id);

$res = $globalstart;

$i = 1;

if($entries){

foreach($entries as $entry){

$res .= $entry->getCode($globalstart,$globalend, $elementstart,$elementend,$class,$index);

$i++;

}

}

$res .= $globalend;

return $res;

}

function getIdByName($name){

$name = $GLOBALS[‚db‘]->EscapeString(strtolower(trim($name)));

return $GLOBALS[‚db‘]->ReadField(„SELECT id FROM {‚dbprefix‘}menu_names WHERE lower(trim(name)) = ‚“.$name.„‚ LIMIT 0,1“);;

}

function displayEditable($id){

$entries = self::getEntries($id);

if($entries){

foreach($entries as $entry){

$entry->displayEditable();

}

}

}

function addEntry($menu,$title,$href){

$maxID = $GLOBALS[‚db‘]->ReadField(„SELECT MAX(id) FROM {‚dbprefix‘}menu.$menu.„‚“);

WHERE menuID = ‚“

$id = $maxID + 1;

$res = $GLOBALS[‚db‘]->Execute(„INSERT INTO {‚dbprefix‘}menu (id,menuID,title,href).$id.„‚,'“.$menu.„‚,.$title.„‚,'“.$href.„‚)“);

VALUES(‚“

‚“

if($res){

$args[‚menu‘] = $menu;

$args[‚title‘] = $title;

$args[‚href‘] = $href;

EventManager::raiseEvent(„menu_entry_added“,„../“,$args);

}

return $res;

}

function editEntry($menu,$id,$title,$href){

$res = $GLOBALS[‚db‘]->Execute(„UPDATE {‚dbprefix‘}menu SET.$href.„‚,.$title.„‚.$id.„‚.$menu.„‚“);

href = ‚“

title = ‚“

WHERE id = ‚“

AND menuID = ‚“

if($res){

$args[‚menu‘] = $menu;

$args[‚title‘] = $title;

$args[‚href‘] = $href;

$args[‚id‘] = $href;

EventManager::raiseEvent(„menu_entry_edit“,„../“,$args);

}

return $res;

}

function deleteEntry($menu,$id){

$res = $GLOBALS[‚db‘]->Execute(„DELETE FROM {‚dbprefix‘}menu WHERE menuID = ‚“.$menu.„‚ AND id = ‚“.$id.„‚“);

if($res){

$res = $GLOBALS[‚db‘]->Execute(„UPDATE {‚dbprefix‘}menu SET id = id – 1 WHERE id > ‚“.$id.„‚“);

if($res){

$args[‚menu‘] = $menu;

$args[‚id‘] = $id;

EventManager::raiseEvent(„menu_entry_deleted“,„../“,$args);

}

}

return $res;

}

function create($name){

$res = $GLOBALS[‚db‘]->Execute(„INSERT INTO {‚dbprefix‘}menu_names (name) VALUES (‚“.$name.„‚)“);

if($res){

$args[’name‘] = $name;

EventManager::raiseEvent(„menu_created“,„../“,$args);

}

return $GLOBALS[‚db‘]->InsertID();

}

function delete($id){

$res = $GLOBALS[‚db‘]->Execute(„DELETE FROM {‚dbprefix‘}menu_names WHERE id = ‚“.$id.„‚“);

if($res){

$res = $GLOBALS[‚db‘]->Execute(„DELETE FROM {‚dbprefix‘}menu WHERE menuID = ‚“.$id.„‚“);

if($res){

$args[‚id‘] = $id;

EventManager::raiseEvent(„menu_deleted“,„../“,$args);

}

}

return $res;

}

function getEntries($id){

$rows = $GLOBALS[‚db‘]->ReadRows(„SELECT * FROM {‚dbprefix‘}menu WHERE menuID = ‚“.$id.„‚ ORDER BY id“);

if($rows){

foreach($rows as $row){

$entry = new MenuEntry();

$entry->id = $row->id;

$entry->type = $row->type;

$entry->href = $row->href;

$entry->title = $row->title;

$entry->menu = $id;

$res[] = $entry;

}

}

return $res;

}

}

?>

Da diese auf die Klasse /system/classes/menuentry.php zugreifft müssen wir auch diese mit der Funktion getCode ausstatten:

<?PHP

class MenuEntry{

public $id = 1;

public $type = 0;

public $href = ;

public $menu = ;

public function display($globalstart,$globalend, $elementstart,$elementend,$class,$index){

echo $this->getCode($globalstart,$globalend, $elementstart,$elementend,$class,$index);

}

public function getCode($globalstart,$globalend, $elementstart,$elementend,$class,$index){

if($this->type == 0){

$id = $GLOBALS[‚db‘]->EscapeString($this->href);

$link = $GLOBALS[‚db‘]->ReadField(„SELECT alias FROM {‚dbprefix‘}pages WHERE id = ‚“.$id.„‚“);

$res = $elementstart.„<a href=.$link.„.html title=.$this->title..$class.“ menue-„.$id.„-„.$index.>“.$this->title.„</a>“.$elementend;

class=

}

else if($this->type == 1){

$res = $elementstart.„<a href=.$this->href. title=.$this->title..$class.“ menue-„.$id.„-„.$index.>“.$this->title.„</a>“.$elementend;

class=

}

else{

$res = Menu::getCode($this->href,$globalstart,$globalend, $elementstart,$elementend,$class);

}

return $res;

}

public function displayEditAble(){

?>

<input name=“<?PHP echo $this->id; ?>_title“ value=“<?PHP echo $this->title; ?>“ />

<select name=“<?PHP echo $this->id; ?>_type“ onChange=“typeSelected()“>

<option value=“0″<?PHP if($this->type == 0) echo “ selected=1; ?>>Seite Intern</option>

<option value=“1″<?PHP if($this->type == 1) echo “ selected=1; ?>>Seite Extern</option>

<option value=“2″<?PHP if($this->type == 2) echo “ selected=1; ?>>Men&uuml;</option>

</select>

<?PHP

if($this->type == 0){

$selector = new PageSelector();

$selector->name = $this->id.‚_href‘;

$selector->value = $this->href;

$selector->display();

}

else if($this->type == 1){

?>

<input name=“<?PHP echo $this->id; ?>_href“ value=“<?PHP echo $this->href; ?>“ />

<?PHP

}

else if($this->type == 2){

$selector = new MenueSelector();

$selector->name = $this->id.‚_href‘;

$selector->value = $this->href;

$selector->display();

}

?>

<input type=“submit“ name=“<?PHP echo $this->id; ?>_delete“ value=“X“ /><br />

<?PHP

}

public function save(){

if($this->id == 1){

return $this->insert();

}

else{

return $this->update();

}

}

private function insert(){

$menu = $GLOBALS[‚db‘]->EscapeString($this->menu);

$title = $GLOBALS[‚db‘]->EscapeString($this->title);

$href = $GLOBALS[‚db‘]->EscapeString($this->href);

$type = $GLOBALS[‚db‘]->EscapeString($this->type);

$maxID = $GLOBALS[‚db‘]->ReadField(„SELECT MAX(id) FROM {‚dbprefix‘}menu.$menu.„‚“);

WHERE menuID = ‚“

$id = $maxID + 1;

$res = $GLOBALS[‚db‘]->Execute(„INSERT INTO {‚dbprefix‘}menu (id,menuID,title,href,type).$id.„‚,'“.$menu.„‚,.$title.„‚,'“.$href.„‚,'“.$type.„‚)“);

VALUES(‚“

‚“

if($res){

$args[‚menu‘] = $menu;

$args[‚title‘] = $title;

$args[‚href‘] = $href;

EventManager::raiseEvent(„menu_entry_added“,„../“,$args);

}

return $res;

}

private function update(){

$id = $GLOBALS[‚db‘]->EscapeString($this->id);

$menu = $GLOBALS[‚db‘]->EscapeString($this->menu);

$title = $GLOBALS[‚db‘]->EscapeString($this->title);

$href = $GLOBALS[‚db‘]->EscapeString($this->href);

$type = $GLOBALS[‚db‘]->EscapeString($this->type);

$res = $GLOBALS[‚db‘]->Execute(„UPDATE {‚dbprefix‘}menu SET.$href.„‚,.$title.„‚,.$type.„‚.$id.„‚.$menu.„‚“);

href = ‚“

title = ‚“

type = ‚“

WHERE id = ‚“

AND menuID = ‚“

if($res){

$args[‚menu‘] = $menu;

$args[‚title‘] = $title;

$args[‚href‘] = $href;

$args[‚id‘] = $id;

EventManager::raiseEvent(„menu_entry_edit“,„../“,$args);

}

return $res;

}

}

?>

Jetzt kommen wir erst mal zur /admin/includes/sites.php an sich. Diese muss nun unser Template befüllen:

<?PHP

$template = new Template();

$template->load(„sites“,„..“);

$template->assign_var(„FORMURL“,„/admin/index.php?page=sites&dir=“.urlencode($_GET[‚dir‘]));

$dir = $_GET[‚dir‘];

if($_POST[’newFolder‘]){

FileServer::createFolder(„../content/articles/“.$dir,$_POST[’name‘]);

}

if($_GET[‚rmdir‘]){

rmdir(„../content/articles/“.$_GET[‚rmdir‘]);

$template->assign_var(„MESSAGE“,„Verzeichnis „.$_GET[‚rmdir‘].“ wurde gel&ouml;scht!“);

}

else{

$template->assign_var(„MESSAGE“,„“);

}

$verzeichnis = openDir(„../content/articles/“.$dir);

if($dir){

$template->assign_var(„NEWPAGELINK“,„<a href=/admin/index.php?page=site-new&dir=“.substr($dir,1).>Neue Seite</a>“);

}

else{

$template->assign_var(„NEWPAGELINK“,“ <a href=/admin/index.php?page=site-new>Neue Seite</a>“);

}

$pre = „“;

foreach(split(„/“,$dir) as $cDir){

$index = $template->add_loop_item(„PATH“);

$path .= „/“.$cDir;

if($path == „/“){

$template->assign_loop_var(„PATH“, $index, „URL“,„/admin/index.php?page=sites“);

$template->assign_loop_var(„PATH“, $index, „LABEL“,„/“);

$path = „“;

}

else{

$template->assign_loop_var(„PATH“, $index, „URL“,„/admin/index.php?page=sites&dir=“.$path);

$template->assign_loop_var(„PATH“, $index, „LABEL“,$cDir);

}

}

$subFolders = FileServer::getFolders(„../content/articles/“.$dir);

if($subFolders){

foreach($subFolders as $folder){

$index = $template->add_loop_item(„DIRS“);

$template->assign_loop_var(„DIRS“,$index,„ICON_DIR“,„/system/images/icons/folder.png“);

$template->assign_loop_var(„DIRS“,$index,„URL“,„/admin/index.php?page=sites&dir=“.$dir.„/“.$folder);

$template->assign_loop_var(„DIRS“,$index,„LABEL“,$folder);

}

}

if(trim($_GET[‚dir‘]) != „“ & trim($_GET[‚dir‘]) != „/“){

$template->assign_var(„DELETEFOLDERLINK“,„<a href=/admin/index.php?page=sites&rmdir=“.$_GET[‚dir‘].>Ordner l&ouml;schen</a>“);

}

else{

$template->assign_var(„DELETEFOLDERLINK“,„“);

}

$pages = Page::getPagesByDir($dir);

if(substr($dir,0,1) == „/“){

$shortdir = substr($dir,1);

}

else{

$shortdir = $dir;

}

if($pages){

foreach($pages as $page){

$shortalias = substr($page->alias,strlen($shortdir));

if(substr($shortalias,0,1) == „/“){

$shortalias = substr($shortalias,1);

}

else{

$shortalias = $shortalias;

}

if(!strpos($shortalias,„/“)){

$index = $template->add_loop_item(„PAGES“);

$template->assign_loop_var(„PAGES“,$index,„TITLE“,$page->title);

$template->assign_loop_var(„PAGES“,$index,„ALIAS“,$shortalias);

$template->assign_loop_var(„PAGES“,$index,„EDITURL“,„index.php?page=site-edit&site=“.$page->alias);

$template->assign_loop_var(„PAGES“,$index,„DELETEURL“,„index.php?page=site-delete&site=“.$page->alias);

$template->assign_loop_var(„PAGES“,$index,„ICON_EDIT“,„/system/images/icons/page_edit.png“);

$template->assign_loop_var(„PAGES“,$index,„ICON_DELETE“,„/system/images/icons/cross.png“);

}

}

$template->assign_var(„NOPAGES“,„“);

}

else{

$template->assign_var(„NOPAGES“,„Es sind keine Seiten vorhanden.“);

}

$template->output();

?>

Fehlen „nur“ noch die Editoren, die die Methode getEdiableCode bekommen. Dafür müssen wir die abstrakte Klasse /system/classes/editor.php erweitern:

<?PHP

abstract class Editor{

private $content = null;

public $page = null;

abstract function display();

abstract function getEditableCode();

abstract function save($newPage,$oldPage);

function displayEditable(){

echo $this->getEditableCode();

}

}

?>

Füpr die Klasse /system/classes/login.php sieht die neue Methode so aus:

<?PHP

class Login extends Editor{

public function display(){

?>

<h2>Login</h2>

<?PHP

if($_POST[’name‘]){

if($_SESSION[‚user‘]->login($_POST[’name‘],$_POST[‚password‘])){

echo „Hallo „.$_SESSION[‚user‘]->name;

}

else{

echo „Login fehlgeschlagen!“;

}

}

if($_SESSION[‚user‘]->isGuest()){

?>

<form action=“<?PHP echo $_SERVER[‚SCRIPT_URI‘]; ?>“ method=“POST“>

<table>

<tr>

<td>Benutzername:</td>

<td><input name=“name“ /></td>

</tr>

<tr>

<td>Passwort:</td>

<td> <input name=“password“ type=“password“ /></td>

</tr>

</table>

<input type=“submit“ value=“Login“ />

</form>

<?PHP

}

}

public function getEditableCode(){

return „<input name=save type=submit value=&Auml;ndern onclick=form.action='“.$_SERVER[‚PHP_SELF‘].„?“.$_SERVER[‚QUERY_STRING‘].„‚ ; target=’_self‘ ; return true />“;

}

public function save($newPage,$oldPage){

}

}

?>

Der WYSIWYG-Editor ist da schon etwas schwieriger. Er bekommt sein eigenes Template /system/templates/controls/wysiwyg.html:

<script type=„text/javascript“ src=„/system/WYSIWYG/tiny_mce.js“></script>

<script type=„text/javascript“>

tinyMCE.init({

// General options

language : „de“,

mode : „textareas“,

theme : „advanced“,

plugins : „safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,imagemanager,filemanager“,

// Theme options

theme_advanced_buttons1 : „bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect“,

theme_advanced_buttons2 : „cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,code,|,forecolor,backcolor“,

theme_advanced_buttons3 : „tablecontrols,|,visualaid,|charmap,|,fullscreen,spellchecker,|,visualchars,template,blockquote,|,insertfile,insertimage“,

theme_advanced_toolbar_location : „top“,

theme_advanced_toolbar_align : „left“,

theme_advanced_statusbar_location : „bottom“,

theme_advanced_resizing : true,

// Example content CSS (should be your site CSS)

content_css : „css/example.css“,

// Drop lists for link/image/media/template dialogs

template_external_list_url : „template_list.js“,

external_link_list_url : „link_list.js“,

external_image_list_url : „/content/imagelist.php“,

media_external_list_url : „js/media_list.js“,

// Replace values for the template plugin

template_replace_values : {

username : „Some User“,

staffid : „991234“

}

});

</script>

<textarea name=„content“ style=„width:70%;height:500px;“>{VAR:CONTENT}</textarea>

</div>

<div style=„clear:both;“>

<input name=„vorschau“ type=„submit“ value=„Vorschau“ onclick=„form.action=’/{VAR:ALIAS}.html‘ ; target=’_blank‘ ; return true“ />

<input name=„save“ type=„submit“ value=„&Auml;ndern“ onclick=„form.action='{VAR:URL}‘ ; target=’_self‘ ; return true“ />

Die dazugehörige Steuerungsklasse /system/classes/wysiwyg.php sieht so aus:

<?PHP

class WYSIWYG extends Editor{

public function display(){

include(filterfilename(„content/articles/“.$this->page->alias));

}

public function getEditableCode(){

if($this->content == null){

$this->content = $this->readContent(„../“);

}

$template = new Template();

$template->load(„control_wysiwyg“,„..“);

$template->assign_var(„CONTENT“,$this->content);

$template->assign_var(„ALIAS“,$this->page->alias);

$template->assign_var(„URL“,$_SERVER[‚PHP_SELF‘].„?“.$_SERVER[‚QUERY_STRING‘]);

return $template->getCode();

}

public function save($newPage,$oldPage){

$this->deleteContent(„../“);

$this->page = $newPage;

$this->writeContent(„../“,$_POST[‚content‘]);

}

private function readContent($dirpraefix){

$filename = $dirpraefix.„content/articles/“.$this->page->alias.„.php“;

$handle = @fopen ($filename, „rb“);

if($handle && filesize($filename) > 0){

$contents = fread ($handle, filesize ($filename));

fclose ($handle);

}

else{

$contents = „“;

}

return $contents;

}

private function deleteContent($dirpraefix){

$filename = $dirpraefix.„content/articles/“.$this->page->alias.„.php“;

if(file_exists($filename)){

unlink($filename);

$args[‚alias‘] = $this->page->alias;

$args[‚filename‘] = $filename;

EventManager::raiseEvent(„pagecontent_deleted“,„../“,$args);

}

}

function writeContent($dirpraefix,$content){

$filename = $dirpraefix.„content/articles/“.$this->page->alias.„.php“;

$handle = fopen ($filename, „a“);

$res = fwrite ($handle, $content);

fclose ($handle);

if($res){

$args[‚alias‘] = $alias;

$args[‚filename‘] = $filename;

$args[‚content‘] = $content;

EventManager::raiseEvent(„pagecontent_writed“,„../“,$args);

}

return $res;

}

}

?>

Für das Erstellen einer neuen Seite gibt es 2 Templates. Zum einen /system/templates/site_new.html:

<form action=„{VAR:URL}“ method=„post“>

<table>

<tr>

<td>Typ:</td>

<td>

<select name=„type“>

{LOOP:TYPES}

<option value=„{VAR:CLASS}“>{VAR:NAME}</option>

{/LOOP:TYPES}

</select>

</td>

</tr>

<tr>

<td>Alias:</td>

<td><input name=„alias“ /></td>

</tr>

<tr>

<td></td>

<td><input type=„submit“ value=„Erstellen“ /></td>

</tr>

</table>

</form>

und zum Anderen /system/templates/message.html:

<p>{VAR:MESSAGE}</p>

Die Seite /admin/includes/site-new.php sieht dann so aus:

<h1>Seite erstellen</h1>

<?PHP

if(!$_POST[‚alias‘]){

$template = new Template();

$template->load(„site_new“,„..“);

$template->assign_var(„URL“,„/admin/index.php?page=site-new&dir=“.$_GET[‚dir‘]);

$types = Page::getPagesTypes();

if($types){

foreach($types as $type){

$index = $template->add_loop_item(„TYPES“);

$template->assign_loop_var(„TYPES“,$index,„CLASS“,$type->class);

$template->assign_loop_var(„TYPES“,$index,„NAME“,$type->name);

}

}

$template->output();

}

else{

if($_GET[‚dir‘]){

$dir = $db->EscapeString($_GET[‚dir‘]).„/“;

}

else{

$dir = „“;

}

$id = Page::create(„../“,$dir.$db->EscapeString($_POST[‚alias‘]),$db->EscapeString($_POST[‚type‘]));

if($id){

$template = new Template();

$template->load(„site_new_succeeded“,„..“);

$template->assign_var(„URL“,„/admin/index.php“);

$template->assign_var(„ALIAS“,$_POST[‚alias‘]);

$template->output();

}

else{

$template = new Template();

$template->load(„message“,„..“);

$template->assign_var(„MESSAGE“,„Die Seite konnte leider nicht erstellt werden.“);

$template->output();

}

}

?>

Kommen wir nun zum letztem Template für heute: /system/templates/site_delete.html:

<p>Soll die Seite <strong>{VAR:TITLE}</strong>

unwideruflich gel&ouml;scht werden?</p>

<a href=„{VAR:SITESURL}“>Abbrechen</a>

<a href=„{VAR:DELETEURL}“>

Seite l&ouml;schen

</a>

Gesteuert wird diese Seite von /admin/includes/site-delete.php:

<?PHP

$page = new Page();

$page->loadProperties($GLOBALS[‚db‘]->EscapeString($_GET[’site‘]));

?>

<h1>Seite l&ouml;schen</h1>

<?PHP

if(!$_GET[‚delete‘]){

$template = new Template();

$template->load(„site_delete“,„..“);

$template->assign_var(„TITLE“, $page->title);

$template->assign_var(„SITESURL“, „/admin/?page=sites“);

$template->assign_var(„DELETEURL“, „/admin/?page=site-delete&site=“.urlencode($_GET[’site‘]).„&delete=true“);

$template->output();

}

else{

if($page->delete()){

$template = new Template();

$template->load(„message“,„..“);

$template->assign_var(„MESSAGE“,„Die Seite <strong>“. $page->title.„</strong> wurde gel&ouml;scht!“);

$template->output();

}

}

?>