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

Bugfix Installer + Root-Verzeichnis speichern (CMS)

In den Vorbereitungen zur ContentLion Live Programmierung habe ich noch einen kleinen Bug im Installer gefunden. Und zwar wird zum einen die Sprache nicht richtig angelegt. Das liegt daran, dass wir diese mit falschen Rechten ausstatten. Neben de, Bugfix wird nun auch der absoloute Path des CMS gespeichert. So müssen wir zum Beispiel beim Template nicht mehr den Path übergeben. Die neue /installer/installer.php sieht so aus:

<?PHP
  class Installer{
    public $step         = 1;
    public $allsteps     = 5;
    public $steps        = null;
    public $params       = null;
    private $systemcheck = true;
    public $isInstalled  = false;

    public function __construct(){
      $this->addWelcomePage();
      $this->addLicencePage();
      $this->addCheckPage();
      $this->addDbSettings();
      $this->addSettings();
      $this->addFinish();
      $this->allsteps = sizeof($this->steps);
    }

    private function addWelcomePage(){
      $step['headline'] = 'Willkommen';
      $step['content']  = '<p>
        Willkommen zur ContentLion Installation!</p>
      <p>
        Sie haben mit ContentLion eine gute Wahl getroffen.<br />
        ContentLion ist ein simples und stabiles CMS, <br />
        was Sie nicht im Stich l&auml;sst!
      </p><p>
        Wenn Sie doch Probleme bei der Installation haben, <br />
        kann Ihnen 
        <a href="http://www.contentlion.de/doku.htmlindex.php?title=Installation">
          dieser Artikel
        </a>
        weiterhelfen.
      </p>';
      $this->steps[] = $step;
    }

    private function addLicencePage(){
      $step['headline'] = 'Lizenz';
      $step['content']  = '
ContentLion fällt unter den Lizenzvertrag <a href="http://www.gnu.org/licenses/gpl-2.0.html">CC-GNU GPL</a> der Version 2.0 oder höher.<br />
Es gibt grob Beschrieben folgende Einschr&auml;nkungen:
<ul>
  <li>In jeder Vervielf&auml;tigung des Programmes muss ContentLion genannt werden.</li>
  <li>Jede Vervielf&auml;tigung muss unter der gleichen Lizenz angeboten werden</li>
  <li>Bei Weitergabe muss der lesbare Quellcode mit&uuml;bergeben werden</li>
</ul><a href="http://www.gnu.org/licenses/gpl-2.0.html">
<img alt="CC-GNU GPL" border="0" src="http://creativecommons.org/images/public/cc-GPL-a.png" /></a><br />
';
      $this->steps[] = $step;
    }

    private function addCheckPage(){
      $step['headline'] = 'Systemcheck';
      $step['content']  = "<p>Hier werden die Systemanforderungen von ContentLion gepr&uuml;ft.<br />
                           Wenn etwas rot markiert ist, wird ContentLion auf Ihrem System leider nicht funktionieren.</p>
                           <table>
                             <tr>
                               <td>PHP Version</td>
                               <td class='";
      if(substr(phpversion(),0,1) >= 5){
        $step['content'] .= "right'>Stimmt";
      }
      else{
        $step['content'] .= "wrong'>Stimm nicht";
        $this->systemcheck = false;
      }
      $step['content'] .= "    </td>
                             </tr>
                             <tr>
                               <td>Liegt in (Sub)Domain</td>
                               <td class='";
      if(count(split("/",$_SERVER['REQUEST_URI'])) == 2){
        $step['content'] .= "right'>Stimmt";
      }
      else{
        $step['content'] .= "wrong'>Stimm nicht";
        $this->systemcheck = false;
      }
      $step['content'] .= "    </td>
                             </tr>
                          </table>";
      $this->steps[] = $step;
    }

    public function getHeadline(){
      return $this->steps[$this->step-1]['headline'];
    }

    public function getContent(){
      $res =  $this->steps[$this->step-1]['content'];

      if($this->step == $this->allsteps){
          $this->runInstallation();
      }
      if($this->params[$this->step-1]){
        foreach($this->params[$this->step-1] as $name=>$value){
          $res = str_replace("{".$name."}",$value,$res);
        }
      }
      return $res;
    }

    private function runInstallation(){
      $this->writeDBSettings();
      include('system/dbsettings.php');
      $connection = mysql_connect($dbhost,$dbuser,$dbpassword);
      mysql_select_db($db,$connection);
      $this->createTables();
      $this->insertRows();
      $this->isInstalled = true;
    }

    private function addDbSettings(){
      $step['headline'] = 'Datenbank Einstellungen';
      $step['content']  = '
<table>
  <tr>
    <td>Host:</td>
    <td><input name="host" value="{host}" /></td>
  </tr>
  <tr>
    <td>Datenbank:</td>
    <td><input name="database" value="{database}" /></td>
  </tr>
  <tr>
    <td>Benutzer:</td>
    <td><input name="user" value="{user}" /></td>
  </tr>
  <tr>
    <td>Passwort:</td>
    <td><input name="password" type="password" value="{password}" /></td>
  </tr>
  <tr>
    <td>Tabellen Pr&auml;fix:</td>
    <td><input name="praefix" value="{praefix}" /></td>
  </tr>
</table>';
      $this->params[3]['host']     = 'localhost';
      $this->params[3]['database'] = '';
      $this->params[3]['user']     = '';
      $this->params[3]['password'] = '';
      $this->params[3]['praefix']  = 'cl_';
      $this->steps[] = $step;
    }

    private function addFinish(){
      $step['headline'] = 'Fertigstellen';
      $step['content']  = 'ContentLion wurde erfolgreich installiert.<br />
      Sie werden nun zur Login-Seite weitergeleitet.
      Sollte die Weiterleitung nicht funktionieren, klicken Sie <a href="/admin/">hier</a>.';
      $this->steps[] = $step;
    }

    public function showBackButton(){
      return $this->step > 1 and $this->step != $this->allsteps;
    }

    public function showNextButton(){
      return $this->step < $this->allsteps-1;
    }

    public function showFinishButton(){
      return $this->step == $this->allsteps-1;
    }

    private function addSettings(){
      $step['headline'] = 'Website Einstellungen';
      $step['content']  = '
<table>
  <tr>
    <td>Name der Website:</td>
    <td><input name="name" value="{name}" /></td>
  </tr>
  <tr>
    <td>Benutzername:</td>
    <td><input name="user" value="{user}" /></td>
  </tr>
  <tr>
    <td>Password:</td>
    <td><input name="password" type="password" value="{password}" /></td>
  </tr>
</table>
';
      $this->params[4]['name']     = '';
      $this->params[4]['user']     = '';
      $this->params[4]['password'] = '';
      $this->steps[] = $step;
    }

    public function validateCurrentStep(){
      return $this->step != 3 or $this->systemcheck;
    }

    private function writeDBSettings(){
      $handle = fopen ( "system/dbsettings.php.", "w" );
      fwrite($handle,'
<?PHP
  $dbpraefix = "'.$this->params[3]['praefix'].'";
  $dbhost = "'.$this->params[3]['host'].'";
  $dbpassword = "'.$this->params[3]['password'].'";
  $dbuser = "'.$this->params[3]['user'].'";
  $db = "'.$this->params[3]['database'].'";
?>');
      fclose($handle );
    }

    private function createTables(){
      mysql_query("CREATE TABLE `".$this->params[3]['praefix']."activated_plugins` (
  `path` varchar(100) NOT NULL,
  PRIMARY KEY  (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."custom_css` (
  `id` varchar(100) NOT NULL,
  `stylePath` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."dashboards` (
  `id` int(10) NOT NULL,
  `col` int(1) NOT NULL,
  `row` int(2) NOT NULL,
  `path` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`,`col`,`row`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."events` (
  `event` varchar(50) NOT NULL,
  `file` varchar(50) NOT NULL,
  PRIMARY KEY  (`event`,`file`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."images` (
  `path` varchar(255) NOT NULL,
  `name` varchar(75) NOT NULL,
  `description` varchar(255) NOT NULL,
  PRIMARY KEY  (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."menu` (
  `id` int(2) NOT NULL,
  `menuID` int(3) NOT NULL,
  `title` varchar(100) NOT NULL,
  `href` varchar(255) NOT NULL,
  `type` int(1) NOT NULL,
  PRIMARY KEY  (`id`,`menuID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."menu_names` (
  `id` int(4) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."meta_global` (
  `name` varchar(100) NOT NULL,
  `content` varchar(100) NOT NULL,
  PRIMARY KEY  (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."meta_local` (
  `name` varchar(100) NOT NULL,
  `page` int(11) NOT NULL,
  `content` varchar(100) NOT NULL,
  PRIMARY KEY  (`name`,`page`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
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 ;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."settings` (
  `role` int(10) NOT NULL default '3',
  `area` varchar(20) NOT NULL,
  `areaType` varchar(20) NOT NULL,
  `property` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL,
  `activated` int(1) NOT NULL default '1',
  `description` varchar(75) NOT NULL,
  `type` varchar(50) NOT NULL,
  PRIMARY KEY  (`role`,`area`,`areaType`,`property`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."skins` (
  `id` int(3) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."user` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `role` int(10) NOT NULL,
  PRIMARY KEY  (`id`,`name`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."widgets` (
  `path` varchar(255) NOT NULL,
  `name` varchar(50) NOT NULL,
  `class` varchar(50) NOT NULL,
  PRIMARY KEY  (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."roles` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."pagetypes` (
  `id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
  `class` VARCHAR( 50 ) NOT NULL ,
  `name` VARCHAR( 50 ) NOT NULL ,
  PRIMARY KEY ( `id` ) ) TYPE = MYISAM ;");
mysql_query("CREATE TABLE `".$this->params[3]['praefix']."role_rights` (
  `role` int(10) NOT NULL,
  `page` int(10) NOT NULL,
  PRIMARY KEY  (`role`,`page`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;");
}

    private function insertRows(){
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu_names` VALUES (1, '{admin}');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (1, 1, 'Dashboard', '/admin/',1;");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (2, 1, 'Seiten', '/admin/index.php?page=sites',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (3, 1, 'Menüs', '/admin/index.php?page=menues',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (4, 1, 'Dateien', '/admin/index.php?page=files',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (5, 1, 'Plugins', '/admin/index.php?page=plugins',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (7, 1, 'Einstellungen', '/admin/index.php?page=settings',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (8, 1, 'Benutzer', '/admin/index.php?page=user',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."menu` VALUES (9, 1, 'Logout', '/admin/index.php?page=logout',1);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."user` VALUES (1, '".$this->params[4]['user']."', '".md5($this->params[4]['password'])."',2);");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'global', 'global', 'title', '".$this->params[4]['name']."', 1, 'Titel des CMS','textbox');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'global', 'global', 'selectedskin', '1', 1, 'Aktueller Skin','skinselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'global', 'global', 'selectedmobileskin', '1', 1, 'Mobiler Skin','mobileskinselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'default', 'skins', 'skinbgcolor', 'dedede', 1, 'Hintergrundfarbe','colorpicker');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'default', 'skins', 'skinforecolor', '525252', 1, 'Schriftfarbe','colorpicker');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'default', 'skins', 'skinhighlight1', 'ff0000', 1, 'Highlight Farbe 1','colorpicker');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'default', 'skins', 'skinhighlight2', 'b3fa00', 1, 'Highlight Farbe 2','colorpicker');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3,'global', 'global', 'host', 'http://".$_SERVER['HTTP_HOST']."', 1, 'URL der Startseite','textbox');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3, 'global', 'global', 'mainmenu', '4', 0, 'Hauptmenü', 'menueselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3, 'global', 'global', 'accessdenied', '0', 1, 'Zugriff-Verweigert-Seite', 'pageselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3, 'global', 'global', 'iconset', 'famfamfam', 1, 'Iconset', 'iconsetselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (2, 'global', 'global', 'mainmenu', '4', 1, 'Hauptmenü', 'menueselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3, 'global', 'global', 'language', 'de', 1, 'Sprache', 'languageselector');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."settings` VALUES (3, 'global', 'global', 'root', '".$_SERVER['DOCUMENT_ROOT']."/', 1, 'Root-Path', 'textbox');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."skins` VALUES (1, 'default');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."skins` VALUES (2, 'mobile');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."roles` VALUES (1, 'Gast');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."roles` VALUES (2, 'Administator');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."roles` VALUES (3, 'Alle');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."pagetypes` VALUES (1, 'wysiwyg', 'Textseite');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."pagetypes` VALUES (2, 'login', 'Login');");
      mysql_query("INSERT INTO `".$this->params[3]['praefix']."pagetypes` VALUES (3, 'dashboard', 'Dashboard');");
    }

    public function destroy(){
      unlink('installer/installer.php');
      unlink('installer/logo.jpg');
      rmdir('installer');
      unlink('install.php');
      $_SESSION['installer'] = null;
      unset($this);
    }
  }
?>

Den Root-Path müsst auch ihr in den Settings aufnehmen. Führt einfach den oben eingefügten SQL-Query aus.

Den neuen Root-Path können wir nun bereits im Dashboard sowie in den Templates nutzen. Fangen wir mal mit dem Dashboard an. In der Funktion getWidget der Klasse /system/classes/widgetcontroller.php können wir diese Einstellung auslesen:

    function getWidget($data){
      include_once(getSetting("global","global","root").'system/plugins/'.$data->path);
      return new $data->class();
    }

Weiter geht’s mit der Klasse /system/classes/template.php. Hier werden alle roots rausgenommen und durch den neuen Setting ersetzt. Die Funktion load ist nun einen Parameter kürzer:

    public function load($template){
      $path = $this->getTemplatePath($template);
      if(file_exists($path)){

Bei der Funktion getTemplatePath wurde das gleiche gemacht und zusätzlich der Setting ausgelesen:

   public function getTemplatePath($name){
      $namespaces = split("_",strtolower($name));
      $res = getSetting("global","global","root");
      $skin = SkinController::getCurrentSkinName();
      if(sizeOf($namespaces) == 3){
        if($namespaces[0] == "plugin"){
          if(file_exists(getSetting("global","global","root")."/system/skins/".$skin."/templates/plugins/".$namespaces[1]."/".$namespaces[2].".html")){
            $res .= "/system/skins/".$skin."/templates/plugins/".$namespaces[1]."/".$namespaces[2].".html";
          }
          else{
            $res .= "/system/plugins/".$namespaces[1]."/templates/".$namespaces[2].".html";
          }
          $imported = true;
        }
      }
      else if(sizeOf($namespaces) == 2){
        if($namespaces[0] == "form"){
          if(file_exists(getSetting("global","global","root")."/system/skins/".$skin."/templates/forms/".$namespaces[1].".html")){
            $res .= "/system/skins/".$skin."/templates/forms/".$namespaces[1].".html";
          }
          else{
            $res .= "/system/templates/forms/".$namespaces[1].".html";
          }
          $imported = true;
        }
        else if($namespaces[0] == "control"){
          if(file_exists(getSetting("global","global","root")."/system/skins/".$skin."/templates/controls/".$namespaces[1].".html")){
            $res .= "/system/skins/".$skin."/templates/controls/".$namespaces[1].".html";
          }
          else{
            $res .= "/system/templates/controls/".$namespaces[1].".html";
          }
          $imported = true;
        }
      }
      if(!$imported){
        if(file_exists(getSetting("global","global","root")."/system/skins/".$skin."/templates/".$name.".html")){
          $res .= "/system/skins/".$skin."/templates/".$name.".html";
        }
        else{
          $res .= "/system/templates/".$name.".html";
        }
      }
      return $res;
    }

Da wir die Parameter nicht mehr benötigten, brauchen wir diese auch beim Aufbau der Templates nicht. Deswegen können wir nun alle load-Aufrufe bearbeiten. Los geht’s mit /admin/includes/addImage.php:

$template->load("message");

/admin/includes/files.php:

  $template->load("files");

/admin/includes/menu-delete.php:

	$template->load("menu_delete");

und später:

    $template->load("message");

/admin/includes/menu-edit.php:

  $template->load("menu_edit");

/admin/includes/menu-new.php:

  $template->load("menu_new");

und später:

	  $template->load("message");

/admin/includes/menues.php:

  $template->load("menus");

/admin/includes/plugins.php:

  $template->load("plugins");

/admin/includes/site-delete.php:

	 $template->load("site_delete");

und später:

$template->load("message");

/admin/includes/site-edit.php:

  $template->load("site_edit");

/admin/includes/site.new.php:

	$template->load("site_new");

und später:

	 $template->load("site_new_succeeded");

und noch später:

	 $template->load("message");

/admin/includes/sites.php:

  $template->load("sites");

/admin/includes/upload.php:

  $template->load("upload");

/admin/includes/user.php:

  $userlist->load("user_list");

/system/classes/menuentry:

	  $template->load("menuentry_editable");

/system/classes/skinselector.php:

	  $template->load("control_skinselector");

/system/classes/wysiwyg.php:

		$template->load("control_wysiwyg");

/system/classes/settingsform.php:

	  $template->load("form_settings");

Zu guter letzt noch eine kleine Änderung in /admin/includes/dashboard.php:

<?PHP
  $dashboard = new Dashboard();
  $dashboard->id = 1;
  $dashboard->display();
?>