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

Skinspezifische Einstellungen (CMS)

Derzeit kann man die Farben unseres CMSes in den globalen Einstellungen speichern. Doch nicht jeder Skin braucht die gleiche Anzahl von Farben / Einstellungen. Aus diesem Grund wird in diesem Beitrag die Möglichkeit geschaffen, die Einstellungen pro Skin einzustellen.

Zu erst benötigen wir folgende 2 neuen Spalten in der cms_settings:

  • area: Bestimmt in diesem Fall den namen des Skins
  • areaType: Name des Bereich-Typs. In diesem Fall ’skins‘

In SQL sieht das so aus:

ALTER TABLE `cms_settings` ADD `area` VARCHAR( 20 ) NOT NULL FIRST ,
ADD `areaType` VARCHAR( 20 ) NOT NULL AFTER `area` ;

Da wir bei mehreren Skins auch mehrere Properties mit den gleichen namen haben wollen, müssen wir zu erst den alten Primary Key entfernen:

ALTER TABLE `cms_settings` DROP PRIMARY KEY

Und den neuen mit den zusätzlichen Spalten area und areaType einfügen:

ALTER TABLEcms_settings ADD PRIMARY KEY (area,areaType,property);

Nun müsst ihr alle Einträge der settings in der Datenbank mit den Werten für area & areaType befüllen. Handelt es sich bei einem Setting um einen allgemeinen Eintrag (z.B. Titel) muss in beiden spalten ‚global‘ stehen. Gehört der setting zu den Skins muss bei area ‚default‘ und bei areaType ’skins‘ stehen.´

Kommen wir zum PHP-Code. Es gibt nun eine neue Klasse namens /system/classes/settingsform.php. Sie beinhaltet das Formular für die Einstellungen:

<?PHP
  class SettingsForm{
    public $area     = "global";
    public $areaType = "global";
    
    public function display(){
      if($_POST['save']){
        foreach($_POST as $property=>$value){
          if($property != "save"){
            setSetting($this->area,$this->areaType,$property,$value);
          }
        }
      }
    ?>
      <form style="float:left;width:600px;" action="<?PHP echo $_SERVER['REQUEST_URI']; ?>" method="POST">
        <fieldset style="width:500px;">
          <legend>Einstellungen &auml;ndern</legend>
          <table style="width:100%">
            <?PHP
              $rows = $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}settings WHERE area = '".$this->area."' AND areaType = '".$this->areaType."' AND activated = 1");
              if($rows){
                foreach($rows as $row){
                  echo "<tr><td><label for="".htmlentities($row->property)."">";
                  echo $row->description.":";
                  echo "</label></td><td>";
                  $control        = new $row->type;
                  $control->name  = $row->property;
                  $control->value = $row->value;
                  $control->display();
                  echo "</td></tr>";
                }
              }
            ?>
          </table>
          <br /><input type="submit" name="save" value="Speichern" />
        </fieldset>
      </form>
    <?PHP
    }
  }
?>

In der Datei /admin/includes/settings.phpkönnen wir nun diese Klasse benutzen und den alten Code entfernen. Außerdem habe ich eine Auflistung der Skins mit Settings-Einträgen hinzugefügt:

<h1>Einstellungen</h1>
<?PHP
  $settings = new SettingsForm();
  $settings->display();
?>
<div style="margin-left:500px;">
<h2>Skins</h2>
<?PHP
  $skins = $GLOBALS['db']->ReadRows("SELECT * FROM {'dbprefix'}skins WHERE LOWER(name) IN (SELECT DISTINCT name FROM {'dbprefix'}settings WHERE areaType = 'skins' AND area = {'dbprefix'}skins.name)");
  if($skins){
    foreach($skins as $skin){
      echo "<a href="/admin/index.php?page=skin-settings&skin=".urlencode($skin->name)."">".$skin->name."</a><br />";
    }
  }
?>
<h2>Plugins</h2>
<?PHP
  $plugins = new PluginList();
  $plugins->loadAll();
  foreach($plugins->plugins as $plugin){
    if($plugin->configurationFile != ''){
      ?>
      <a href="/admin/index.php?page=plugin-settings&plugin=<?PHP echo $plugin->path; ?>"><?PHP echo $plugin->name; ?></a><br />
      <?PHP
    }
  }
?>
</div>

Neu ist die Datei /admin/includes/skin-settings.php. Hier wird das Formular für die Skin-Einstellungen angezeigt:

