TYPO3 CMS

TYPO3 Composer-Installation schlägt auf Plesk fehl

caticonslite_bm_alt

In der Datei „composer.json“ von TYPO3 is für „post-autoload-dump“ ein Script definiert:

"scripts":{
   "typo3-cms-scripts": [
      "typo3cms install:fixfolderstructure",
      "typo3cms install:generatepackagestates"
   ],
   "post-autoload-dump": [
      "@typo3-cms-scripts"
   ]
}

Dieses Script wird nach jeder Generierung der Autoload-Information ausgeführt, z.B. beim „composer install“ oder „composer dump-autoload“. Erfüllt der Standard-PHP-Interpreter auf dem Command Line Interface (CLI) nicht die Versionsvoraussetzungen von TYPO3, so schlägt die Ausführung von z.B. „/opt/plesk/php/7.2/bin/php composer.phar install“ mit folgender bzw. einer ähnlichen Fehlermeldung fehl:

PHP Warning:  Unsupported declare 'strict_types' in /var/www/vhosts/webentwickler.at/httpdocs/vendor/helhum/typo3-console/Scripts/typo3-console.php on line 2
PHP Parse error:  syntax error, unexpected '(' in /var/www/vhosts/webentwickler.at/httpdocs/vendor/helhum/typo3-console/Scripts/typo3-console.php on line 32
Script typo3cms install:fixfolderstructure handling the typo3-cms-scripts event returned with error code 255
Script @typo3-cms-scripts was called via post-autoload-dump

Der Fehler kann behoben werden, indem bei den Scripts der zu verwendende PHP-Interpreter und der Pfad zum Binary-Verzeichnis von Composer ergänzt werden:

"scripts":{
   "typo3-cms-scripts": [
      "/opt/plesk/php/7.2/bin/php /var/www/vhosts/webentwickler.at/httpdocs/vendor/bin/typo3cms install:fixfolderstructure",
      "/opt/plesk/php/7.2/bin/php /var/www/vhosts/webentwickler.at/httpdocs/vendor/bin/typo3cms install:generatepackagestates"
   ],
   "post-autoload-dump": [
      "@typo3-cms-scripts"
   ]
}

Anschließend können „composer install“ oder „composer dump-autoload“ ausgeführt werden.

Declaration of TYPO3 CMS Composer Installers not compatible

caticonslite_bm_alt

Wenn nach der Aktualisierung der PHP-Version beim Ausführen von „/usr/bin/php72 composer.phar“ install folgende Fehlermeldung erscheint:

PHP Fatal error: Declaration of TYPO3\CMS\Composer\Installer\Downloader\T3xDownloader::download(Composer\Package\PackageInterface $package, $path) must be compatible with Composer\Downloader\ArchiveDownloader::download(Composer\Package\PackageInterface $package, $path, $output = true) in /var/www/vendor/typo3/cms-composer-installers/src/Installer/Downloader/T3xDownloader.php on line 27
Fatal error: Declaration of TYPO3\CMS\Composer\Installer\Downloader\T3xDownloader::download(Composer\Package\PackageInterface $package, $path) must be compatible with Composer\Downloader\ArchiveDownloader::download(Composer\Package\PackageInterface $package, $path, $output = true) in /var/www/public_html/vendor/typo3/cms-composer-installers/src/Installer/Downloader/T3xDownloader.php on line 27

So müssen zuerst die TYPO3 CMS Composer Installers mit folgendem Befehl aktualisiert werden:

/usr/bin/php72 composer.phar require typo3/cms-composer-installers:~1.5.2 --no-plugins --update-no-dev

Anschließend kann wie gewohnt ein composer install durchgeführt werden:

/usr/bin/php72 composer.phar install --no-dev

TYPO3 mit Komprimierung auf Plesk-Host mit Reverse Proxy nginx

caticonslite_bm_alt

Wird in TYPO3 die Frontend-Komprimierung mit „$GLOBALS[‚TYPO3_CONF_VARS‘][‚FE‘][‚compressionLevel‚] = 9″ und in den TypoScript-Setup-Einstellungen „config.compressJs“ bzw. „config.compressCss“ aktiviert, werden statische „pre-rendered“ JavaScript- und CSS-Dateien im gzip-Format im Ordner „typo3temp/compressor“ abgelegt. Für die korrekte Auslieferung ist für Apache (z.B. in der Datei .htaccess) die folgende Konfiguration erforderlich:

<FilesMatch "\.js\.gzip$">
	AddType "text/javascript" .gzip
</FilesMatch>
<FilesMatch "\.css\.gzip$">
	AddType "text/css" .gzip
</FilesMatch>
AddEncoding gzip .gzip

Seit Plesk 12 wird nginx als Reverse Proxy eingesetzt und statische Dateien werden nicht mehr von Apache, sondern direkt von nginx ausgeliefert. Das führt dazu, dass nginx die Dateien zwar mit dem korrekten „Content-Type“, aber ohne erforderliches „Content-Encoding: gzip“ im HTTP-Header ausliefert und infolgedessen die Dateien vom Browser falsch (so als wären sie nicht komprimiert) interpretiert werden. Analog zur o.g. Konfiguration für Apache ist auch eine Konfiguration für nginx erforderlich: In Plesk kann unter „Einstellungen für Apache & nginx“ der Domain entweder die Option „Intelligente Bearbeitung statischer Dateien“ deaktiviert werden (nicht empfohlen), oder folgende Konfiguration unter „Zusätzliche nginx-Anweisungen“ hinterlegt werden:

