Ich möchte eine weitere neue selbstentwickelte Typo3 Extension vorstellen.
Ausgangslage: Wir wollen wie bekannt an der Universität Konstanz Typo3 als uniweites CMS einführen. Das Problem ist dabei, dass wir zwar das Layout vorgeben, jeder Fachbereich und jede Einrichtung (BE-Gruppe mit eigenem Zweig) aber die Farben selber wählen darf. Beispiel: Rechenzentrum und KIM. Gleiches Layout, unterschiedliche Farben. Die Zuweisung der Farben erfolgt über CSS-Dateien, die für jede Gruppe eingebunden werden. Der Benutzer soll nun die Farben ändern können, ohne CSS lernen und eingeben zu müssen, ohne die CSS-Datei auf dem Server direkt zu manipulieren und ohne mit TypoScript-Code in Berührung zu kommen. Gefragt war also eine grafische Möglichkeit. Eine bestehende Lösung konnte ich nicht finden.
CSS Editor
Lösung: Die von mir entwickelt Extension baut auf folgendem Grundprinzip auf. Es wird die dem aktuelle eingeloggten Backend-Benutzer zugehörige Gruppe ermittelt und das bestehende CSS-File eingelesen, das den Namen der Gruppe tragen muss. Im CSS-File sind die zu verändernden Parameter durch eindeutige Marker gekennzeichnet. Das Backend-Modul liest die Werte ein und stellt sie mit Erläuterungen in Textfeldern dar. Die Hex-Werte können direkt manipuliert werden.
Um dem Benutzer, der mit Hex-Werten nichts anfangen kann, Unterstützung zu geben ist ein Color Chooser eingebaut. Er ist aus der Yahoo UI Library entnommen. Jeder Wert eines Parameters kann im Color Chooser angezeigt und dann bequem durch Ziehen manipuliert werden. RGB- und HSV-Werte können direkt eingegeben werden.
Unterhalb des Eingabebereiches findet sich eine Live-Vorschau, die das Layout unserer Webseiten zeigt. Bei Veränderung einer Farbe wird die Vorschau direkt verändert, so dass man die Wirkung von geänderten Farben direkt ersehen kann. Sind die Farben nach Wunsch verändert, dann können sie per Mausklick in die CSS-Datei geschrieben werden und sind dann im jeweiligen Webauftritt verfügbar.
Also ein grafischer Farbeditor für CSS-Dateien mit dem man die Stylesheets bequem und ohne Vorkenntnisse ändern kann. Zusammen mit einem in der neuen Version dann hoffentlich vernünftigen Frontend Editing kann man dann auch wenig technik-affine Sekretärinnen (Achtung: 5€ in die Chauvi-kasse) auf das System loslassen.
Demonstration: Eine kurze Tour durch den CSS Editor zeigt das von mir am Bildschirm aufgenommene Youtube - Video indem man die Benutzerführung und das Look & Feel grob erkennen kann.
Weiterverwendung: Leider ist die Extension momentan sehr auf unsere lokalen Verhältnisse zugeschnitten. Deshalb ist sie auch nicht im TER verfügbar. Durch die individuellen Marker in den CSS-Dateien und die individuelle Vorschau halte ich es auch für sehr schwierig sie so anzupassen, dass man sie universell verwenden kann. Für alle Interessierten habe ich trotzdem den Code der mod1/index.php und der Beispiel-CSS Datei vorlage.css im erweiterten Blogeintrag hinterlegt
mod1/index.php
<?php /*************************************************************** * Copyright notice * * (c) 2008 Matthias Häger <matthias.haeger@uni-konstanz.de> * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is * free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * The GNU General Public License can be found at * http://www.gnu.org/copyleft/gpl.html. * * This script is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/
// DEFAULT initialization of a module [BEGIN] unset($MCONF); require_once('conf.php'); require_once($BACK_PATH.'init.php'); require_once($BACK_PATH.'template.php');
$LANG->includeLLFile('EXT:rz_csseditor/mod1/locallang.xml'); require_once(PATH_t3lib.'class.t3lib_scbase.php'); $BE_USER->modAccess($MCONF,1); // This checks permissions and exits if the users has no permission for entry. // DEFAULT initialization of a module [END]
/** Module 'CSS Editor' for the 'rz_csseditor' extension. * @author Matthias Häger <matthias.haeger@uni-konstanz.de> @package TYPO3 @subpackage tx_rzcsseditor */ class tx_rzcsseditor_module1 extends t3lib_SCbase { var $pageinfo;
/** Initializes the Module @return void */ function init() { global $BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;
parent::init();
/* if (t3lib_div::GP('clear_all_cache')) { $this->include_once[] = PATH_t3lib.'class.t3lib_tcemain.php'; } / }
/** Adds items to the ->MOD_MENU array. Used for the function menu selector. * @return void */ function menuConfig() { global $LANG; $this->MOD_MENU = Array ( 'function' => Array ( '1' => $LANG->getLL('function1'), '2' => $LANG->getLL('function2'), '3' => $LANG->getLL('function3'), ) ); parent::menuConfig(); }
/** Main function of the module. Write the content to $this->content If you chose "web" as main module, you will need to consider the $this->id parameter which will contain the uid-number of the page clicked in the page tree * @return [type] ... */ function main() { global $BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;
// Access check! // The page will show only if there is a valid page and if this page may be viewed by the user $this->pageinfo = t3lib_BEfunc::readPageAccess($this->id,$this->perms_clause); $access = is_array($this->pageinfo) ? 1 : 0;
//Einführung einer zusätzlichen Abfrage um die Extension auch für Nicht-Admins nutzbar zu machen. if (($this->id && $access) || ($BE_USER->user['admin'] && !$this->id) || 1==1) {
/** Generiert die Seite und gibt sie an die übergeordnete Funktion zurück. * @param String Name der Gruppe des Benutzers @param Array Die Parameter die in der CSS-Datei verändert werden sollen. @return String Output der Webseite */ function renderPage($group, $params) {
//Festlegung der Beschreibung der einzelnen Parameter $CSS_H1 = "Hintergrundfarbe Überschrift 1. Ordnung: "; $CSS_H2 = "Farbe der Überschrift 2. Ordnung: "; $CSS_NAVTOP = "Hintergrundfarbe Top-Menü mit Quicklinks: "; $CSS_NAVMAIN = "Hintergrundfarbe Hauptmenü: "; $CSS_LEFTNAV = "Hintergrundfarbe linkes Navigationsmenü: "; $CSS_CONTENT = "Hintergrundfarbe Hauptinhaltsbereich: "; $CSS_LINK = "Farbe eines Links im Inhaltsbereich: ";
//Einleitender Text $output = "In diesem Bereich können Sie Farben für Ihren Webauftritt anpassen. Das Layout der Universität wird vorgegeben, Ihre Wahl der Farben wird in einem eigenen CSS-File für Ihre Webseiten niedergelegt. Damit können Sie Ihre Seiten farblich nach Ihren Wünschen gestalten.<br /><br /> In jeder Zeile sehen Sie den aktuellen Hex-Farbwert für die angegebene Eingeschaft. Durch einen Klick auf Edit wird der Farbwähler daneben auf diesen Wert eingestellt. Sie können die Farbe frei verändern, die Auswirkungen können Sie direkt unten in der Vorschau beobachten. Mit einem Klick auf den Button \"Übernehmen\" wird der neue Farbwert übernommen (dargestellt durch rote Farbe). Mit \"Reset\" setzen Sie den Farbwähler auf den Ausgangswert zurück. Endgültig in die Datei geschrieben werden die Änderungen erst bei einem Klick auf \"Änderungen in Datei schreiben.\" <b>Vorsicht: Dieser Klick hat direkte Auswirkungen auf Ihre Webseite.</b> <br /><br />"; $output .= "Sie sind Angehöriger der Gruppe: ".$group."<br />";
//Globale JavaScript Variablen definieren um später die richtigen Wert in der Vorschau zu verändern. $output .= '<script type = "text/javascript">var ziel; var attribut;</script>';
} } $output .= "</table><br /><br /><input type = \"submit\" value=\"Änderungen in Datei schreiben\"> "; $output .= "<input type = \"reset\" value=\"Änderungen zurücksetzen\" onclick=\"location.reload()\">"; $output .= "</form><br />";
//Darstellung des Farbwählers $output .= $this->colorChooser(); //Darstellung der Live-Vorschau $output .= $this->renderVorschau($params, $css_config); //Rückgabe des Outputs. return $output;
}
/** Generiert und konfiguriert den Farbwähler, beinhaltet JavaScript Hilfsfunktionen. * @return String Output Farbwähler */ function colorChooser() { $output;
//Grundlegende Div-Boxen für den Inhalt, Einbindung der YUI Scripts und CSS-Files $output .= ' <div id="colorChooser" class="yui-skinsam"> <script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/utilities/utilities.js"></script> <script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/slider/slider-min.js"></script> <link rel="stylesheet" type="text/css" href="/fileadmin/templates/colorpicker.css"> <script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/colorpicker/colorpicker-min.js"></script> <div id="CC_container"></div>'; //JavaScripts für die Ausführung. Zuerst Initialisierung des Farbwählers, danach Funktion die aus einem gegebenen //Hex-Wert ein entsprechendes RGB-Array errechnet. Danach eine Funktion, die die Live-Vorschau aktualisiert und zum //Schluß ein Event-Listener der bei einer Farbveränderung im Farbwähler direkt eine Veränderung in der Vorschau bewirkt. $output .=' <script type="text/javascript"> var picker = new YAHOO.widget.ColorPicker("CC_container", { showhsvcontrols: true, showhexcontrols: true, images: { PICKER_THUMB: "picker_thumb.png", HUE_THUMB: "hue_thumb.png" } });
function hex2val(hex) { MyArray = new Array(parseInt(hex.substring(1,3),16), parseInt(hex.substring(3,5),16), parseInt(hex.substring(5,7),16)); return MyArray; }
/** Generiert eine Live-Vorschau der Webseite mit dem Grundlayout der Uni * @param Array Die Parameter die in der CSS-Datei verändert werden sollen. @param Array Array mit den verschiedenen Farbwerten @return String Output der Live-Vorschau */ function renderVorschau($params, $css_config) { $output = "";
//Zeichnung einer Webseite im Uni-Layout mit den CSS-Tags. Grundfarben im eingebundenen CSS-File $output .= '<div id="CSS_BODY"> <link rel="stylesheet" type="text/css" href="/fileadmin/templates/vorschau.css"> <div id="logo"><img src="http://cms.uni-konstanz.de/fileadmin/templates/uni/logo.jpg" border="0"></div> <div id="identityimage"><img src="http://cms.uni-konstanz.de/uploads/pics/home.png" width="220" height="134" border="0"></div> <div id="heading"><p>Demoseite<br>CSS Vorschau<br></p></div> <div id="CSS_NAVTOP"><ul><li><a>Home</a></li><li><a>Sitemap</a></li><li><a>Impressum</a></li></ul></div> <div id="CSS_NAVMAIN"><ul><li><a style="background:white;" class="active">Menüpunkt 1</a></li><li><a>Menüpunkt 2</a></li></ul></div> <div id="CSS_LEFTNAV"><ul class="leftnav"><li><a href="#">Unterseite</a></li><li><a href="#">2. Unterseite</a></li></ul></div> <div id="CSS_CONTENT"><h1 id="CSS_H1">Überschrift 1. Ordnung</h1> <p>Dies ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext. Diest ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext.</p> <h2 id="CSS_H2">Überschrift 2. Ordnung</h2> <p>Blindtext mit <a id="CSS_LINK" href="#">einem Link</a>!!!!!</p> </div> </div>';
//Generierung von JavaScript Code, der der Vorschau die initial eingelesenen Farbwerte aus dem übergebenen Array zuweist. $output .= '<script type="text/javascript">'; foreach($params as $unit) { if($unit == "CSS_H2" || $unit == "CSS_LINK") { $output .= "document.getElementById('".$unit."').style.color='".$css_config[$unit."_value"]."';"; } else { $output .= "document.getElementById('".$unit."').style.backgroundColor='".$css_config[$unit."_value"]."';"; } } $output .= '</script>';
//Rückgabe der Vorschau return $output; }
/** Öffnet die CSS-Datei, liest sie in ein Array und überschreibt die bisherigen Werte mit den neuen Angaben. * @param String Name der Gruppe des Benutzers @param Array Die Parameter die in der CSS-Datei verändert werden sollen. @return String Output der Webseite */ function updateCSS($group, $params) { //Bisherige Datei öffnen $file = file("../../../../fileadmin/templates/".$group.".css");
//Array der Parameter durchlaufen foreach($params as $unit){ if($unit == "CSS_H2" || $unit == "CSS_LINK") { //Zeile+3 muss ebenfalls geändert werden, damit die Linkfarbe auch bei a:visited gilt if($unit == "CSS_LINK") { $file[t3lib_div::_POST($unit."_line")] = "color:".t3lib_div::_POST($unit."_value").";\n"; $file[(int) t3lib_div::_POST($unit."_line") + 3] = "color:".t3lib_div::_POST($unit."_value").";\n"; } else { $file[t3lib_div::_POST($unit."_line")] = "color:".t3lib_div::_POST($unit."_value").";\n"; } } else { $file[t3lib_div::_POST($unit."_line")] = "background-color:".t3lib_div::_POST($unit."_value").";\n"; //Bei der Linksnavigation muss die Änderung der Farben auch auf die Untermenüs übertragen werden. Deshalb Zeile+3 +6 und +9 ebenfalls mit dem Farbwert beschreiben. if($unit == "CSS_LEFTNAV") { $file[(int) t3lib_div::_POST($unit."_line") + 3] = "background-color:".t3lib_div::_POST($unit."_value").";\n"; $file[(int) t3lib_div::_POST($unit."_line") + 6] = "background-color:".t3lib_div::_POST($unit."_value").";\n"; $file[(int) t3lib_div::_POST($unit."_line") + 9] = "background-color:".t3lib_div::_POST($unit."_value").";\n"; } } } $newcss; //Umwandlung Array in ein String foreach($file as $unit) { $newcss .= $unit; } //String in Datei schreiben t3lib_div::writeFile("../../../../fileadmin/templates/".$group.".css", $newcss); //Ins Logfile schreiben $this->log("[".date("Y-m-d - H:i:s")." - IP: ".$_SERVER['REMOTE_ADDR']."]@@@Geändertes CSS geschrieben: ___".$group."__"); }
/** Methode um in ein Logfile zu schreiben. * @params string In das Logfile zu schreibender String */ function log($message) { $logfile = fopen("/var/log/typo3/rz_css_editor.log", "a"); fwrite($logfile, $message."\n"); } }
if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rz_csseditor/mod1/index.php']) { include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rz_csseditor/mod1/index.php']); }
// Make instance: $SOBE = t3lib_div::makeInstance('tx_rzcsseditor_module1'); $SOBE->init();
// Include files? foreach($SOBE->include_once as $INC_FILE) include_once($INC_FILE);
$SOBE->main(); $SOBE->printContent();
vorlage.css mit Markern
Allgemein /
/***CSS_BODY***/ body { background-color: #FFFFFF; }
Sieht ja doch sehr nett und professionell aus. *Respekt*. Aber: Hättest Du nicht schönere Farben in der Videovorführung verwenden können oder wolltest Du gleich ein Beispiel für die Farbwahl der "wenig technik-affine Sekretärinnen" bringen?
nette Extension, aber das Video haettest doch auch noch bissel mit Sound hinterlegen koennen (mit nem "guten" Witz oder so).
Ansonsten sehr nobles Ding. Wobei sich die Frage stellt, ob den Designs soviel Freiheit gut tut .
Zum Schluss noch eine technische Frage: Das aktualisieren laeuft per Javascript, oder?
ja, das Aktualisieren läuft mittels JavaScript. Ich veränder einfach die Stylesheets zur Laufzeit. Die Freiheit muss ich geben, sonst heißt es ständig per Mail "Kannst Du die Farbe ändern, kannst Du dies, kannst Du jenes?"
Fan 1972 zu Pierre-Luc Sleigher Mo, 21.11.2011 20:33 jetzt wird alles besser !Neuer
Trainer und entlich ein neuer
zweiter Spieler.Kann nur sage
n super Wagner!!!!!!!
sporthose zu Pierre-Luc Sleigher Mo, 21.11.2011 18:55 vom trainerverschleiß vergleic
hbar mit dem hsv, vom spielern
achkaufniveau vergleichbar mit
den wölfen aus der vw-s [...]
däMario zu Pierre-Luc Sleigher Mo, 21.11.2011 16:58 Umbruch und Umbau???
Gerne hä
tten das ALLE Fans "VOR" der S
aison gesehen und nicht wenn e
s als Zuschauer -keinen- [...]
Abt Gaiser zu Die ordnende Hand Sa, 19.11.2011 16:08 Das mit dem Auspfeiffen sehe i
ch nicht als so schlimm an. De
r Fan darf sein Team bejubeln,
der Fan darf schweigen, [...]
Abt Gaiser zu Die ordnende Hand Sa, 19.11.2011 16:07 Ob das unbedingt der Center ma
chen muss, darüber lässt sich
natürlich streiten. Ich denke,
das ist auch immer ein [...]
nette Extension, aber das Video haettest doch auch noch bissel mit Sound hinterlegen koennen (mit nem "guten" Witz oder so).
Ansonsten sehr nobles Ding. Wobei sich die Frage stellt, ob den Designs soviel Freiheit gut tut
Zum Schluss noch eine technische Frage: Das aktualisieren laeuft per Javascript, oder?
Gruss aus FuWa City,
Markus
ja, das Aktualisieren läuft mittels JavaScript. Ich veränder einfach die Stylesheets zur Laufzeit. Die Freiheit muss ich geben, sonst heißt es ständig per Mail "Kannst Du die Farbe ändern, kannst Du dies, kannst Du jenes?"
Ein guter Witz fiel mir gerade nicht ein.