PID Rootline als Klasse an den body-Tag hängen

So bekommt man an den <body>-Tag alle PIDs als Rootline in einer Klasse angehängt. Das Ergebnis sieht dann z.B. so aus:
<body class=“rpid_1 rpid_67 rpid_95 „>…</body>

Wir brauchten das für eine Webseite, bei der sich das Design bestimmter Unterseiten ändern sollte – aber wir keine zusätzliche CSS-Datei über eine PAGE-Condition einbinden wollten.

## PID aller übergeordneten Seiten als class an body hängen! 
temp.body = COA
temp.body {
  10 = HMENU
  10 {
    special = rootline
    special.range = 1 | -1
    1 = TMENU
    1 {
      NO {
        doNotLinkIt = 1
        doNotShowLink = 1
        allStdWrap.cObject = COA
        allStdWrap.cObject {
          10 = TEXT
          10 {
            field = pid
          }
          10.noTrimWrap = |rpid_| |
        }
      }
    }
  }
  10.wrap = 
  10.wrap.insertData = 1
}

page.bodyTagCObject < temp.body

wrap der Body ändern, wenn Submenü existiert

Bei einem Projekt ging es darum, den gesamten Inhalt in Typo3 von einem anderen Wrap zu umgeben, falls ein Untermenü existiert. Im konkreten Fall sollte eine neue Klasse „page_with_subnavi“ direkt nach dem Body-Tag erscheinen, falls ein Submenü für den gewählten Menüpunkt existiert.

Wie bei den wohl meisten von Euch wurde im Setup des Seitentemplates der Parser für die Seite in der Variable „page“ gespeichert. In diesem Fall haben wir TemplaVoila die Kontrolle übergeben – was aber für das Beispiel nicht relevant ist. Wichtig ist nur: Die verwendete Variable heißt in diesem Beispiel page:

page = PAGE
page {
  typeNum = 0
  10 = USER
  10.userFunc = tx_templavoila_pi1->main_page
}

In diesem Beispiel wird ein einfaches HMENU erstellt und in der Variable lib.sub_navi_left gespeichert:

