TYPO3: feine kleine Unterschiede bzgl. TCA und FAL

Für eine neue Extension erstellte ich mit dem Extension-Builder einen Datentyp, in dem Dateien referenziert werden. Die verwendete TYPO3 Version ist die aktuellste, also 6.2.11. Folgendes TCA wurde mir für das Feld generiert:

[...]
'file' => array(
	'exclude' => 1,
	'label' => 'LLL:EXT:nocdocuments/Resources/Private/Language/locallang_db.xlf:tx_nocdocuments_domain_model_document.file',
	'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
		'file',
		array('maxitems' => 1),
		'*'
	),
),
[...]

Im Backend wird das Feld anzeigt, ich kann eine Datei auswählen, die sofort in der Vorschau erscheint, dann speichere ich… und die Dateireferenz ist weg. Ein Blick in die Datenbank: In der Tabelle sys_file_refence wird eine Zeile eingetragen, aber dann scheinbar gleich wieder gelöscht, uid_foreign ist 0, die meisten anderen Felder leer. Komisch. Die Konfiguration sieht ja richtig aus. Vielleicht liegt es ja an der TYPO3 Version. Also kopierte ich die Extension in eine andere TYPO3-Instanz (6.2.4). Wenn ich dort den Dialog zur Dateiauswahl aufrufe, dann bekomme ich keine Dateien zur Auswahl, obwohl im Ordner ja einige drin sind. Habe mir den Funktionsaufruf angeschaut von getFileFieldTCAConfig, dort ist der Default-Wert für $allowedFileExtensions “. Also ersetzte ich ‚*‘ durch “, und siehe da es klappt.

Der feine kleine Unterschied: wenn $allowedFileExtensions nicht gültig ist, kann man in TYPO3 6.2.11 eine Datei auswählen, die Referenz wird gespeichert und dann direkt gelöscht. Unter TYPO3 6.2.4 kann ich die Datei mit der falschen Dateiendung gar nicht erst auswählen.

Geschrieben in TYPO3 | Kommentare deaktiviert für TYPO3: feine kleine Unterschiede bzgl. TCA und FAL

Aktuelles Jahr mit Fluid ausgeben

Bisher habe ich immer den TypoScript-Weg verwendet, um immer die aktuelle Jahreszahl im Footer auszugeben.

lib.copyright = TEXT
lib.copyright {
	data = date:U
	strftime = %Y
	noTrimWrap = |© Natalia Postnikova ||
}

Viel eleganter ist es jedoch mit Fluid direkt im Template:

&copy; Copyright <f:format.date format="Y">now</f:format.date> by Natalia Postnikova

Geschrieben in TYPO3 | Kommentare deaktiviert für Aktuelles Jahr mit Fluid ausgeben

DCE: FAL Bilder mit Link

Wenn man im DCE Eingabetyp Bild auswählt, dann wird automatisch ein FlexForm generiert. Bald fällt aber auf, dass bei der Eingabe des Bildes die Felder Link und alternativer Text fehlen. Das kann schnell korrigiert werden, wenn man folgenden Schnipsel in das generierte XML in der Konfiguration des entsprechenden DCE-Feldes eingibt:

<config>
	[...]
	<foreign_types type="array">
		<numIndex index="2" type="array">
			<showitem>--palette--;LLL:EXT:lang/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette,--palette--;;filePalette</showitem>
		</numIndex>
	</foreign_types>
	[...]
</config>

Die Lösung und die Erklärung fand sich in den Mailinglisten. Entscheidend bei dem Schnipsel ist numIndex=“2″:

Index 2 = \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE

Geschrieben in TYPO3 | Kommentare deaktiviert für DCE: FAL Bilder mit Link

Felder im Flexform mit TypoScript ausblenden

Es ist möglich, Felder in Backend-Formularen mit TypoScript im PageTSconfig zu konfigurieren. So können Felder umbenannt und ausgeblendet werden. Natürlich erwartet man dann ja auch, dass es genauso für Felder im FlexForm des Plugins gilt. Und TYPO3 enttäuscht mich nicht – es geht. Dieser Beitrag auf jweiland beschreibt wie. Nun wollte ich einige Felder im Flexform der Extension news ausblenden. Das folgende TypoScript ost eigentlich richtig, funktioniert aber nicht:

TCEFORM.tt_content.pi_flexform.news_pi1.additional {
	settings.tags.disabled = 1
	settings.topNewsFirst.disabled = 1
	settings.excludeAlreadyDisplayedNews.disabled = 1
	settings.disableOverrideDemand.disabled = 1
}

