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

Seiten in Datenbank speichern (CMS)

Derzeit speichern wir die Seiten ja noch in Dateiform – Das änder sich heute! Wir können ja mitlerweile unterschiedliche Seitentypen erstellen, weswegen wir auch keine PHP-Tags unterstützten müssen. Durch die Speicherung in der Datenbank können wir später auch eine Suche erstellen.

Zunächst einmal brauchen wir eine neue Spalte in unserer pages-Tabelle: content als text.

Da wir in der Klasse Text darauf zugreifen, müssen wir auch hier den Inhalt auslesen. gebrauchen tuen wir es aber erst im Editor. Damit wir später nicht auf dumme Ideen kommen, habe ich es in der Klasse editorContent genannt. Das Speichern und auslesen geht dann so: /system/classes/page.php:

<?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;
  private $editorContent = "";

  function loadProperties($alias){
    if ($alias == "") {
      $alias = "home";
    }
    $this->alias = $alias;
    $row = $GLOBALS['db']->ReadRow("SELECT * FROM {'dbprefix'}pages 
                           WHERE alias = '".$alias."'");
    $this->load($row);
  }

  function loadPropertiesById($id){
    $row = $GLOBALS['db']->ReadRow("SELECT * FROM {'dbprefix'}pages 
                           WHERE id = '".$id."'");
    $this->load($row);
  }

  function load($data){
    if($data){
      $this->id            = $data->id;
      $this->title         = $data->title;
      $this->ownerid       = $data->owner;
      $this->menu          = $data->menu;
      $this->alias         = $data->alias;
      $this->editorContent = $data->content;
      $this->meta          = new Meta();
      $this->meta->pageid  = $this->id;
      $this->meta->load();
      $this->editor = new $data->editor($this);
      if(!isset($_SESSION['user']) || !isset($_SESSION['user']->role) || !$_SESSION['user']->role->canAccess($this)){
        throw new AccessDeniedException("Access denied: ".$this->alias);
      }
    }
    else{
      throw new FileNotFoundException("File Not Found: ".$this->alias);
    }
  }

  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 getBreadcrumb(){
    if(!$this->owner) $this->getOwner();
    if($this->owner){
      $breadcrump = $this->owner->getBreadcrumb();
    }
    $breadcrump[] = array($this->alias,$this->title);
    return $breadcrump;
  }

  function save(){
    $title   = $GLOBALS['db']->EscapeString($this->title);
    $alias   = $GLOBALS['db']->EscapeString($this->alias);
    $menu    = $GLOBALS['db']->EscapeString($this->menu);
    $id      = $GLOBALS['db']->EscapeString($this->id);
    $editorContent = $GLOBALS['db']->EscapeString($this->editorContent);
    $res = $GLOBALS['db']->Execute("UPDATE {'dbprefix'}pages SET
                                    title    = '".$title."',
                                    alias    = '".$alias."',
                                    menu     = '".$menu."' ,
                                    content  = '".$editorContent."' 
                                    WHERE id = '".$id."'");
    $this->meta->save();
    if($res){
      $args['title']   = $this->title;
      $args['alias']   = $this->alias;
      $args['menu']    = $this->menu;
      $args['id']      = $this->id;
      $args['content'] = $this->content;
      EventManager::raiseEvent("page_saved","../",$args);
    }
    return $res;
  }

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

  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;
  }

  function getPagesTypes(){
    return $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}pagetypes");
  }

  function displayBreadcrumb($separator,$class,$idpraefix){
    $this->editor->displayBreadcrumb($separator,$class,$idpraefix);
  }

  static function getPagesByDir($dir){
    $dir = $GLOBALS['db']->EscapeString($dir);
    if(substr($dir,0,1) == "/"){
      $dir = substr($dir,1);
    }
    return $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}pages 
                           WHERE alias LIKE '".$dir."%'");

  }

  public function getEditorContent(Editor $editor){
    return $this->editorContent;
  }

  public function setEditorContent($content){
    $this->editorContent = $content;
  }
}

?>

Die Klasse /system/classes/wysiwyg.php kann nun sehr verkleinert werden. Wir brauchen keinen Dateizugriff und können einfach auf die eben hinzugefügte Variable zurückgreifen:

<?PHP
  class WYSIWYG extends Editor{
    function __construct($page){
      $this->page = $page;
    }

    public function display(){
      echo $this->page->getEditorContent($this);
    }

    function getHeader(){
    }

    public function getEditableCode(){
        $template = new Template();
        $template->load("control_wysiwyg");
        $template->assign_var("CONTENT",$this->page->getEditorContent($this));
        $template->assign_var("HOST",Settings::getInstance()->get("host"));
        $template->assign_var("ALIAS",$this->page->alias);
        $template->assign_var("URL",Settings::getInstance()->get("host")."admin/pageedit.html?site=".$this->page->alias);
        return $template->getCode();
    }

    public function save($newPage,$oldPage){
        $this->page = $newPage;
        $this->page->setEditorContent($_POST['content']);
        $this->page->save();
    }

  }
?>

Im Installer habe ich alle benötigten Inhalte in die content-Spalte eingetragen und die Dateien gelöscht (Verzeichnisse müssen erstmal noch dableiben, kommen aber auch bald weg). Außerdem habe ich Verweise auf das alte Backend gelöscht, was eine Änderung in den PageIDs ergab. Diese musste dann in den Menüs übernommen werden, so dass doch relativ viele Änderungen zusammenkamen. Deswegen bitte ich aus diesem Grund hoffentlich fürs letzte Mal um eine Neuinstallation. Alle Änderungen stehen in Revistion 65.