Web-Editor auf Basis von HTML5, CSS und JavaScript

Gerade habe ich ein kleines Experiment mit den Möglichkeiten von HTML5 gemacht. Bis jetzt gibt es ja schon viele Online-Editoren, so genannte WYSIWYG-Editoren. Leider funktionieren viel nur mit iframes, ein Tag den ich persönlich nicht mag. Nach dem Lesen des HTML5-Buches von Peter Kröner erstellte ich mir einen kleinen eigenen Editor.

Durch das contenteditable-Attribute kann jeder Inhalt eines beliebige HTML-Tag von Benutzer geändert werden. Eine wunderbare Sache! So habe ich mit ein bisschen CSS für die Formatierung und JavaScript für das Ein- und Ausschalten eine ersten Entwurf eines Online-Editors geschaffen.

Hier geht es zur Demonstration und hier findet ihr den Download.

Tag 17 – WYSIWYG-Editor

Ein „WYSIWYG“-Editor ist ein Bearbeitungswerkzeug für Texte. Da der sichtbare Text im Browser nicht unbedingt mit dem im Quellcode übereinstimmt, müsste der Redakteur im einfachsten Fall den Quellcode von Hand schreiben. Dies ist aber fast immer sehr umständlich und zeitaufwändig.

Deshalb haben Software-Programmierer Werkzeuge entwickelt in denen man relativ einfach seinen Text schreiben kann und über spezielle Buttons dann nach seinen Wünschen formatieren. Die Software übernimmt dann die Formatierung. Das macht das Arbeiten mit HTML-Quellcode recht simple. Trotzdem sollte man immer wissen was man tut. Schließlich herrschen im Internet ein paar andere Regeln als im alt geliebten Druck.

FCKeditor

Ich habe mich bei REDcms für den FCKeditor entschieden. Er ist sehr einfach an die speziellen Bedürfnisse anzupassen, bietet aber trotzdem einen sehr großen Funktionsumfang.

Der Editor wurde mit JavaScript umgesetzt und ersetzt ein Eingabefeld durch den im iframe befindlichen Editor. Das Einbinden kann über verschiedene Sprachen geschehen. In meinem Fall ist das PHP 5. Die Syntax zum Einbinden des Editors bzw. die Verwendung der „Editor“-Klasse sieht dann wie folgt aus:

  1. $teaser = new FCKeditor(‘teaser’);
  2. $teaser->Value = ‘<p>Anzuzeigender Text</p>’;
  3. $teaser->Create();

Der übergebene Parameter beim Instanziieren der „Editor“-Klasse ist die ID des „textarea“-Tags der ersetzt werden soll. Um den Editor an den Browser zu senden kann man benutzen. In meinem Fall benutze ich die „CreateHTML()“-Methode der „Editor“-Klasse, um sie individuell in mein System einzusetzen.

Konfiguration

Die Konfiguration des Editors ist recht simple, da fast alle wichtigen Einstellungen schon vorgegeben sind. Da ich aber in meinem Fall ein paar Änderungen bzw. Anpassung vornehmen wollte, habe ich die „FCKeditor“-Klasse mit meiner „Editor“-Klasse erweitert.

Der Editor geht als erstes davon aus im Stammverzeichnis der Domain abgespeichert zu sein. Da ich mein System aber flexibel halten wollte, habe ich die „BasePath“-Eigenschaft angepasst. Auch habe ich die „ToolbarSet“-Eigenschaft auf „REDcms“ geändert. So kann ich in der Konfigurationsdatei des Editors meine eigenen Menüleisten erstellen. Auch empfand ich die Höhe des Eingabebereiches als zu klein, weswegen ich die „Height“-Eigenschaft auf 400 Pixel gesetzt habe. Zum Schluss passte ich die Konfiguration selbst mit 3 Einstellungen noch ein wenig an. Als erstes habe ich den Pfad zur Konfigurationsdatei geändert. Dann die Spracheinstellung auf deutsch geändert und zum Schluss die Verwendung des „LinkBrowsers“ aktiviert.

  1. class Editor extends FCKeditor
  2. {
  3. function __construct( $instanceName )
  4. {
  5. parent::__construct( $instanceName );
  6. $this->BasePath = BASEURL.‘/fckeditor/’;
  7. $this->ToolbarSet = ‘REDcms’;
  8. $this->Config["CustomConfigurationsPath"] = BASEURL.“/templates/scripts/myEditorConfig.js”;
  9. $this->Config['DefaultLanguage'] = ‘de’;
  10. $this->Height = 400;
  11. $this->Config['LinkBrowser'] = true;
  12. }
  13. function __destruct(){}
  14. }

myEditorConfing.js

Alle weiteren Einstellungen für die Inbetriebnahme des Editors habe ich dann in die „myEditorConfig.js“-Datei ausgelagert. So kann auch später noch relativ schnell Anpassungen vorgenommen werden.

