Tabellen nur für TYPO3-Administratoren

Im TYPO3-Backend lassen sich Tabellen mit einer simplen Zusatzkonfiguration für normale Redakteure sperren. Tabellen sind dann nur noch für Administratoren sichtbar und die Inhalte können auch nur von Administratoren bearbeitet werden.

$TCA[<tablename>]['ctrl']['adminOnly'] = 1;

Read-Only-Felder im TYPO3-Backend

In manchen Fällen ist es wünschenswert, in TYPO3 Tabellenfelder für einen BE-User bzw. Administrator zwar sichtbar zu machen, aber nicht bearbeitbar. Das funktioniert mit einer kleinen Anpassung im Table Configuration Array (TCA) der entsprechenden Tabelle.

$TCA[<tablename>]['columns'][<fieldname>]['config']['readOnly'] = 1;

Das Attribut kann auf die unterschiedlichsten Feldtypen angewendet werden. Hier ist außer einem einzeiligen und einem mehrzeiligen Textfeld sogar ein Datei-Feld auf „readOnly“ gesetzt:

Die Sinnhaftigkeit dieses Vorgehens muss natürlich in jedem Fall individuell geprüft werden. Der oben gezeigte Screenshot zeigt einen Ausschnitt aus einer Extension, die über Fronten-User-Eingaben befüllt wird. Den Backend-Usern ist es dann noch gestattet, zusätzliche Dateien anzuhängen.

Breite von Mehrfach-Auswahlboxen im TYPO3-Backend

Wer regelmäßig mit dem TYPO3-Backend arbeitet, wird auch die Auswahlboxen mit Mehrfachauswahl kennen: Rechts eine Box mit allen verfügbaren Elementen, links eine Box mit allen gewählten Elementen in der festgelegten Reihenfolge. – Eigentlich eine einfache Sache. Doch sobald die Einträge zu lang sind, werden sie automatisch abgeschnitten und lassen sich unter Umständen nicht mehr korrekt voneinander unterscheiden.

Diese Multiple-Selectboxen lassen sich jedoch mit Leichtigkeit anpassen. Dazu reichen wenige Zeilen Code, die am besten in der Datei extTables.php platziert werden. Hier am Beispiel des Feldes include_static_file der Tabelle sys_template:

t3lib_div::loadTCA('sys_template');
$TCA['sys_template']['columns']['include_static_file']['config']['selectedListStyle'] = 'width:400px';
$TCA['sys_template']['columns']['include_static_file']['config']['itemListStyle'] = 'width:400px';

Die Konfigurations-Option selectedListStyle bezieht sich auf die Liste der bereits ausgewählten Elemente, also die linke Box. Während itemListStyle die Liste aller Elemente anspricht, also die rechte Box.

Es können beliebige CSS-Informationen hinterlegt werden. Statt width könnten also ebenso Anweisungen wie min-width oder max-width hinterlegt werden. Auch Anweisungen zu Farben, Schrift etc. können hinterlegt werden. Mehrere Anweisungen lassen sich – wie bei CSS gewohnt – mit Semikolon getrennt angeben.

$TCA['sys_template']['columns']['include_static_file']['config']['itemListStyle'] = 'width:400px;font-style:italic;color:grey';

Auswahl- und Dateifelder im TYPO3-Backend mitwachsen lassen

Eigene Extensions lassen sich schnell mit dem Extension Kickstarter erstellen. Dabei lassen sich die Feldkonfigurationen schnell zusammen klicken und die entsprechende Tabellen-Konfiguration (TCA) wird automatisch erstellt. Allerdings sind über den Kickstarter nicht alle theoretisch verfügbaren Einstellungen auswählbar. Will man z.B. ein automatisch mit der Anzahl der Inhalte mitwachsendes Feld, muss man manuell nachhelfen.

Anpassen eigener Extensions

Ein Ausschnitt der Tabellen-Konfigurations-Datei tca.php, die mit dem Kickstarter erstellt wurde, könnte beispielsweise so aussehen:

$TCA['tx_myextension_table1'] = array (
	'columns' => array (
		'related' => array (
			'exclude' => 1,
			'label' => 'LLL:EXT:z7_ideaskgf/locallang_db.xml:tx_myextension_table1.related',
			'config' => array (
				'type' => 'select',
				'foreign_table' => 'tx_myextension_table2',
				'size' => 5,
				'minitems' => 0,
				'maxitems' => 100,
			)
		),
	)
);

