Bastian-Bringenberg.de → Typo3 → Tutorials → WYSIWYG fürs mm_forum

MMForum um einen WYSIWYG erweitern

What You See is What you Get für das mm_forum

Immer mehr Anwender nutzen Typo3 als Content Management System. Und wie jedes ContentManagementSystem braucht man auch bei diesem ein vernünftiges Forum. Das bisher am weitesten fortgeschrittene Forum ist das mm_forum, es entwickelt sich stetig weiter, hat jedoch leider keinen modernen "What you See is what you Get" - Editor.

Dies kann jedoch relativ leicht geändert werden, wenn auch einige Fehler dabei entstehen können.

Einbringen von wichtigen Dateien

So, fangen wir an.

Was wir dafür brauchen ist erstmal der TinyMCE ( Quelle ), ladet euch am besten die Zip- Runter, entpackt sie und ladet sie in euren Ordner fileadmin auf dem Server. Die Ordnerstruktur sollte nun lauten: /fileadmin/tiny_mce/

In den Ordner legt ihr dann bitte myown.js Datei ohne Inhalt an.

So, und schon haben wir alle Dateien zusammen die wir brauchen.

Einbauen des Grundeditor

Der nächste Schritt ist das Einbauen des TinyMCE in unser Typo3.

Templateanpassungen

Der erste Schritt ist relativ einfach. Wir erstellen für unseren Seitenbaum mit dem Forum ein neues Typo3Template als Extension Template. Dort fügen wir folgendes TypoScript im Setup ein, lassen die restlichen Felder wie Sie waren:

  1. page.21 = HTML
  2. page.21.value=<script type="text/javascript" src="fileadmin/tiny_mce/tiny_mce.js"></script>
  3. page.22 = HTML
  4. page.22.value=<script type="text/javascript" src="fileadmin/tiny_mce/myown.js"></script> 
  5.  

Folgend müssen wir noch unsere myown.js, die wir vorhin angelegt haben editieren. Der obere Block erzeugt uns unseren Editor, der untere Block sorgt dafür, dass die Smileys noch mit dem neuen Editor funktionieren, was sie sonst leider nicht mehr tun.

  1. tinyMCE.init({
  2. theme : "advanced",
  3. relative_urls : false,
  4. mode : "textareas",
  5. plugins : "bbcode,emotions,selectall",
  6. theme_advanced_buttons1 : "bold,italic,underline,bullist,image,link,unlink,forecolor,cleanup,code",
  7. theme_advanced_buttons2 : "",
  8. theme_advanced_buttons3 : "",
  9. theme_advanced_buttons3_add : "emotions",
  10. theme_advanced_toolbar_location : "bottom",
  11. theme_advanced_toolbar_align : "center",
  12. theme_advanced_styles : "Code=codeStyle;Quote=quoteStyle",
  13. relative_urls : false,
  14. convert_urls : false,
  15. entity_encoding : "raw",
  16. add_unload_trigger : false,
  17. remove_linebreaks : false,
  18. auto_resize : true,
  19. auto_focus : "message",
  20. cleanup : true
  21. });
  22.  
  23. function emoticon(text){
  24.         tinyMCE.get('message').selection.setContent(text);
  25. }

Einbauen der BBCodes

Das mm_forum verwendet andere BBCodes als der tinymce anspricht. Das müssen wir irgendwie anpassen, damit alles läuft. Ohje, das wird eine ganze Menge arbeit, oder nicht? Naja, es war eine ganze Menge arbeit, aber im großen und ganzen sollte es so funktionieren wie es nun ist. Bei Fehlern könnt ihr mich einfach anschreiben und ich überlege mir was.

Über Mithilfe beim Erweitern würde ich mich übrigens sehr freuen!