location ~ "\.js\.gzip$" {
	add_header Content-Encoding gzip;
	gzip off;
	types { text/javascript gzip; }
}
location ~ "\.css\.gzip$" {
	add_header Content-Encoding gzip;
	gzip off;
	types { text/css gzip; }
}

Diese Konfiguration bringt nginx dazu die komprimierten JS- und CSS-Dateien analog zu Apache zu behandeln und das erforderliche „Content-Encoding: gzip“ im HTTP-Header zu setzen.

Verwendung des ApplicationContext in TYPO3

caticonslite_bm_alt

TYPO3 bietet die Möglichkeit die Applikation in unterschiedlichen Kontexten (z.B. Development, Staging und Production) laufen zu lassen. Hierfür wird mittels Webserver-Konfiguration die Environment-Variable „TYPO3_CONTEXT“ gesetzt. Ein mögliche Variante zum Setzen des Kontexts befindet sich in der .htaccess-Beispieldatei aus dem typo3_src-Ordner, in angepasster und optimierter Form sieht dies wie folgt aus:

RewriteRule .? - [E=TYPO3_CONTEXT:Production]
RewriteCond %{HTTP_HOST} =staging.webentwickler.at
RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]
RewriteCond %{HTTP_HOST} =dev.webentwickler.at
RewriteRule .? - [E=TYPO3_CONTEXT:Development]

Im o.g. Beispiel wird standardmäßig der TYPO3_CONTEXT bzw. in weiterer Folge der ApplicationContext auf „Production“ gesetzt. Für den Hostnamen „staging.webentwickler.at“ wird der Kontext „Production/Staging“ und für „dev.webentwickler.at“ der Kontext „Development“ gesetzt.

Der somit gesetzt Kontext kann nun in TypoScript bzw. direkt im Programmcode verwendet werden. Grundsätzlich wäre es  möglich den Kontext via Environment-Variable abzufragen, darauf sollte aber verzichtet werden und stattdessen die vom TYPO3-Core bereitgestellten Wrapper-Methoden verwendet werden, da es z.B. bei der Verwendung von php_fpm zu veränderten Environment-Variablen (REDIRECT_-Präfix, z.B.: REDIRECT_TYPO3_CONTEXT) kommen kann. In TypoScript verwendet man:

[applicationContext = Development]
	plugin.tx_webentwickler.settings.email = test@dev.webentwickler.at
[global]

Im PHP-Code (hier: „AdditionalConfiguration.php“):

if (\TYPO3\CMS\Core\Utility\GeneralUtility::getApplicationContext() == 'Development') {
	$GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] = 1;
}

In einer sauber programmierten Anwendung sollte es grundsätzlich so sein, dass sämtliche Konfigurationen in TypoScript vorgenommen werden und somit die Verwendung der Methode getApplicationContext() im Programmcode nicht erforderlich sein, sondern ausschließlich auf die Konfigurationsdatei beschränken sollte.

Weitere Informationen zur Verwendung findet man in der TypoScript Reference unter Condition reference/applicationContext.

Überschriften in TYPO3 umbenennen

caticonslite_bm_alt

In TYPO3 lassen sich Überschriften direkt im Content Element/Inhaltslement und im Rich Text Editor (RTE) festlegen. Die vordefinierten Labels „Layout x“ bzw. „Headline x“ sind wenig aussagekräftig und für Redakteure nicht ausreichend beschreibend. Beide Arten von Labels lassen sich wie folgt anpassen.

Anlegen der Übersetzungsdatei (z.B. in „EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf“):

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
	<file source-language="en" datatype="plaintext" original="messages" date="2014-09-249T09:33:00Z" product-name="projektkonfiguration">
		<header/>
		<body>
			<trans-unit id="label.h1">
				<source>Main headline</source>
			</trans-unit>
			<trans-unit id="label.h2">
				<source>Headline</source>
			</trans-unit>
			<trans-unit id="label.h3">
				<source>Sub headline</source>
			</trans-unit>
		</body>
	</file>
</xliff>

Zusätzlich kann können auch noch Übersetzungen z.B. für Deutsch angelegt werden.

Zuweisen der Überschriften-Labels für Content Element in User- oder PageTS:

TCEFORM.tt_content.header_layout {
	altLabels.1 = LLL:EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf:label.h1
	altLabels.2 = LLL:EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf:label.h2
	altLabels.3 = LLL:EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf:label.h3
}

Zuweisen der Überschriften-Labels für den RTE in User- oder PageTS:

RTE.default.buttons.formatblock.items {
	h1.label = LLL:EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf:label.h1
	h2.label = LLL:EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf:label.h2
	h3.label = LLL:EXT:projektkonfiguration/Resources/Private/Language/locallang_db.xlf:label.h2
}
1 2 3 6  nach oben