Dabei wurde als Größe im Kickstarter der Wert 5 angegeben und als Anzahl der erlaubten Inhalte der Wert 100. Mit dieser Konfiguration können 100 Elemente ausgewählt werden, die Feldgröße bleibt jedoch bei einer Höhe von fünf Einträgen bestehen. Werden mehr als diese fünf Einträge gewählt, bleibt die Höhe trotzdem fix und die Auswahlbox erhält eine Scrollleiste.

Dieses Verhalten ist natürlich völlig in Ordnung und kann durchaus Sinn machen. In anderen Fällen kann es aber besser sein, die Auswahlbox an die Anzahl der Einträge anzupassen, um somit ohne Scrollleiste sofort alle gewählten Elemente sichtbar zu machen. Das lässt sich mit der Konfigurations-Option autoSizeMax bewerkstelligen. Diese wird in die Konfiguration des Tabellefeldes eingetragen und mit dem gewünschten Wert versehen:

$TCA['tx_myextension_table1'] = array (
	'columns' => array (
		'related' => array (
			'exclude' => 1,
			'label' => 'LLL:EXT:z7_ideaskgf/locallang_db.xml:tx_myextension_table1.related',
			'config' => array (
				'type' => 'select',
				'foreign_table' => 'tx_myextension_table2',
				'size' => 5,
				'minitems' => 0,
				'maxitems' => 100,
				'autoSizeMax' => 100,	// neu eingefügt
			)
		),
	)
);

Der Wert kann zwar beliebig gesetzt werden, er macht allerdings nur Sinn wenn er höher ist, als der bei size gesetzte Wert. Außerdem macht es Sinn, den Wert identisch mit maxitems zu setzen.

Anpassen fremder Extensions

Selbstverständlich kann diese TCA-Einstellung nicht nur auf eigene Extensions angewandt werden. Es ist auch völlig irrelevant, ob eine Extension mit dem Extension Kickstarter erstellt wurde oder nicht. Die autoSizeMax-Option kann für jedes Feld hinterlegt werden.

Dazu müssen folgende einfache Zeilen in die Datei typo3conf/extTables.php eingetragen werden. Tabellen- und Feldname, sowie der autoSizeMax-Wert sind natürlich individuell anzupassen.

t3lib_div::loadTCA('tablename');
$GLOBALS['TCA']['tablename']['columns']['fieldname']['config']['autoSizeMax'] = 20;

Grid View im TYPO3-Backend

Ende Januar wurde TYPO3 Version 4.5 veröffentlicht. Diese neue Version trägt nicht nur erstmals den Titel LTS im Namen, sondern bringt auch einige nette neue Features mit. Eines davon ist „Grid View“ – damit lassen sich die bisherigen Inhaltsspalten im Backend beliebig anordnen, wodurch die Inhaltspflege erheblich vereinfacht wird. Schließlich befinden sich die Content-Elemente im Backend an den gleichen Positionen wie im Frontend.

Diverse Hintergrundinformationen zum neuen Feature findet man in der offiziellen TYPO3-News. Dort sind auch einige Screenshots zu sehen, wie das Feature in der Praxis eingesetzt werden kann.

Grid-View-Komposition anlegen

Die Kompositionen lassen sich kinderleicht anlegen, mann muss nur wissen wo man sie findet:

1. Backend-Modul „Liste“
2. Neuen Datensatz anlegen
3. Typ „Backend-Layout“

Die Konfiguration kann man dann entweder von Hand erzeugen oder den komfortablen Wizzard benutzen, der sich per Klick auf das „Assistent“-Symbol öffnen lässt.

Grid-View einer Seite zuweisen

Die erstellten Grid-View-Einstellungen lassen sich über die Seiteneigenschaften im Reiter „Erscheinungsbild“ zuweisen. Man hat dabei die Möglichkeit, das Grid nur für die aktuelle Seite zu aktivieren, oder für alle Unterseiten.

Flash-Messages in TYPO3-Backend

Seit einiger Zeit ist es möglich, dem BE-User über so genannte „Flash-Messages“ Feedback zu geben. Dieses Feature lässt sich auch kinderleicht in die eigene Extension integrieren.

