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="Ä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 ä;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.
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Kommentare
Daniel schrieb am 20.02.2010:
Hi stevie. Ich bekomme gerade diese Fehlermeldung Parse error: syntax error, unexpected '&' 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 " 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
Über uns
Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project