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

Seitentypen Teil 1 (CMS)

Im Tutorial „CMS selbst erstellen“ sind wir derzeit dabei das Benutzersystem zu bauen. Da an der nächsten Stelle das Login käme, möchte ich erst einmal die Seitentypen erstellen. Das Login wäre dann später ein eigener Seitentyp.

Weitere Seitentypen könnten später auch eine Bildergallerie, Gästebuch, usw sein. Jeder Seitentyp hat 2 Funktionen:

  • display: Zeigt den Inhalt an
  • displayEditable: Zeigt den Editor an für den Typ an.

Daraus wird die abstrakte Klasse system/classes/editor.php:

<?PHP
  abstract class Editor{

    public $page =null;
  
    abstract function display();
    abstract function displayEditable();
  }
?>

Für die Standard-Seite wird nun die Klasse /system/classes/wysiwyg.php:

<?PHP
  class WYSIWYG extends Editor{
  
    public function display(){
      include(filterfilename("content/articles/".$this->page->alias));
    }
    
    public function displayEditable(){
    
    }
  
  }
?>

Die Klasse /system/classes/page.php bekommt nun den Editor eingebaut:

<?PHP
class Page{
  public $id      = -1;
  public $alias   = '';
  public $title   = '';
  public $ownerid = -1;
  public $owner   = false;
  public $menu    = -1;
  public $meta    =null;
  public $editor  =null;
  
  function loadProperties($alias){
    if ($alias == "") {
    $alias = "home";
    }
    $row = $GLOBALS['db']->ReadRow("SELECT id,title,owner,menu,editor FROM {'dbprefix'}pages 
                           WHERE alias = '".$alias."'");
    if($row){
      $this->id = $row->id;
      $this->title = $row->title;
      $this->ownerid = $row->owner;
      $this->menu = $row->menu;
      $this->alias = $alias;
      $this->meta  = new Meta();
      $this->meta->pageid = $this->id;
      $this->meta->load();
      $this->Editor = new $row->editor();
      $this->Editor->page = $this;
    }
  }

  function getContent(){
    EventManager::raiseEvent("content_top",".",$this);
    $this->Editor->display();
    EventManager::raiseEvent("content_bottom",".",$this);
  }

  function getOwner(){
    if(!$this->owner){
      $alias = $GLOBALS['db']->ReadField("SELECT alias FROM {'dbprefix'}pages 
                                          WHERE id = '".$this->ownerid."'");
      if($alias){
        $this->owner = new Page();
        $this->owner->loadProperties($alias);
      }
    }
    return $this->owner;
  }

  function getBreadcrump(){
    if(!$this->owner) $this->getOwner();
    if($this->owner){
      $breadcrump = $this->owner->getBreadcrump();
    }
    $breadcrump[] = array($this->alias,$this->title);
    return $breadcrump;
  }

  function readContent($dirpraefix){
    $filename = $dirpraefix."content/articles/".$this->alias.".php";
    $handle = @fopen ($filename, "rb");
    if($handle && filesize($filename) > 0){
      $contents = fread ($handle, filesize ($filename));
      fclose ($handle);
    }
    else{
      $contents = "";
    }
    return $contents;
  }

  function save(){
    $res = $GLOBALS['db']->Execute("UPDATE {'dbprefix'}pages SET
                                    title = '".$this->title."',
                                    alias = '".$this->alias."',
                                    menu = '".$this->menu."' 
                                    WHERE id = '".$this->id."'");
    $this->meta->save();
    if($res){
      $args['title'] = $this->title;
      $args['alias'] = $this->alias;
      $args['menu']  = $this->menu;
      $args['id']    = $this->id;
      EventManager::raiseEvent("page_saved","../",$args);
    }
    return $res;
  }
  
  function writeContent($dirpraefix,$content,$alias){
    if(!$alias){
      $alias = $this->alias;
    }
    $filename = $dirpraefix."content/articles/".$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;
  }

  function create($dirpraefix,$alias){
    $res = $GLOBALS['db']->Execute("INSERT INTO {'dbprefix'}pages (alias) VALUES ('".$alias."')");
    self::writeContent($dirpraefix,"",$alias);
    if($res){
      $args['id']    = $GLOBALS['db']->InsertID();
      $args['alias'] = $alias;
      EventManager::raiseEvent("page_created","../",$args);
    }
    return $GLOBALS['db']->InsertID();
  }

  function deleteContent($dirpraefix){
    $filename = $dirpraefix."content/articles/".$this->alias.".php";
    if(file_exists($filename)){
      unlink($filename);
      $args['alias'] = $this->alias;
      $args['filename']  = $filename;
      EventManager::raiseEvent("pagecontent_deleted","../",$args);
    }
  }

  function delete(){
    $res = $GLOBALS['db']->Execute("DELETE FROM {'dbprefix'}pages WHERE alias = '".$this->alias."'");
    if($res){
      $args['alias'] = $this->alias;
      EventManager::raiseEvent("page_deleted","../",$args);
    }
    return $res;
  }
}
?>

Wie ihr seht gibt es in der cms_pages die neue Spalte editor. Die wird so erstellt:

ALTER TABLE `cms_pages` ADD `editor` VARCHAR( 50 ) DEFAULT 'WYSIWYG' NOT NULL ;

Natürlich müssen wir auch hier wieder den Installer bearbeiten installer/installer.php:

mysql_query("CREATE TABLE `".$this->params[3]['praefix']."pages` (
  `id` int(8) NOT NULL auto_increment,
  `alias` varchar(255) NOT NULL,
  `title` varchar(255) NOT NULL,
  `owner` int(11) NOT NULL default '-1',
  `menu` int(11) NOT NULL default '-1',
  `editor` varchar(50) NOT NULL default 'WYSIWYG',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 AUTO_INCREMENT=35 ;");

Das ganze ist noch nicht ganz vollständig. Wir müssen noch das displayEditable befüllen, wo wir noch einiges aus die Klasse Page in die Klasse WYSIWYG einbauen müssen. Außerdem müssen wir alle möglichen Editoren auflisten und der Seite zuordnen.