Wenn man etwas darüber nachdenkt, ist es ja auch logisch: In TypoScript gilt der Punkt als Trenner, somit bezieht sich das disabled nicht auf settings.tags sondern auf tags, das ein Unterobjekt von settings ist. Und das existiert natürlich nicht. Zum Glück ist es schon vor einiger Zeit ein paar Leuten aufgefallen und es gab einen Bug-Report dazu. Die Lösung: man kann Punkte, die Teil der Felddeklaration sind in TypoScript mit einem Backslash escapen. Somit sieht die funktionierende Konfiguration so aus:

TCEFORM.tt_content.pi_flexform.news_pi1.additional {
	settings\.tags.disabled = 1
	settings\.topNewsFirst.disabled = 1
	settings\.excludeAlreadyDisplayedNews.disabled = 1
	settings\.disableOverrideDemand.disabled = 1
}

Geschrieben in TYPO3 | Kommentare deaktiviert für Felder im Flexform mit TypoScript ausblenden

TYPO3 6.2. SQL Queries ausgeben

Es ist nicht die schönste Variante, aber die einzige, die bei mir bisher funktioniert. Um SQL Queries in TYPO 6.2. auszugeben, fügt man in der Datei typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Tyo3DbBackend.php in der Funktion getRowsFromDatabase (ungefähr Zeile 340) folgenden Block ein:

echo $this->databaseHandle->SELECTquery(
	$queryCommandParameters['selectFields'],
	$queryCommandParameters['fromTable'],
	$queryCommandParameters['whereClause'],
	'',
	$queryCommandParameters['orderBy'],
	$queryCommandParameters['limit']
);
echo "\n\n";

Geschrieben in TYPO3 | Kommentare deaktiviert für TYPO3 6.2. SQL Queries ausgeben

TYPO3 Breite der Bilder in Gridelement setzen

Eigentlich ist es so einfach, aber ich habe die richtige Lösung erst nach so langer Zeit gefunden, dass ich es posten wollte. Die Entwickler von Gridelements haben daran gedacht und vorgesehen, dass man Bildgrößen pro Spalte festlegen kann. Es steht sogar in dem TypoScript-Setup der Extension. Und so einfach gehts: mit LOAD_REGISTER den Wert der Variablen maxImageWidth setzen und danach mit RESTORE_REGISTER wieder zurücksetzen.

tt_content.gridelements_pi1.20.10.setup {
	# Three Columns (ID 1)
	1 < lib.gridelements.defaultGridSetup
	1 {
		prepend < lib.stdheader
 
		columns {
			# colPos ID
			11 < .default
			11.wrap = <div class="col-md-4">|</div>
			11.renderObj.10 = LOAD_REGISTER
			11.renderObj.10.maxImageWidth = 288
			11.renderObj.30 = RESTORE_REGISTER
			[...]
		}
 
		wrap = <div class="columns-3 clearfix">|</div>
	}
}

Geschrieben in TYPO3 | Kommentare deaktiviert für TYPO3 Breite der Bilder in Gridelement setzen

TYPO3: RTE in Feld von Extension anpassen

In der eigenen Extension (oder auch einer fremden) kommt auch mal der RTE zum Einsatz. Damit haben Redakteure die Möglichkeit, Text zu formatieren. Meistens aber sollen sie nicht die gleichen Formatierungsmöglichkeiten haben wie im kompletten RTE. Meistens reicht ja Fett und Kursiv aus. Wie kann man den RTE in der eigenen Extension konfigurieren?

Als erstes sollte das betreffende Feld als RTE definiert sein. Der folgende Code-Schnipsel bezieht sich auf die Definition des Feldes im TCA:

'description' => array(
	'exclude' => 1,
	'l10n_mode' => 'prefixLangTitle',
	'label' => 'Textfeld mit RTE',
	'config' => array(
		'type' => 'text',
		'cols' => '30',
		'rows' => '5',
	),
	'defaultExtras' => 'richtext:rte_transform[flag=rte_enabled|mode=ts]',
),

Leider gibt es keine Möglichkeit, den RTE schon dort zu konfigurieren. Wenn man nicht weiter macht, wird ein RTE mit der Standardkonfiguration ausgegeben.

Per PageTSconfig kann man aber den RTE für jedes Feld speziell konfigurieren. Und zwar so:

RTE.config.[my_table].[my_field] {
}

Anstatt my_table setzt man der Namen der Tabelle ein – dieser sieht etwas so aus tx_myext_domain_model_xxx. Anstatt my_field der Name des Feldes, für den der RTE konfiguriert werden soll, in dem Beispiel description.

Diese Konfiguration kann man auch in die PageTSconfig-Datei schreiben, die man bei den Templates in fileadmin ablegt. Wenn man diese Konfiguration jedoch mit der Extension installieren möchte, schreibt man diese am besten in eine Datei. Diese Datei heißt im Beispiel page_tsconfig.txt und wird in der Extension unter Configuration/TypoScript/ gespiechert.