<h1>Skin-Einstellungen <?PHP echo $_GET['skin']; ?></h1>
<?PHP
  $settings           = new SettingsForm();
  $settings->areaType = 'skins';
  $settings->area     = $_GET['skin'];
  $settings->display();
?>

Jetzt können wir bereits alle Settings erfassen. Nun müssen wir noch richtig auslesen und setzen. Dafür muss als erstes die Datei /system/settings.php erweitert werden:

<?PHP
function getSetting($area,$areaType,$property){
    $area     = $GLOBALS['db']->EscapeString($area);
    $areaType = $GLOBALS['db']->EscapeString($areaType);
    $property = $GLOBALS['db']->EscapeString($property);
    return $GLOBALS['db']->ReadField("SELECT value FROM {'dbprefix'}settings WHERE area = '".$area."' AND areaType = '".$areaType."' AND property = '".$property."'");
}
function setSetting($area,$areaType,$property,$value){
    $area     = $GLOBALS['db']->EscapeString($area);
    $areaType = $GLOBALS['db']->EscapeString($areaType);
    $property = $GLOBALS['db']->EscapeString($property);
    $value    =  $GLOBALS['db']->EscapeString($value);
    return $GLOBALS['db']->Execute("UPDATE {'dbprefix'}settings SET value = '".$value."' WHERE area = '".$area."' AND areaType = '".$areaType."' AND property = '".$property."'");
}
?>

Im /system/classes/skincontroller.php müssen 2 Methoden verändert werden:

  function getCurrentSkinId(){
    return getSetting("global","global","selectedskin");
  }
  function getCurrentMobileSkinId(){
    return getSetting("global","global","selectedmobileskin");
  }

Hinzu kommen noch einige Methoden der /system/sys.php:

<?php
  function getColor($area,$areaType,$id){
    return "#".getSetting($area,$areaType,"skin".$id);
  }
  
  function getTitle(){
    return getSetting("global","global","title");
  }
   
  function getFullSkinPath(){
    return getSetting("global","global","host")."/".SkinController::getCurrentSkinPath()."/";
  }
?>

Und die /system/skins/default/index.php die die skinspezifischen Einstellungen abfragt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml/" xml:lang="de">
  <head>
    <?PHP
      sys::includeHeader();
    ?>
    <link rel='stylesheet' href="<?PHP echo sys::getFullSkinPath(); ?>style.css" type="text/css" media="all" />
    <styletype="text/css">
      body{
        color: <?PHP echo sys::getColor("default","skins","forecolor"); ?>;
      }
      a{
        color: <?PHP echo sys::getColor("default","skins","highlight1"); ?>;
      }
      a:visted{
        color: <?PHP echo sys::getColor("default","skins","highlight2"); ?>;
      }
      #container{
        background-color:<?PHP echo sys::getColor("default","skins","bgcolor"); ?>;
        border: 1px solid  <?PHP echo sys::getColor("default","skins","highlight1"); ?>;
      }
      #content{
        <?PHP if(sys::localMenuExists()){
        ?>
        width:78%;
        position:relative;
        margin-left:20%;
        <?PHP
        }
        ?>
      }
    </style>
  </head>
  <body>
    <center>
      <div id="container">
        <h1><?PHP echo sys::getTitle(); ?></h1>
        <?PHP
          sys::displayGlobalMenu("<ul id="globalmenu">","</ul>","<li>"," </li>",
                                 "globalmenu");
        ?>
        <?PHP
          sys::displayLocalMenu("<ul id="localmenu">","</ul>","<li>","</li>",
                                "localmenu");
        ?>
        <div id="content">
          <div id="breadcrump">
            <?PHP
              sys::displayBreadcrump(" -&gt; ","breadcrump","bc");
            ?>
          </div>
          <?PHP
            if($_POST['content']){
              echo $_POST['content'];
            }
            else{
              sys::includeContent();
            }
          ?>
        </div>
      </div>
    </center>
  </body>
</html>

Das ist für heute der letzte Beitrag am ContentLion-Day. Fünf Beiträge an einem Tag war schon eine Menge arbeit, aber dafür sind wir heute auch weit gekommen. Wir können nun mobile Skins einrichten, nach dem Login passend weitergeleitet werden, Seiten in Ordner unterteilen, Hauptmenü über die Menüs ändern und schließlich auch skinspezifische Einstellungen vornehmen. Evtl. werde ich so eine Beitragsreihe an einem Tag mal wieder wiederholen. So kommen wir dem Meilstein Alpha-Version immer näher.