Archive for the ‘Typo3’ Category.

Meldung nach Typo3 Update

Nach einem Update von Typo3 4.4 auf 4.5 bekam ich plötzlich beim Versuch, ins CMS zu kommen, folgende Meldung:

This installation was just upgraded to TYPO3 4.5. In this version, some default settings have changed.
You can continue to use your settings by specifying the former default values in localconf.php.
Please proceed to the Update Wizard in the TYPO3 Install Tool to update your configuration.

Natürlich KOMMT man nicht einfach so ins Install Tool. Erstmal muss man in der localconf die Versionsnummer ändern:

  1. $TYPO3_CONF_VARS['SYS']['compat_version'] = '4.5';

Und warum steht das nicht einfach so in der Fehlermeldung? Weils dann zu einfach wär'....

typoscript: Text ersetzen (replace)

Das Problem: in einem laufenden Projekt wird die Extension calendar base verwendet, um einen Kalender mit Events darzustellen. Bei der Monatsdarstellung gab es allerdings Probleme, der Bindestrich wurde als Zeilenumbruch gewertet und musste daher durch seine Sonderzeichen Entsprechung dargestellt werden. Damit ich nicht im sourcecode rumpfuschen musste, habe ich dies über typoscript gelöst und für title eine simple Ersetzung vorgenommen:

  1. plugin.tx_cal_controller.view.month.event.title{
  2.   stdWrap.parseFunc.short {
  3.     - = −
  4.   }
  5. }

Der Bindestrich wird hier durch − ersetzt.

Flexforms – Daten aus eigener Tabelle auslesen

Ich habe mir eine Extension für Produkte runtergeladen (tt_products war mir zu umfangreich) und wollte nun eine zweite Extension dazuschreiben, mit der man diese Produkte auswählen kann, um auf der Startseite eine kleine Auswahl von Produkten anzuzeigen. Um mit den Flexforms im Backend Zugriff auf die Tabelle zu erhalten, muss die XML Datei so aussehen:

  1. <prods>
  2.   <TCEforms>
  3.     <exclude>1</exclude>
  4.     <label>Produkte</label>
  5.     <config>
  6.       <type>group</type>
  7.       <internal_type>db</internal_type>
  8.       <allowed>tx_productsservices</allowed>
  9.       <size>5</size>
  10.       <maxitems>5</maxitems>
  11.       <minitems>0</minitems>
  12.       <show_thumbs>1</show_thumbs>
  13.     </config>
  14.   </TCEforms>
  15. </prods>

templaVoila Feld: mehrere Bilder

Ein Feld für ein Bild lässt sich in templaVoila ja relativ leicht erstellen. Für mehrere wird's dann schon schwieriger, deshalb möchte ich auf die folgende Seite verweisen, die dazu einen guten XML code gepostet hat.

Den fügt man in Data Structure XML ein und schon hat man im Backend ein Multiple Images Feld. Großartig.

direct mail und unzustellbare Adressen

Da stieß ich doch zufällig auf eine Anleitung, wie man die unzustellbaren Newsletter der directmail Extensions ohne fetchmail auslesen kann. Und das ganze ist so unerwartet glatt gelaufen, dass ich dem einen Blogeintrag und einen Dank an diese Seite widmen muss.

Man installiert die Extension sl_direct_mail_return und nimmt die Postfach Konfiguration vor. Anschließend benennt man am besten die typo3conf/ext/sl_direct_mail_return/scripts/returnmail.phpsh um in returnmail.php und ruft sie mal händisch auf. Da werden vermutlich ein paar Pfade nicht stimmen, aber sobald man die geändert hat, klappt das ganze auch schon. Nach dem erfolgreichen Ausführen des scripts kann man im typo3 unter direct mail statistik die Adressen einsehen, denen kein Newsletter zugestellt wurde.

Typo3: Einen neuen BE Benutzer anlegen

Inzwischen musste ich schon oft genug einen neuen Backend Benutzer anlegen und hatte dabei eigentlich immer wieder dieselben Schwierigkeiten: der Seitenbaum wurde erstmal nicht angezeigt und wenn der dann endlich da war, war die Dateiliste leer. Daher wiedermal meine schrittweise Anleitung zum Erstellen eines BE Benutzers, ohne Anspruch auf Vollständigkeit und möglicherweise auch mit einigen überflüssigen Schritten.