Folgendes ist nun zu tun:

  1. Geht in den Ordner /fileadmin/tiny_mce/plugins/bbcode
  2. benennt die Datei editor_plugin.js zu editor_plugin_original.js um
  3. erstellt eine neue editor_plugin.js mit folgendem Inhalt und alles wird laufen:
  1. /**
  2. * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
  3. * @author Moxiecode
  4. * @author Bastian-Bringenberg.de Typo3 Anpassung
  5. * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
  6. */
  7.  
  8. (function() {
  9.   tinymce.create('tinymce.plugins.BBCodePlugin', {
  10.     init : function(ed, url) {
  11.       var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase();
  12.  
  13.       ed.onBeforeSetContent.add(function(ed, o) {
  14.         o.content = t['_' + dialect + '_bbcode2html'](o.content);
  15.       });
  16.  
  17.       ed.onPostProcess.add(function(ed, o) {
  18.         if (o.set)
  19.           o.content = t['_' + dialect + '_bbcode2html'](o.content);
  20.  
  21.         if (o.get)
  22.           o.content = t['_' + dialect + '_html2bbcode'](o.content);
  23.       });
  24.     },
  25.  
  26.     getInfo : function() {
  27.       return {
  28.         longname : 'BBCode Plugin',
  29.         author : 'Moxiecode Systems AB',
  30.         authorurl : 'http://tinymce.moxiecode.com',
  31.         infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',
  32.         version : tinymce.majorVersion + "." + tinymce.minorVersion
  33.       };
  34.     },
  35.  
  36.     // Private methods
  37.  
  38.     // HTML -> BBCode in PunBB dialect
  39.     _punbb_html2bbcode : function(s) {
  40.       s = tinymce.trim(s);
  41.  
  42.       function rep(re, str) {
  43.         s = s.replace(re, str);
  44.       };
  45.  
  46.       /** Bastians Erweiterungen **/
  47.       /** Liste  [list][*]abc[*]def[/list]**/
  48.       rep(/<ul>(.*?)<\/ul>/gi,"[list]$1[/list]");
  49.       rep(/<li>(.*?)<\/li>/gi,"[*]$1");
  50.       rep(/\[size([^\]]*)\]/gi,"");
  51.       rep(/\[\/size\]/gi,"");
  52.       /** Quotes  [quote="Hans"][quote="Hannes"]Was sagste?[/quote]genau das[/quote]**/
  53.  
  54.       rep(/<abbr class=\"quotes_basti\"><abbr class=\"quotes_basti_title\>(.*)<\/abbr>(.*)<\/abbr>/gi,"[quote=\"$1\"]$2[/quote] ");
  55.      
  56.       /** Bastians Erweiterungen Ende **/
  57.  
  58.       // example: <strong> to [b]
  59.       rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
  60.       rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");
  61.       rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");
  62.       rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");
  63.       rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");
  64.       rep(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
  65.       rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");
  66.       rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
  67.       rep(/<font>(.*?)<\/font>/gi,"$1");
  68.       rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");
  69.       rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");
  70.       rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");
  71.       rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");
  72.       rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");
  73.       rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");
  74.      
  75.       /** Bastians Erweiterungen **/
  76.       /** Quotes  [quote="Hans"][quote="Hannes"]Was sagste?[/quote]genau das[/quote]**/
  77.       rep(/<span class=\"quotes_basti_title\">([^(\"\\"<)]*)<\/span>/gi,"[quote=\"$1\"]");
  78.       for (var i = 0; i <= 20; i++){
  79.         rep(/<span class=\"quotes_basti\">(.*)<\/span>/gi,"$1[/quote] ");
  80.       }
  81.       /** Bastians Erweiterungen Ende **/
  82.      
  83.       rep(/<\/(strong|b)>/gi,"[/b]");
  84.       rep(/<(strong|b)>/gi,"[b]");
  85.       rep(/<\/(em|i)>/gi,"[/i]");
  86.       rep(/<(em|i)>/gi,"[i]");
  87.       rep(/<\/u>/gi,"[/u]");
  88.       rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");
  89.       rep(/<u>/gi,"[u]");
  90.       rep(/<blockquote[^>]*>/gi,"[quote]");
  91.       rep(/<\/blockquote>/gi,"[/quote]");
  92.       rep(/<br \/>/gi,"\n");
  93.       rep(/<br\/>/gi,"\n");
  94.       rep(/<br>/gi,"\n");
  95.      
  96.       rep(/<p>/gi,"");
  97.       rep(/<\/p>/gi,"\n");
  98.      
  99.       rep(/<[^>]+?>/gi, '');
  100.      
  101.       rep(/&nbsp;/gi," ");
  102.       rep(/&quot;/gi,"\"");
  103.      
  104.       rep(/&lt;/gi,"<");
  105.       rep(/&gt;/gi,">");
  106.       rep(/&amp;/gi,"&");
  107.      
  108.  
  109.       return s;
  110.     },
  111.  
  112.       // BBCode -> HTML from PunBB dialect
  113.       _punbb_bbcode2html : function(s) {
  114.       s = tinymce.trim(s);
  115.  
  116.       function rep(re, str) {
  117.         s = s.replace(re, str);
  118.       };
  119.  
  120.       /** Bastians Erweiterungen **/
  121.       /** Liste  [list][*]abc[*]def[/list]**/
  122.       rep(/\[\*\]/gi,"</li><li>");
  123.       rep(/\[list\]<\/li>(.*)\[\/list\]/gi,"<ul>$1</li></ul>");
  124.      
  125.       /** Quotes  [quote="Hans"][quote="Hannes"]Was sagste?[/quote]genau das[/quote]**/
  126.  
  127.       /** Bastians Erweiterungen Ende **/
  128.      
  129.       // example: [b] to <strong>
  130.       rep(/\n/gi,"<br />");
  131.       rep(/<([^>]+)>([^<]*)<\/([^>]+)>/gi,"$2");
  132.       rep(/\[b\]/gi,"<strong>");
  133.       rep(/\[\/b\]/gi,"</strong>");
  134.       rep(/\[i\]/gi,"<em>");
  135.       rep(/\[\/i\]/gi,"</em>");
  136.       rep(/\[u\]/gi,"<u>");
  137.       rep(/\[\/u\]/gi,"</u>");
  138.       rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
  139.       rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
  140.       rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
  141.       rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");
  142.       rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");
  143.       rep(/\[size([^\]]*)\]/gi,"");
  144.       rep(/\[\/size\]/gi,"");
  145.       /** Bastians Erweiterungen **/
  146.       /** Quotes  [quote="Hans"][quote="Hannes"]Was sagste?[/quote]genau das[/quote]**/
  147.       rep(/\[quote=\"([^\"]*)\"\]/gi,"<abbr class=\"quotes_basti\"><abbr class=\"quotes_basti_title\">$1</abbr>");
  148.       rep(/\[\/quote\]/gi,"</abbr>&nbsp;");
  149.       /** Bastians Erweiterungen Ende **/
  150.      
  151.       return s;
  152.     }
  153.   });
  154.  
  155.   // Register plugin
  156.   tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin);
  157. })();

Abschließende Worte

Wenn ihr das alles gemacht habt, muss ich euch zu eurem neuen WYSIWYG Editor im MM-Forum beglückwünschen. Es gibt noch einige Macken wie ihr feststellen werdet, ab und zu kommt komisches HTML in eure Beiträge, da müssen wir mal gemeinsam überlegen wie wir eine Filterfunktion schreiben.


Ich hoffe ich konnte helfen und würde mich über Kommentare per Email ( Typo3(at)Bastian-Bringenberg.de) freuen. 

Bastian

ToDo

Einige Dinge muss ich noch in diesem Text machen:

 

  • Screenshots einbauen
  • Erweitern des BBCodes