Quelle: François Suter, http://buzz.typo3.org/

François Suter erklärt hier in seinem Blog-Beitrag auf buzz.typo3.org, wie sich das Feature integrieren lässt. Die Verwendung läuft dabei recht simpel ab:

  1. Eine Message wird als neues Objekt der Klasse t3lib_FlashMessage angelegt.
  2. Die Message wird der Message-Queue hinzugefügt.
  3. Das Anzeigen der Nachricht erledigt TYPO3 ganz von selbst.

In der Realität könnte Schritt 1 und 2 dann so aussehen:

$msg = t3lib_div::makeInstance('t3lib_FlashMessage', 'Message-Text', 'Title', t3lib_FlashMessage::WARNING);
t3lib_FlashMessageQueue::addMessage($msg);

Zur Einstufung der Meldung stehen die Klassen-Konstanten t3lib_FlashMessage::INFO, t3lib_FlashMessage::OK, t3lib_FlashMessage::WARNING und t3lib_FlashMessage::ERROR zur Verfügung.

TYPO3-Backend-Modul für mm_forum anpassen

Die Extension „mm_forum“ ist eine mächtige Forum-Extension mit einer großen Zahl an Features. Um das Forum richtig verwalten zu können, sollte man dem Kunden einen Zugriff auf das Forum-Backend-Modul gewähren. Allerdings verbergen sich dort auch kritische Einstellungsmöglichkeiten, mit denen man schnell die Funktionalität ausbremsen oder Sicherheitslöcher aufreisen kann.

Wenn man einmal weiß wie es geht, lassen sich aber alle Submodule, Kategorien und Felder je nach Benutzergruppe ausblenden. Auf diesem Weg ist es möglich, dass der Kunde sein Forum selbst verwalten kann, ohne Angst haben zu müssen aufgrund von Unkenntnis gefährliche Konfigurationen vorzunehmen.

Die Bereiche des Backend-Moduls werden dynamisch auf Grundlage der TSconfig-Konfiguration generiert. Die Standard-Konfiguration befindet sich in der Datei EXT:mm_forum/res/ts/tx_mmforum_pagetsconfig.ts. Die einzelnen Submodule stehen dabei in mod.web_txmmforumM1.sections, die Kategorien des Submoduls „Installation“ stehen in mod.web_txmmforumM1.submodules.installation.categories und die Definition der Felder in mod.web_txmmforumM1.submodules.installation.categories.<categoryname>.items. Das Schema ist dabei stets das gleiche: Ein Hauptpunkt bekommt einen Typ zugewiesen (Bsp.: MMFORUM_SECTION_ITEM, MMFORUM_CONF_CATEGORY, MMFORUM_CONF_ITEM) und enthält eine Konfiguration zu Darstellung und Inhalt in den Kindelementen.

Um ein Element auszublenden, ist es also einfach nur nötig, den zugewiesenen Typ zu überschreiben, bzw. zu entfernen. Idealerweise kann das in der User TSconfig eines Backendbenutzers oder eine Backendbenutzer-Gruppe vorgenommen werden.

### section "TEMPLATE"
mod.web_txmmforumM1.sections.30 =

### section "TOOLS"
mod.web_txmmforumM1.sections.40 =

### section "IMPORT"
mod.web_txmmforumM1.sections.50 =

### section "USER FIELDS"
mod.web_txmmforumM1.sections.60 =

### section "INSTALL"

# category "GENERAL"
mod.web_txmmforumM1.submodules.installation.categories.general.items.storagePID =
mod.web_txmmforumM1.submodules.installation.categories.general.items.userPID =
mod.web_txmmforumM1.submodules.installation.categories.general.items.userGroup =
mod.web_txmmforumM1.submodules.installation.categories.general.items.adminGroup =
mod.web_txmmforumM1.submodules.installation.categories.general.items.realUrl_specialLinks =
mod.web_txmmforumM1.submodules.installation.categories.general.items.disableRootline =
mod.web_txmmforumM1.submodules.installation.categories.general.items.userNameField =

# category "USER"
mod.web_txmmforumM1.submodules.installation.categories.user =

