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

Typisierte Einstellungen Teil 2 + Bugfix (CMS)

In der Datenbank unseres CMS kann man bereits einen Typ für die Einstellungen hinterlegen. Heute geht es daran, diesen Typ auch zu benutzen. Aber vorher gibt es noch einen kleinen Bugfix bei der Vorschaufunktion.

Wenn man einen Artikel in der Vorschau ansieht und ihn danach speichern möchte, bekommt man wieder die Vorschau zu sehen. Das liegt daran, dass mit JavaScript die action des Form-Tags überschrieben wurde. Dies müssen wir beim Speichern einfach rückgängig machen (admin/includes/site-edit.php):

<input name="save" type="submit" value="&Auml;ndern" onclick="form.action='<?PHP echo $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'] ?>' ; target='_self' ; return true" />

Weiter gehts zu den Einstellungen. Ich habe mir das so vorgestellt, das jeder Einstellungstyp in einer eigenen Klasse gespeichert ist. Diese besitzt die Eigenschaften name und value und die Methode display. Schön objektorientiert erstellen wir also vorher die Basisklasse Control (system/classes/control.php):

<?PHP
  abstract class Control{
    public $name  = "";
    public $value = "";

    public abstract function display();
  }
?>

Das wohl meist verwendete Control wird die Textbox sein. Deswegen fangen wir auch damit an. Unsere Control-Klassen werden übrigens alle klein geschrieben (/system/classes/textbox.php):

<?PHP
  class textbox extends Control{

    public function display(){
      echo "<input name="".htmlentities($this->name).""value="".htmlentities($this->value)."" />";
    }

  }
?>

Die drei anderen Tools werden erst einmal genauso aufgebaut sein. Diese kommen in späteren Beiträgen an der Reihe. So sicht die /system/classes/skinselector.php aus:

<?PHP
  class skinselector extends Control{

    public function display(){
      echo "<input name="".str_replace(""","",htmlentities($this->name)).""value="".str_replace(""","",htmlentities($this->value))."" />";
    }

  }
?>

Das ist die /system/classes/menueselector.php:

<?PHP
  class menueselector extends Control{

    public function display(){
      echo "<input name="".str_replace(""","",htmlentities($this->name)).""value="".str_replace(""","",htmlentities($this->value))."" />";
    }

  }
?>

Und zu guter letzt unser Colorpicker (/system/classes/colorpicker.php):

<?PHP
  class colorpicker extends Control{

    public function display(){
      echo "<input name="".str_replace(""","",htmlentities($this->name)).""value="".str_replace(""","",htmlentities($this->value))."" />";
    }

  }
?>

Fehlt nur noch die Benutzung in der /admin/includes/settings.php. Hier habe ich nun auch das Layout ein wenig verändert:

<fieldset style="width:500px;">
  <legend>Einstellungen &auml;ndern</legend>
  <table style="width:100%">
  <?PHP
    $res = mysql_query("SELECT * FROM ".$dbpraefix."settings WHERE activated = 1");
    while($row = mysql_fetch_assoc($res)){
      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>

In den nächsten Artikeln werden dann die Controls mit Leben befüllt.

Kommentare

Daniel schrieb am 20.02.2010:

Hi stevie. Ich bekomme gerade diese Fehlermeldung Parse error: syntax error, unexpected '&amp;' in xyzhtdocsadminincludessettings.php on line 16

Stefan Wienströer schrieb am 20.02.2010:

Da ist nen Fehler beim Syntax-Highlighting aufgetreten, mom ich reparier das mal. tohtml.com makiert neuerdings alle " durch &quot; Hab wohl vergessen ein oder zwei zu ersetzen.

Daniel schrieb am 22.02.2010:

Fehlt noch das URL-Wählfeld.

Johann Löwen schrieb am 22.02.2010:

Hallo, ich sehe hier gerade das du die MySql-Funktionen in allen Klassen verwendest. Ich würde an deiner Stelle eine Datenbank-Klasse erstellen und diese überall verwenden. Vorteile: - Anpassung an neue Datenbanksysteme wird damit auf ein Minimum reduziert. - Die Variable "$dbpraefix" wird nur in einer Klasse verwendet und kann damit auch nicht vergessen werden. - Die SQL-Statements können an einer Zentrallen Stelle überprüft werden. - SQL-Fehler können an einer Stelle geloggt werden = weniger Code da auf das Loggen in Plugins verzichtet werden kann.

Stefan Wienströer schrieb am 22.02.2010:

Habs mal bei Codeplex eingetragen: http://contentlion.codeplex.com/WorkItem/View.aspx?WorkItemId=16482