lib.sub_navi_left = HMENU
lib.sub_navi_left {
   entryLevel = 2
   1 = TMENU
   1.noBlur = 1
   1.wrap = 
   1.NO = 1
   1.NO {
      1.wrapItemAndSub = 
  • |
  • } }

    Und so wird der Wrap des PAGE-Objektes (bei diesem Beispiel in der Variable „page“ gespeichert) verändert, falls die Sub-Navi exisitert:

    page.stdWrap {
      wrap = |
      outerWrap = |
      outerWrap.override = 
    |
    outerWrap.override.if.isTrue.cObject < lib.sub_navi_left required = 1 }

    Natürlich läßt sich das ganze auch einfach auf die existierende Class eines DIVs anwenden. In diesem Beispiel wurde nicht das PAGE-Objekt verändert, sondern einfach der Text "centerbox" (wenn kein Untermenü existiert) bzw. "centerbox w_subnavi" (falls ein Untermenü existert) in der Variable lib.centerbox_class gespeichert. Diese Klasse wurde denn über TemplaVoila einem DIV als Attribut für "class=" zugewiesen.

    lib.centerbox_class = TEXT
    lib.centerbox_class {
      value = centerbox
      override = centerbox w_subnavi
      override.if.isTrue.cObject < lib.sub_navi_left
    }
    

    Das hier ist noch für Suchmaschinen geschrieben, in der Hoffung jemand findet diese Seite unter den Begriffen, nach denen wir selbst gesucht hatten um die Lösung zu finden: condition wenn untermenü existiert typo3, bei untermenü andere klasse typo3, wenn untermenü anders wrappen typo3

    Titel anzeigen bei Ansicht im Seitenmodul „Liste“ (tt_news)

    Gerade im Zusammenspiel mit TemplaVoila nützt die eigentlich so wunderbare Backend-Ansicht der News (tt_news) im Modul „Seite“ nicht mehr viel – sie wird einfach von TemplaVoila „verschluckt“. Leider stellt man bei dem Bearbeiten der News über das Seitenmodul „Liste“ fest, dass seit einer aktuellen Version von tt_news keine Titel mehr in der Listenansicht mehr angezeigt werden.

    Abhilfe schafft ein kleiner Eintrag in der Datei /typo3conf/extTables.php:

    PHP-Code:
    
    $TCA['tt_news']['ctrl']['label'] = 'title';
    $TCA['tt_news']['ctrl']['label_alt'] = 'datetime';
    $TCA['tt_news']['ctrl']['label_alt_force'] = 1;

    Danach sehen die Dateneinträge der News von tt_news im Seitenmodul „Liste“ wie gewohnt wieder so aus:

    bildschirmfoto-2010-04-08-um-212335

    TemplaVoilà Bildbreite dynamisch angeben mit Default-Wert

    Problem: Ich habe ein Template erstellt, das ein DIV mit einem Bild enthält. Ich mappe in TemplaVoilà das Bild auf den Content-Typ „Bild“, möchte aber dem Benutzer noch die Möglichkeit geben, die Bildbreite selbst anzugeben. Dazu habe ich ein Textfeld gemapped mit der Bezeichnung „field_image_width“. Zusätzlich soll – falls er keine Bildbreite angegeben wird – ein Default-Wert genommen werden.

    So muss man den entsprechenden Abschnitt in der XML-Datenstruktur von TemplaVoilà anpassen:

    <TypoScript>
       10 = COA
       10 = IMAGE
       10.file.import = uploads/tx_templavoila/
       10.file.import.current = 1
       10.file.import.listNum = 0
       10.file.maxW.field = field_image_width
    
       10.file.maxW.override = 200
       10.file.maxW.override.if.isFalse.field = field_image_width
    
       10.stdWrap.typolink.parameter.field = field_link
    </TypoScript>

    Update: Geht auch kürzer das Ganze…

    10 = IMAGE
    10.file {
       import = uploads/tx_templavoila/
       import.current = 1
       import.listNum = 0
       width = 200
       width.override.field = field_imgwidth
       height = 800m
       height.override.field = field_imgheight
    }
    

    Damit bei dem gemappten Feld „Link“ ein eigener Text statt des Seiten-Names erscheint, hilft dieses Script, ebenfalls in der XML-Datenstruktur des Template-Objektes:

    <TypoScript>
    	10 = TEXT
    	10.value = Weiterlesen...
    	10.lang.en = Read on...
    	10.typolink.parameter.current = 1
    </TypoScript>

    Schöne Ergänzung: Für eine Bildgalerie soll in den Seiteneigenschaften der Seite eine Anzahl von Bildern pro Zeile (TemplaVoilà-Feld: field_imgs_per_row) und eine Bildhöhe (TemplaVoilà-Feld: field_imgs_height) angegeben werden. Diese Felder werden über kbtvcontslide vererbt.

    Anhand der Spaltenbreite von 700px sollen die Bilder auf die passende Größe umgerechnet werden, damit genau die angegebene Anzahl an Bildern nebeneinander ins Layout passt:

    10 = IMAGE
    10.file {
      ...
      width = 200
      width.override.cObject = COA
      width.override.cObject {
        wrap = 700/|
        stdWrap.prioriCalc = 1
        10 = TEXT
        10 {
          postUserFunc = tx_kbtvcontslide_pi1->main
          postUserFunc.field = field_imgs_per_row
        }
      }
    
      height = 100c
      height.override.cObject = COA
      height.override.cObject {
        wrap = |c
        10 = TEXT
        10 {
          postUserFunc = tx_kbtvcontslide_pi1->main
          postUserFunc.field = field_imgs_height
        }
      } 
    }
    

    Typo3 auf UTF-8 umstellen / Umlaute in Typo3

    Bei jeder Typo3-Installation suche ich aufs Neue nach den Einstellungen, die im Install-Tool gemacht werden müssen, um Typo3 auf eine UTF-8-Zeichencodierung umzustellen. Problem ist, dass sonst im Seitenbaum alle Umlaute als Fragezeichen dargestellt werden oder nicht richtig in der Datenbank landen. Gerade wenn von vorneherein klar ist, dass die Seite mehrsprachig wird, macht die Umstellung auf UTF-8 schon bei der Installation Sinn und erspart einem im Nachhinein einige Kopfschmerzen.

    Für alle, die – ähnlich wie ich – zu faul sind, jedes Mal nach den richtigen Checkboxes und Init-Texten im Install-Tool zu suchen, hier die 3 Zeilen, die ans Ende der Datei typo3conf/localconf.php müssen und dass gesamte Backend auf UTF-8 umstellen, damit alle „ä,ü.ö“ richtig dargestellt werden:

    $TYPO3_CONF_VARS['SYS']['UTF8filesystem'] = '1';
    $TYPO3_CONF_VARS['SYS']['setDBinit'] = 'SET NAMES utf8;'.chr(10).'SET SESSION character_set_server=utf8;'.chr(10).'';
    $TYPO3_CONF_VARS['BE']['forceCharset'] = 'utf-8';

    Bei russischen oder asiatischen Schriftzeichen hatte ich noch das Problem, dass trotz aller korrekten Einstellungen oben die kyrillischen Zeichen nur als Fragzeichen gespeichert wurden. Diese Zeilen über phpMyAdmin aufgerufen brachten die Lösung:

    ALTER TABLE tt_content CONVERT TO CHARACTER SET utf8;
    ALTER TABLE pages_language_overlay CONVERT TO CHARACTER SET utf8;
    ALTER TABLE sys_language CONVERT TO CHARACTER SET utf8;
    ALTER TABLE sys_template CONVERT TO CHARACTER SET utf8;

    Rich-Text-Editor (RTE) in Typo3 reduzieren

    Der RTE-Editor in Typo3 ist eine tolle Sache und die Entwickler-Gemeinde hat sich verausgabt, so ziemlich alles und jede Editiermöglichkeit im Text anzubieten. Problem ist aber, dass die Werkzeugleisten dadurch ziemlich überfrachtet sind und dem Kunden fast schon zu viele Möglichkeiten bieten, die Texte zu formatieren.
    In der Praxis haben wir uns angewöhnt, die Werkzeugleiste auf ein absolutes Minimum zu reduzieren. Und das geht so: Ins TypoScript-Setup der Seite (Unter „Seiteneigenschaften -> Optionen -> TSconfig“) kommt dieses kurze TypoScript:

    RTE.default {
       contentCSS = /fileadmin/layout/css/rte.css
       showButtons = bold, italic, subscript, superscript, orderedlist, unorderedlist, line, link, image, bar, table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge   
       hideButtons = textstyle, fontstyle, formatblock, fontsize, strikethrough,lefttoright, righttoleft, textcolor, bgcolor, textindicator, emoticon, user, spellcheck, chMode, inserttag, outdent, indent, justifyfull,  acronym, copy, cut, paste, textstylelabel, blockstyle, blockstylelabel, underline, left, center, right, insertcharacter, removeformat, findreplace, insertcharacter, undo, redo, showhelp, about
    }
    

    Mehrzeilige GMENU-Menüs in Typo3 (Zeilenumbrüche bei GMENU)

    Problem: Man möchte ein GMENU (Grafisches Menü) mit mehrzeiligem Text erzeugen. Das geht relativ einfach mit diesem TypoScript:

    lib.hauptmenue {
    
       entryLevel = 0
       special = directory
    
      // Hier kommt die Page-ID der Haupt-Seite hin...
       special.value = 7
       
       1 = GMENU
       1.expAll = 0
       1.wrap = 
       
       1.NO = 1
       1.NO {
          wrap = 
    |
    |*|
    |
    |*|
    |
    //wrap =
    |
    XY = 150, 20+[20.h] transparentBackground = 1 backColor = #220E05 transparentColor = #220E05 10 = TEXT 10 { text.field = nav_title // title text.listNum.splitChar = 13 text.listNum = 0 text.case = upper text.align = right offset = 140-[10.w],15 fontColor = #ffffff fontFile = fileadmin/fonts/seriasans_regular.ttf fontSize = 19 niceText = 1 antiAlias = 0 } 20 < .10 20 { text.listNum = 1 offset = 140-[20.w],10 } } 1.CUR < .1.NO 1.CUR { wrap =
    |
    |*|
    |
    |*|
    |
    10.fontFile = fileadmin/fonts/seriasans_bold.ttf 20.fontFile = fileadmin/fonts/seriasans_bold.ttf 10.fontColor = #FFCC54 20.fontColor = #FFCC54 } 1.ACT < .1.CUR 1.RO < .1.NO 1.RO { 10.fontColor = #FFCC54 20.fontColor = #FFCC54 } }

    Um die Felder "Navigations-Titel" (nav_title) und "Seiten-Titel" (title) im Backend mehrzeilig zu machen kann man die Datei extTables.php um folgende Zeilen ergänzen:

    $TCA['pages']['columns']['title']['config']['type'] = 'text';
    $TCA['pages']['columns']['title']['config']['rows'] = '2';
    
    $TCA['pages']['columns']['nav_title']['config']['type'] = 'text';
    $TCA['pages']['columns']['nav_title']['config']['rows'] = '2';
    

    Mehrzeilige TMENU-Menüs in Typo3 (Zeilenumbrüche bei TMENU)

    Problem: Man möchte ein TMENU mit mehrzeiligem Text in den Menüpunkten erzeugen. Dazu kann man eine Kombination aus einem COA und dem splitChar verwenden. Hier wird das Trennzeichen chr(13) verwendet.

    Als TypoScript für den Menüaufbau verwendet man:

    1 = TMENU
    1.wrap = |
    1.expAll = 0
       
    1.NO = 1
    1.NO {
       wrapItemAndSub = 
    • |
       1 = COA    1.10 = TEXT    1.10 {       field = nav_title // title       listNum = 0       listNum.splitChar = 13    }           1.20 < .1.10    1.20.listNum = 1    1.20.wrap =
    |    1.20.required = 1           stdWrap.field >    stdWrap.cObject = TEXT    stdWrap.cObject < .1 }

    Um die Felder "Navigations-Titel" (nav_title) und "Seiten-Titel" (title) im Backend mehrzeilig zu machen kann man die Datei extTables.php um folgende Zeilen ergänzen:

    $TCA['pages']['columns']['title']['config']['type'] = 'text';
    $TCA['pages']['columns']['title']['config']['rows'] = '2';
    
    $TCA['pages']['columns']['nav_title']['config']['type'] = 'text';
    $TCA['pages']['columns']['nav_title']['config']['rows'] = '2';
    

    Update 2014:

    Alternativ zum Beispiel oben funktioniert es auch so:

    1 = TMENU
    1.wrap = |
    1.expAll = 0
       
    1.NO = 1
    1.NO {
       wrapItemAndSub = 
    • |
       stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10 { field = nav_title // title listNum = 0 listNum.splitChar = 13 } 20 < .10 20 { listNum = 1 wrap =
    | trim = 1 } } }