1. einen neuen Benutzer erstellen
Unter "Benutzer" den neuen Benutzer erstellen. Benutzername und Passwort ausfüllen und ggf. eine Standardsprache auswähklen. Speichern und dann eine neue Gruppe erstellen mit Klick auf das PLUS unter Gruppe.

2. neue Gruppe erstellen
einen aussagekräftigen Gruppennamen vergeben und dann unter "Zugriffsliste" als erstes "Zugriffslisten mit einschließen" auswählen. Anschließend die gewünschten Module, Tabellen, Seitentypen etc. auswählen. Wer sich damit nicht auskennt, kann direkt alles auswählen und später genauer selektieren.
Unter "Freigaben und Arbeitsumgebungen" bei Datenbankfreigaben die root Seite auswählen
Für die Verzeichnisfreigaben zuerst ein neues Objekt erstellen. Am einfachsten ist es, direkt den fileadmin Ordner zuzuweisen, mit mehr Erfahrung sollte man den templates Ordner allerdings vor Userzugriff unbedingt schützen. Man wählt am besten die Option Basis: absolut aus und gibt den Pfad an (am besten herauszufinden wenn man sich $_SERVER['DOCUMENT_ROOT'] ausgeben lässt). Speichern, nochmal prüfen ob der Gruppe die Verzeichnisfreigabe zugewiesen ist und dann auch die Gruppe speichern.
Nochmal sichergehen, dass der eben erstellte Benutzer dieser neuen Gruppe auch wirklich zugewiesen ist.

3. Zugriffe
Damit dieser User den Seitenbaum auch wirklich sehen kann, bedarf es eines weiteren Schrittes. Unter Web - Zugriff - Rechte wählt man sich sein root Verzeichnis aus und bearbeitet dies. Im folgenden Formular wählt man sich die eben erstellte Gruppe im "Gruppe" Dropdown aus und wählt einfach ALLE checkboxen unter Rechte an. Das ganze lässt man Rekursiv über 3 Ebenen laufen und speichert. Anschließend sollte die Rechte Übersicht in etwa so aussehen:

Und wenn das alles geklappt hat, sollte der neu erstellte User nun auch nach dem Login den Seitenbaum und die Dateiliste sehen und bearbeiten können. Sollte dem nicht so sein, wäre der erste Schritt, zu prüfen, ob dem User auch wirklich die Gruppe zugewiesen wurde, und ob der Gruppe die entsprechenden Rechte zugewiesen wurden. Es ist NICHT nötig, einem User einzeln Rechte zu verteilen, es reicht durchaus, dass die entsprechende Gruppe die nötigen Rechte hat.

Noch ein Hinweis: diese Anleitung gibt die einzelnen Schritte natürlich nur in ihrer simpelsten Form wieder. das Typo3 Rechtesystem ist relativ umfangreich und man braucht weder direkt den Fileadmin Ordner freizugeben noch die root Seite. Man kann hier sehr gut differenzieren, aber für eine erste Zuweisung, die erstmal nichts weiter können muss als dem eingeloggten Benutzer einen Seitenbaum und eine Dateiliste anzuzeigen, eignet sich diese Anleitung durchaus.

directmail Newsletter vs. rlmp_language_detection

Bei einem bereits existierenden Projekt stellte ich fest, dass nach der installation von rlmp_language_detection der Newsletter nicht mehr richtig funktionierte. Es wurde eine falsche Seite angezeigt und das Problem ließ sich zunächst nur durch eine deinstallation von rlmp_language_detection beheben.
Bis ich auf den Gedanken kam, dass es doch möglich sein muss, eine Extension für einen bestimmten Bereich oder Ordner zu deaktivieren. Ich weiß nicht, ob mein typoscript code das macht, aber auf jeden Fall funktionieren die Newsletter wieder.
Im template - Setup des Ordners in dem die Newsletter liegen, habe ich folgendes hinzugefügt:

  1. plugin.tx_rlmplanguagedetection_pi1 >

Und schon funkt rlmp_language_detection directmail nciht mehr dazwischen und die Spracherkennung auf den anderen Seiten funktioniert dennoch.