# category "FORUM"
mod.web_txmmforumM1.submodules.installation.categories.forum.items.boardPID =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.moderatedBoard =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.enableRanks =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.enableShadows =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.prefixes =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.polls_restrict =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.rssPID =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.topicIconMode =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.attachment_deny =
mod.web_txmmforumM1.submodules.installation.categories.forum.items.attachment_filesize =

# category "PRIVATE MESSAGING"
mod.web_txmmforumM1.submodules.installation.categories.pm =

# category "SEARCH"
mod.web_txmmforumM1.submodules.installation.categories.search =

# category "FILE PATHS"
mod.web_txmmforumM1.submodules.installation.categories.filepaths =

# category "CRONJOBS"
mod.web_txmmforumM1.submodules.installation.categories.cron =

Hier das komplette und das reduzierte Backend-Modul im Vergleich:

 

Datei-Felder im Backend konfigurieren

In einem älteren Beitrag habe ich bereits erklärt, wie man die Datei-Felder im RTE konfigurieren kann, um ggf. den direkten Upload zu verbieten oder zu erlauben. Hier soll es darum gehen, wie man das Verhalten von allgemeinen Datei-Feldern im Backend steuern kann. Das betrifft sowohl Content-Elemente als auch Listen-Elemente.

Direkten Upload deaktivieren

Grundsätzlich kann jeder User selbst entscheiden, ob er direkte Uploads für Datei-Felder haben möchte oder nicht. Dazu gibt es in „Benutzerwerkzeuge > Einstellungen > Bearbeiten und erweiterte Funktionen“ die Einstellung „Hochladen von Dateien direkt im Web-Modul„. Voraussetzung hierfür ist nur, dass der Backend-Benutzer die entsprechenden Rechte hat, um das „Einstellungen„-Modul zu sehen. Die hier vorgenommene Einstellung betrifft für den jeweiligen Benutzer alle Datei-Felder im Backend.

Darüber hinaus kann die Einstellung dieses Feldes auch vom Administrator vorgegeben werden, so dass der Backend-Benutzer nicht mehr selbst darüber entscheiden darf ob er das Upload-Feld nutzen möchte oder nicht. Einstellbar ist folgende Option via „User TSconfig“:

# disable direct upload
setup.override.edit_docModuleUpload = 0

# enable direct upload
setup.override.edit_docModuleUpload = 1

Selbstverständlich kann der Wert im TSconfig einzelner Benutzer, einzelner Gruppen oder auch global gesetzt werden.


Upload aktiviert


Upload deaktiviert

Fileadmin-Browser deaktivieren

Auch die Möglichkeit, den Fileadmin zu durchstöbern kann deaktiviert werden. Allerdings geschieht das hier nicht auf der Benutzerebene, sondern pro Feld für alle Benutzer. Die Einstellung hierzu kann über das $TCA vorgenommen werden.

$GLOBALS['TCA']['tx_z7zerosevenhead_item']['columns']['image']['config']['disable_controls'] = 'browser';


deaktivierter Fileadmin-Browser

„Vorhandene Dateien“-Liste deaktivieren

Ebenso wie der Fileadmin-Browser lässt sich auch die Liste der vorhandenen Dateien entfernen. Der Nachteil dabei ist allerdings, dass dann auch gepflegte Bilder nicht mehr entfernt werden können. Aber evtl. hat ja sogar das in manchen Anwendungsszenarien seinen Sinn.

$GLOBALS['TCA']['tx_z7zerosevenhead_item']['columns']['image']['config']['disable_controls'] = 'list';


deaktivierte Liste

Mehrere Kontroll-Elemente ausblenden

Grundsätzlich kann disable_controls als kommaseparierte Liste gepflegt werden. Da jedoch die Option list auch gleichzeitig den Fileadmin-Browser deaktiviert, macht das evtl. wenig Sinn. Soviel also nur noch als allgemeine Anmerkung der Vollständigkeit halber.

$GLOBALS['TCA']['tx_z7zerosevenhead_item']['columns']['image']['config']['disable_controls'] = 'list,browser';

Seite verbergen, wenn keine Übersetzung für die aktuelle Sprache vorhanden ist

