Um die URLs für Extbase Detail-Views zu kürzen sind mehrere Schritte erforderlich. Zunächst muss die Reihenfolge der Actions in der ext_localconf.php getauscht werden, so dass die show-Action die erste ist und somit per default aufgerufen wird. Dann konfiguriert man das Plugin über die setup.txt mit den Parametern "skipDefaultArguments" sowie "callDefaultActionIfActionCantBeResolved". Das bewirkt, dass default Parameter (in diesem Falle unsere Action "show") nicht an die URL gehängt werden und dass die default Action (die erste aus der ext_localconf.php) aufgerufen wird, wenn keine andere Action per Parameter übergeben wird. Anschließend wird RealURL über das Segment "fixedPostVars" für die Seite der Detailansicht der Extension Datensätze konfiguriert.

typo3conf/ext/blog/ext_localconf.php

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'Vendor.' . $_EXTKEY,
	'Pi1',
	array(
		'Post' => 'show, list, listLatest',
	),
	array(

	)
);

typo3conf/ext/blog/Configuration/Typoscript/setup.txt

plugin.tx_blog {
	features {
		skipDefaultArguments = 1
	}
	mvc {
		callDefaultActionIfActionCantBeResolved = 1 
	}
}

typo3conf/realurl_conf.php

'fixedPostVars' => array(
	'blogDetailPage' => array(
		array(
			'GETvar' => 'tx_blog_pi1[post]',
			'lookUpTable' => array(
				'table' => 'tx_blog_domain_model_post',
				'id_field' => 'uid',
				'alias_field' => 'title',
				'enable404forInvalidAlias' => 1,
				'addWhereClause' => ' AND NOT deleted',
				'useUniqueCache' => 1,
				'useUniqueCache_conf' => array( 
					'strtolower' => 1,
					'spaceCharacter' => '-' 
				), 
			),
		),  
	),
	'5' => 'blogDetailPage',	// Pid der Detailansicht
),

Das Resultat sind schöne kurze und bei Suchmaschinen besonders beliebte URLs für die Detailansichten der Datensätze:

http://www.domain.ltd/blog.html
http://www.domain.ltd/blog/post/das-ist-ein-toller-post.html

Das Ganze lässt sich noch etwas weiter optimieren für den Fall, dass sich die List-View und die Detail-View auf der gleichen Seite befinden sollen. Hier muss zusätzlich in der showAction() des Controllers der Parameter $post optional sein und wenn dieser NULL ist, ein forward() auf die listAction stattfinden.

Welche Variante die bessere aus SEO-Sicht ist, darüber könnte man nun ausgiebig diskutieren. Beide Varianten haben ihre Vor- und Nachteile. Das Ergebnis wäre jedenfalls wie folgt:

http://www.domain.ltd/blog.html
http://www.domain.ltd/blog/das-ist-ein-toller-post.html




Kommentare

Gunnar schrieb am 11.06.2015:
Hallo und vielen Dank für den hilfreichen Artikel!

IMO gehört in den fixedPostVars Array bei lookuptable noch der Eintrag 'enable404forInvalidAlias' => 1 dazu. Das bewirkt, dass der Server Status 404 zurück gibt, wenn zB ein Artikel gelöscht oder falsch verlinkt wurde, statt Status 500.

Gruß aus Münster,
Gunnar

TYPO3 Tiger schrieb am 15.07.2015:
Hi Gunnar, danke für den Tipp! Ich habe diesen in mein Beispiel integriert, kannte das Settings selbst noch nicht ;)

Clemens schrieb am 28.12.2015:
Herzlichen Dank für die Beschreibung, genau diese Infos habe ich gesucht und hier endlich gefunden! :-)

Alex schrieb am 05.10.2016:
wenn du
// Pid der Detailansicht
'5' => array(

änderst in
'myConfig' => array(
...
),
'15' => 'myConfig', // Pid der Detailansicht

kannst du die config für mehrere Seiten nutzen zb:
'15' => 'myConfig', // Pid der Detailansicht 1
'16' => 'myConfig', // Pid der Detailansicht 2
'20' => 'myConfig', // Pid der Detailansicht 3

genau das hab ich lange gesucht :-)
Gruß Alex