Dann wird diese Datei über ext_localconf.php direkt ins PageTSconfig eigebunden:

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:myext/Configuration/TypoScript/page_tsconfig.txt">');

Und das wars schon 🙂 Die RTE Konfiguration kann man natürlich auch direkt in PageTSconfig schreiben und damit RTE Konfiguration für fremde Extensions anwenden.

Geschrieben in TYPO3 | Kommentare deaktiviert für TYPO3: RTE in Feld von Extension anpassen

Gmap3: Google Map Kartenstyling mit Snazzymaps

Gmap3 ist ein jQuery Plugin mit dem sich einfach Google Maps erstellen lassen. Beispiele dafür gibt es auf der Seite genug. Es gibt auch ein Beispiel für eine gestylte Map, aber da wird der Kartenstil umgestellt und ich wollte nur eine Karte mit einem voreinstellten Stil. Für Google Maps gibt es so viele Einstellungen bzgl. Styling, Google stellt bereits einen Wizard zur Verfügung, mit dem man die Kartenstile ausprobieren kann. Noch einfach ist es mit Snazzy Maps. Es ist ein Repository für bereits erstellte Google Map Styles. Selbst wenn nichts genau den eigenen Geschmack trifft, dann kann man einen fertigen Stil nehmen und nur etwas anpassen.

Wie bringt man beides unter einen Hut? Was macht man mit dem Schnipsel, den man bei Snazzy Maps zu jeder Karte findet? Und so einfach ist es, wenn man es weiß:

$("#gmap").gmap3({
	marker: {
		values: locations,
	},
	map: {
		options: {
			// How you would like to style the map. 
			// This is where you would paste any style found on Snazzy Maps.
			styles: [{"featureType":"administrative","elementType":"all","stylers":[{"visibility":"on"},{"saturation":-100},{"lightness":20}]},{"featureType":"road","elementType":"all","stylers":[{"visibility":"on"},{"saturation":-100},{"lightness":40}]},{"featureType":"water","elementType":"all","stylers":[{"visibility":"on"},{"saturation":-10},{"lightness":30}]},{"featureType":"landscape.man_made","elementType":"all","stylers":[{"visibility":"simplified"},{"saturation":-60},{"lightness":10}]},{"featureType":"landscape.natural","elementType":"all","stylers":[{"visibility":"simplified"},{"saturation":-60},{"lightness":60}]},{"featureType":"poi","elementType":"all","stylers":[{"visibility":"off"},{"saturation":-100},{"lightness":60}]},{"featureType":"transit","elementType":"all","stylers":[{"visibility":"off"},{"saturation":-100},{"lightness":60}]}],
		},
	},
	maxZoom: 10,
	autofit: {}
});

Links:
Gmap3 – http://gmap3.net/
Snazzy Maps – http://snazzymaps.com/

Geschrieben in javascript | Kommentare deaktiviert für Gmap3: Google Map Kartenstyling mit Snazzymaps

Pfad zur Sprachdatei in Fluid abkürzen

In einem TYPO3 Modul geschrieben mit Extbase/Fluid können genauso wie im Frontend Sprachlabels verwendet werden, die mit angegeben werden. Man kann die BE-Labels natürlich auch in die gleiche Datei schreiben, wie die FE-Labels, schöner ist es aber eine eigene Datei für die Labels des TYPO3-Moduls zu verwenden.

Man kann auch f:translate verwenden, muss dann den Pfad zur Datei mit den Übersetzungen vor den Key-Wert schreiben:

<f:translate key="LLL:EXT:my_ext/Resources/Private/Language/locallang_mod.xml:labelkey />

Wenn ich nun viele Labels in meinem Modul habe, dann schreibe ich vor jeden den vollständigen Pfad zur Datei. Abgesehen davon, dass es unübersichtlich wird, muss man auch relativ viel Code anpassen, falls man sich entscheidet, die Datei unzuziehen oder umzubenennen. Der Trick: mit f:alias kann man den vollständigen Pfad zur Datei in eine Variable schreiben und diese dann immer wieder verwenden:

<f:alias map="{ll: 'LLL:EXT:my_ext/Resources/Private/Language/locallang_mod.xml'}">
<f:translate key="{ll}:labelkey" />
<f:alias>

Noch schöner wird es, wenn man die Dateiendung weglässt – dann kann man sich später entscheiden, die Labels statt in xml in xliff zu hinterlegen:

<f:alias map="{ll: 'LLL:EXT:my_ext/Resources/Private/Language/locallang_mod'}">

Geschrieben in TYPO3 | Kommentare deaktiviert für Pfad zur Sprachdatei in Fluid abkürzen