Bei mehrsprachigen TYPO3-Projekten kann es manchmal passieren, dass für einige Seiten keine Übersetzungen vorliegen. Beispielsweise kann ein mittelständisches Unternehmen aus Deutschland durchaus einen internationalisierten Webauftritt besitzen, aber Stellenausschreibungen könnten durchaus nur in Deutsch vorhanden sein. In einem solchen Fall wäre es sinnvoll, wenn eine Seite ohne Inhalt erst gar nicht in der Navigation angezeigt wird.

Für dieses Szenario bietet TYPO3 bereits standardmäßig die Einstellung „Seite verbergen, wenn keine Übersetzung für die aktuelle Sprache vorhanden ist“ (engl. „Hide page if no translation for current language exists“) in den Seiteneigenschaften einer jeden Seite.

Um diese Option bei allen neuen Seiten automatisch zu setzen, kann folgende Zeile in das User TSconfig eingetragen werden.

# 1 = erste Option
# 2 = zweite Option
# 3 = beide Optionen
TCAdefaults.pages.l18n_cfg = 2

Das kann je nach Bedarf selbstverständlich entweder pro Backend-Benutzer oder Backend-Benutzergruppe, oder aber auch global in der Datei typo3conf/extTables.php erledigt werden.

Darüber hinaus gibt es Install-Tool die Option $TYPO3_CONF_VARS['FE']['hidePagesIfNotTranslatedByDefault']. Setzt man diese, wird das Standard-Verhalten von TYPO3 umgekehrt. Nicht-übersetzte Seiten sind ab sofort nicht sichtbar und auch die Beschriftung der Checkbox hat sich in „Seite anzeigen, auch wenn keine Übersetzung vorhanden ist“ (engl. „Show page even if no translation exists“) geändert.

Will man den aktuellen Wert der Spracheinstellungen in einer Extension abfragen, bietet sich dazu die Funktion t3lib_div::hideIfNotTranslated() an. Diese wertet den Wert aus den Seiteneigenschaften abhängig von den Einstellungen im Install-Tool aus und gibt einen bool’schen Wert zurück ob die Seite versteckt sein soll wenn sie nicht übersetzt ist.

Integer-Feld durch Selectbox ersetzen

TYPO3 bietet im Backend einige Felder als normale Integerfelder an, in die nahezu beliebige Werte eingetragen werden können. Zwar gibt es die Möglichkeit über das $TCA den Wertebereich zu beschränken. Allerdings sind dann in diesem Wertebereich noch immer alle Eingaben möglich. Was ist jedoch, wenn man z.B. einem Redakteur für eine Bildbreite nur eine Hand voll unterschiedlicher Werte geben will?

Stellen wir uns vor, Sie haben für ein Webseiten-Layout mühsam ein Raster ausgearbeitet, in das sich auch die Bilder der Content-Elemente „Bilder“ oder „Text mit Bild“ einfügen sollen. Auf der anderne Seite haben Sie einen oder mehrere Backend-Redakteure, die mit möglichst wenig Know-How die Inhalte der Webseite pflegen sollen. Eine Lösung wäre hier, den Wert des Feldes „Bildbreite“ standardmäßig auf einen zum Raster passenden Wert zu setzen und das Feld für die Backend-Redakteure komplett auszublenden. Was tun Sie dann aber, wenn in einem Fall ein Diagramm über die ganze Breite des Inhalts eingeblendet werden soll und in einem anderen Fall ein Porträt einer Person schmal neben dem Text stehen soll? In unserem aktuellen Szenario müsste ein Backend-Benutzer mit weiterführenden Rechten, wie z.B. ein Administrator die Bildbreite anpassen.

Dabei kann die Lösung so komfortabel sein. TYPO3 erlaubt es, die Konfiguration der Felder so zu ändern, dass aus einem Integer-Feld mit freier Werteeingabe eine Selectbox wird. Darin können Sie als Administrator dann jeden Wert explizit erlauben und mit einem kurzen erklärenden Text versehen. Im Beispiel des Feldes „Bildbreite“ der Content-Elemente könnte eine Konfiguration in etwa so aussehen:

t3lib_div::loadTCA('tt_content');
$TCA['tt_content']['columns']['imagewidth']['config'] = array(
    'type' => 'select',
    'items' => array(
        array(
            'Left column, full width (550px)',
            '550',
        ),
        array(
            'Right column, full width (256px)',
            '256',
        ),
        array(
            'Right column, small width (92px)',
            '92',
        ),
    ),
);