Typo3: einfaches Login mit Weiterleitung

Die Aufgabenstellung: ein schlichtes Frontend Login Formular, mit dem man eine zusätzliche Seite sichtbar machen kann und das einen nach erfolgreichem Login direkt auf diese Seite weiterleitet.
Die neueren Typo3 Versionen machen dies möglich, ohne langwieriges Installieren weiterer Extensions. Hier eine kurze und hoffentlich vollständige Anleitung:

  1. Frontend Benutzer erstellen
    • Falls noch nicht vorhanden einen Sys-Ordner anlegen (der z.B. "FE User" heißt) und die ID merken.
    • unter Liste in diesem Ordner eine Website-Benutzergruppe erstellen (neuer Datensatz). Der Gruppenname genügt bereits, alles andere ist optional.
    • danach einen Website-Benutzer erstellen, dem die vorher erstellte Benutzergruppe zugewiesen ist. Der Benutzer muss nur 3 Dinge haben: einen Usernamen, ein Passwort und seine Zuweisung zur Gruppe.
  2. die zugangsbeschränkte Seite erstellen
    • eine normale Seite erstellen und mit beliebigem Inhalt befüllen (idealerweise befindet sich diese Seite auf derselben Ebene wie die Login Seite)
    • unter "Zugriff" auswählen: "anzeigen, wenn angemeldet" (falls die Seite für alle Angemeldeten sichtbar sein soll) oder direkt die vorher erstellte Benutzergruppe auswählen (falls die Seite nur von Usern dieser Gruppe gesehen werden soll)
  3. Login Formular erstellen
    • auf einer neuen (oder schon vorhandenen) Seite ein neues Content Element erstellen: Formulare - "Anmeldung".
    • für die Weiterleitung die zugangsbeschränkte Seite auswählen (falls nach dem Login keine Weiterleitung erfolgen soll, diesen Schritt einfach auslassen)
  4. PID des SysOrdners zuweisen
    • in template - root den Konstanten Editor auswählen, Kategorie CONTENT
    • PID of user archive auf die ID des SysOrdners ändern, in dem die Benutzer und Benutzergruppe gespeichert sind
  5. Optional: Weiterleitung optimieren
    • der Login Seite unter Zugriff noch ein "nach Anmeldung verbergen" zuweisen. ggf. kann man die Login Seite und die Inhaltseite gleich benennen, sodass ein eingeloggter User nie mehr zum Loginformular komt sondern direkt die Inhalte ansteuern kann

Typo3 RTE: Button Schriftfarbe

Der Typo3 Editor stellt nicht immer automatisch den Button "Schriftfarbe" zur Verfügung. Ich musste genau das bewerkstelligen und diese Seite hat mir sehr dabei geholfen. Das Problem war nicht, den Button anzeigen zu lassen, das bewerkstelligt man schon mit

  1. RTE.default.showButtons := addToList(textcolor)

in der TSconfig der root Seite. Anschließend scheint die Option zwar auf, aber beim Speichern verschwindet die Schriftfarbe direkt wieder. Ich habs nun nach etwas Recherche geschafft, dass die Schriftfarbe sowohl im Front- als auch im Backend wirklich übernommen wird. Ich weiß wie meistens nicht, ob manche Optionen davon überflüssig sind, aber bei mir funktionierts hiermit:

  1. RTE.default.showButtons := addToList(textcolor)
  2. RTE.default.proc.entryHTMLparser_db.tags.span.fixAttrib.style.unset >
  3. RTE.default.proc.entryHTMLparser_db.removeTags := removeFromList(font)
  4. RTE.default.removeTags := removeFromList(font)
  5. RTE.default.proc.entryHTMLparser_db.tags.font.allowedAttribs = color
  6. RTE.default.FE.proc < RTE.default.proc
  7. RTE.default.FE < RTE.default
  8.  
  9. RTE.default.proc.entryHTMLparser_db.tags.span.fixAttrib.style.unset >
  10. RTE.default.proc.entryHTMLparser_db.removeTags := removeFromList(font)
  11. RTE.default.proc.entryHTMLparser_db.tags.font.allowedAttribs = color
  12. RTE.default.proc.entryHTMLparser_db.tags.font.allowedAttribs = color, size, bgcolor,fontsize
  13. RTE.default.enableWordClean.HTMLparser < RTE.default.proc.entryHTMLparser_db