Als erstes habe ich, wie oben schon beschrieben, meine neuen Menüleisten konfiguriert.

  1. FCKConfig.ToolbarSets["REDcms"] = [

  2. ['Source','-','Templates'],
  3. ['Cut','Copy','Paste','PasteText','PasteWord','-','SpellCheck'],
  4. ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
  5. ‘/’,
  6. ['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
  7. ['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote'],
  8. ['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
  9. ['Link','Unlink','Anchor'],
  10. ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
  11. ‘/’,
  12. ['Style','FontFormat'],
  13. ['FitWindow','ShowBlocks','-','About'] // No comma for the last row.
  14. ] ;

Als nächstes habe ich die URLs des „LinkBrowser“ angepasst. Damit habe ich die Möglichkeit Links auf Dateien, wie z.B. Bilder, Flash-Dateien oder ähnliches, schnell und komfortabel zu regeln.

  1. FCKConfig.LinkBrowserURL = ‘/REDcms/ckfinder/ckfinder.html’;

  2. FCKConfig.ImageBrowserURL = ‘/REDcms/ckfinder/ckfinder.html?type=Images’;
  3. FCKConfig.FlashBrowserURL = ‘/REDcms/ckfinder/ckfinder.html?type=Flash’;
  4. FCKConfig.LinkUploadURL = ‘/REDcms/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files’;
  5. FCKConfig.ImageUploadURL = ‘/REDcms/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Images’;
  6. FCKConfig.FlashUploadURL = ‘/REDcms/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Flash’;

CKfinder

Um aber auch den „LinkBrowser“ benutzen zu können, habe ich die Erweiterung „CKfinder“ des FCKeditor mit in mein System installiert. Sie erweitert den Editor um die Möglichkeit komfortabel Dateien die verlinkt werden sollen, zu managen. Die Erweiterung ist so eingestellt dass sie automatisch im Unterordner „userfiles“ des REDcms-System nach Dateien sucht. Auch hier gibt es eine Konfigurationsdatei „config.php“, aber die Anpassungen sind hier mit einer kleinen Änderung schnell erledigt. Geändert werden muss nämlich nur wieder einmal die „$baseUrl“.

  1. $baseUrl = ‘/REDcms/userfiles/’;

Leider konnte ich hier nicht mit meiner Konstanen „BASEURL“ arbeiten, da diese Datei separat aufgerufen wird und nicht direkt ins System eingebunden ist. Vielleicht werde ich später noch eine Routine dafür schreiben.

Downloads

Tag 16 – Zusatzklassen

So bald habe wir es geschafft alle Klassen zu beschreiben. Es fehlen jetzt nur noch 2 Hilfsklassen. Auf der einen Seite ist das die „Date“-Klasse und auf der anderen die „Editor“-Klasse.

Date Class

Als erstes nun die „Date“-Klasse. Sie hat im gesamten System die wohl kleinste Rolle, denn sie managt die Konvertierung von einer internationalen Schreibweise der Zeit (YYYY-MM-DD HH:MM:SS +00:00) in eine deutsche Schreibweise. Dabei unterscheide ich 2 verschiedene Ausgaben. Einmal ist das die Kurzschreibweise des Datums (DD. MM. YYYY) und dann noch die umfangreichere Schreibweise (Tag. Monatsname Jahr).

  1. class Date
  2. {
  3. static $formatShort;
  4. static $formatLong;
  5. static function setShortFormat($format)
  6. {
  7. self::$formatShort = $format;
  8. }
  9. static function setLongFormat($format)
  10. {
  11. self::$formatLong = $format;
  12. }
  13. static function getShortFormat($date)
  14. {
  15. $ts = strtotime($date);
  16. return strftime(self::$formatShort, $ts);
  17. }
  18. static function getLongFormat($date)
  19. {
  20. $ts = strtotime($date);
  21. return strftime(self::$formatLong, $ts);
  22. }
  23. }

Um die Darstellung des Formates schnell ändern zu können wird diese in der Konfiguration abgespeichert und kann dadurch jeder Zeit geändert werden.

  1. [Application]
  2. dateformatlong = “%d. %B %Y”
  3. dateformatshort = “%d. %m. %Y”

Ich habe mich bewusst hier für statische Methoden entschieden, um schneller auf die Konvertierungen zuzugreifen. So bekomme ich mit dem Befehl „Date::getLongFormat()“ und dem übergebenen Zeitstempel direkt die deutsche Schreibweise.

Editor Class

Um die Texte online besser editieren zu können habe ich mich für FCKeditor als WYSIWYG-Editor, also als Online-Editor entschieden. Dadurch wird den Redakteuren die Arbeit mit REDcms erleichtert. Wobei man nicht vergessen darf dass es nur ein Hilfsmittel ist. Die Kenntnisse über HTML wird trotzdem vorausgesetzt.

In der „Editor“-Klasse, die die „FCKeditor“-Klasse des Online-Editors erweitert, wird nur während der Instanziierung verschiedene Einstellungen schon mal mit geladen. Wie z.B. wo der Editor gespeichert ist, wo die Konfiguration zu finden ist, bzw. welche Sprache der Editor benutzen soll.

  1. class Editor extends FCKeditor
  2. {
  3. function __construct( $instanceName )
  4. {
  5. parent::__construct( $instanceName );
  6. $this->BasePath = BASEURL.‘/fckeditor/’;
  7. $this->ToolbarSet = ‘REDcms’;
  8. $this->Config["CustomConfigurationsPath"] = BASEURL.“/templates/scripts/myEditorConfig.js”;
  9. $this->Config['DefaultLanguage'] = ‘de’;
  10. $this->Height = 400;
  11. $this->Config['LinkBrowser'] = true;
  12. }
  13. function __destruct(){}
  14. }

Downloads