Heute schreibe ich darüber, wie man bei der Verwendung von Plugins mit eigenen Daten schöne und sprechende URLs erzeugen kann. Ein Plugin in TYPO3 Neos ist nichts anderes, als ein TYPO3 Flow Paket. In der offiziellen Dokumentation ist beschrieben, wie man ein Plugin anlegt und in Neos verfügbar macht (http://docs.typo3.org/neos/TYPO3NeosDocumentation/IntegratorGuide/CreatingAPlugin.html). Nachdem man das Plugin so konfiguriert hat steht dieses unter den verfügbaren Inhaltselementen zur Verfügung. Außerdem kann man über das Inhaltselement PluginView die Anzeige der Detail Ansicht etc. auf eine andere Seite verlegt werden. Dazu muss auf dieser anderen Seite lediglich ein Plugin View Inhaltselement eingebunden und konfiguriert werden. Wenn das alles so fertig eingerichtet ist können wir uns die Seite bereits ansehen und von der Listenansicht zu einer Einzelansicht wechseln. Bei der Einzelansicht besteht allerdings bezüglich der URLs noch Optimierungsbedarf. Die im Moment ausgespielten Detail URLs beinhalten etwas in der Art:
?--vendor_sitename-pluginname[@package]=package.name &--vendor_sitename-pluginname[@controller]=standard &--vendor_sitename-pluginname[@action]=detail &--vendor_sitename-pluginname[object][__identity]=3084731f-869f-43a3-56c3-9156f24baad5
Diese GET Parameter benötigt TYPO3 Neos um das richtige Plugin zu rendern. Es ist jedoch nicht notwendig, dass diese alle in der URL übergeben werden. In der Datei Routes.yaml kann man einstellen wie URLs in dem Fall generiert werden sollen. Für obige Parameter könnte man beispielsweise die folgende Konfiguration vornehmen:
- name: 'Detail Route' uriPattern: '{node}/details/{--vendor_sitename-pluginname.object}.{@format}' defaults: '@package': 'TYPO3.Neos' '@controller': 'Frontend\Node' '@format': 'html' '@action': 'show' '--vender_sitename-pluginname': '@package': 'Package.Name' '@controller': 'Standard' '@action': 'detail' '@format': 'html' routeParts: node: handler: TYPO3\Neos\Routing\FrontendNodeRoutePartHandler '--vendor_sitename-pluginname.object': objectType: '\Package\Name\Domain\Model\Object' uriPattern: '{property}' appendExceedingArguments: TRUE
Die obige Regel führt dazu, dass nur noch die Property in der URL ausgegeben wird. Es wird also eine URL in der Art
http://{domain}/{node}/detail/property.html
erzeugt und nicht wie vorher:
http://{domain}/{node}?--vendor_sitename-pluginname[@package]=package.name &--vendor_sitename-pluginname[@controller]=standard &--vendor_sitename-pluginname[@action]=detail &--vendor_sitename-pluginname[object][__identity]=3084731f-869f-43a3-56c3-9156f24baad5
Die neuen URLs sind für Besucher viel einfacher zu lesen und auch für Google sind diese besser, da in der URL noch einmal ein Keyword untergebracht ist.
War dieser Artikel verständlich? Habt ihr Fragen oder sollte ich das ganze detaillierter beschreiben dann meldet euch einfach, Entweder über einen Kommentar unter diesem Beitrag, über das Kontaktformular oder per E-Mail.
Hi,
Bei dieser Konfiguration gibt es nur ein Problem mit PluginViews. Sobald ich die Detailseite öffne und auf der Seite ein PluginView eingefügt wurde, zeigt der PluginView „teaser“ auf einmal den gleichen Inhalt wie das Plugin mit der action „detail“.
Das wäre super wenn man das abfangen könnte …
Sorry, dafür habe ich im Moment gerade auch keine Lösung. Durch die Konfiguration wird der View für das Plugin überschrieben. Funktioniert das evtl. mit einem anderen Plugin?
Kein PRoblem, hab schon eine Lösung dafür. Die Konfiguration als PluginView bietet sich an der stelle nicht an aus den oben genannten Gründen. Daher habe ich einfach im TS2 einfach 2 Plugins kofiguriert und die views definiert. Dann muss es im Backend einfach als Plugin eingefügt werden und fertig.
prototype(Acme.ProductModule:Plugin) < prototype(TYPO3.Neos:Plugin)
prototype(Acme.ProductModule:Plugin) {
package = 'Acme.ProductModule'
controller = 'Product'
action = 'index'
}
prototype(Acme.ProductModule:Teaser) < prototype(TYPO3.Neos:Plugin)
prototype(Acme.ProductModule:Teaser) {
package = 'Acme.ProductModule'
controller = 'Product'
action = 'teaser'
}
Achja die NodeTypes.yaml natürlich nicht vergessen:
‚Acme.ProductModule:Plugin‘:
superTypes:
‚TYPO3.Neos:Plugin‘: TRUE
‚Acme.ProductModule:Teaser‘:
superTypes:
‚TYPO3.Neos:Plugin‘: TRUE