Wie immer is es mir ein Rätsel, warum eine so simple Sache so kompliziert sein muss. Für mich wäre es sinniger, font Tags und color Attribute direkt zu erlauben und den Schriftfarbe (und Hintergrundfarbe) Button ganz einfach ein- oder ausblenden zu können.

Aber warum einfach, wenn's auch kompliziert geht?

eigene Extension mit eigenem Backend Textfeld

Die Anforderung: es sollte im Backend ein neues Inhaltselement namens "Zitat" geben. Man braucht also ein neues Inhaltselement mit einem simplen Textfeld, das dann im Frontend dementsprechend ausgegeben wird. Und zum ersten Mal hab ich das tatsächlich geschafft.

1. Mit der Extension Kickstarter (kickstarter) eine neue Erweiterung erstellen.
- einen Extension key vergeben (meiner lautete ccquotebox)
- unter General Info einen klangvollen Namen vergeben (z.B. "Zitate"), Kategorie "Backend" auswählen, Namen und Email Adresse eintragen
- in New Database Tables eine Tabelle anlegen ("tx_ccquotebox_quotes"), ihr einen Titel geben ("quotes"), unter Edit Fields alles lassen wie es ist und unten dran ein neues Field einfügen.

- unter Frontend Plugins einen Titel eingeben ("Zitat") und die erste Option "Add to 'Insert Plugin' list in Content Elements'" auswählen.
- anschließend mit viewresult und create die Extension erstellen.

2. ext_tables.php im Ordner der gerade erstellten Extension (typo3conf/ext/ccquotebox/ext_tables.php) um zwei Zeilen erweitern:

  1. $TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';
  2. t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1', 'FILE:EXT:'.$_EXTKEY.'/flexform_ds_pi1.xml');

3. die flexform_ds_pi1.xml Datei im Extension Ordner erstellen und mit folgendem Inhalt befüllen:

  1. <T3DataStructure>
  2.  <sheets>
  3.  <sDEF>
  4.  <ROOT>
  5.  <TCEforms>
  6.  <sheetTitle>Options</sheetTitle>
  7.  </TCEforms>
  8.  <type>String</type>
  9.  <el>
  10.  <quellcode>
  11.  <TCEforms>
  12.  <label>Zitat</label>
  13.  <config>
  14.  <type>text</type>
  15.  <html>0</html>
  16.  <cols>60</cols>
  17.  <rows>15</rows>
  18.  </config>
  19.  </TCEforms>
  20.  </quellcode>    
  21.  </el>
  22.  </ROOT>
  23.  </sDEF>
  24.  </sheets>
  25. </T3DataStructure>

Damit sollte es bei den Inhaltselementen ein neues Plugin "Zitat" geben, mit einem Textfeld.

4. Falls nötig: auf UTF-8 umstellen
Da bei mir die Umlaute eine Fehlermeldung auslösten, habe ich die localconf.php geupdated:

  1. $TYPO3_CONF_VARS['BE']['forceCharset'] ='utf-8';

Danach gehn sämtliche Umlaute erstmal nicht mehr, man muss alle Texte neu abspeichern. Aber in meinem Fall stand das Projekt noch am Anfang deshalb war das kein großes Thema.

5. Frontend Ausgabe
Damit nun das Zitat ordentlich ausgegeben wird, bearbeitet man die main Funktion der class.tx_ccquotebox_pi1.php folgendermaßen:

  1.         function main($content, $conf) {
  2.                 $this->conf = $conf;
  3.                 $this->pi_setPiVarDefaults();
  4.                 $this->pi_loadLL();
  5.                 $this->pi_initPIflexForm();
  6.                 $piFlexForm = $this->cObj->data['pi_flexform'];
  7.     foreach ( $piFlexForm['data'] as $sheet => $data ) {
  8.             foreach ( $data as $lang => $value ) {
  9.                 foreach ( $value as $key => $val ) {
  10.                     $this->lConf[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
  11.                 }
  12.             }
  13.         }
  14.                 $content='<div class="zitat">'.$this->lConf['quellcode'].'</div>';
  15.                 return $this->pi_wrapInBaseClass($content);
  16.         }