Slug

Ab TYPO3 9 kann man routeEnhancers benutzen, um das Format der Links zu Einzelseiten zu ändern. Hier ein Beispiel für die yaml-Datei:

routeEnhancers:
  CamaligaPlugin:
    type: Extbase
    limitToPages: [24]
    extension: Camaliga
    plugin: Show
    routes:
      - { routePath: '/more/{camaliga_uid}', _controller: 'Content::show', _arguments: {'camaliga_uid': 'content'} }
    defaultController: 'Content::list'

limitToPages ist optional. Man kann die Regel auf bestimmte Seiten beschränken, die Einzelansichten anzeigen. Ersetze die 24! In diesem Beispiel wird die uid eines Camaliga-Elements hinter "more" eingefügt. Hier ein anderes Beispiel, welches das Slug-Feld benutzt:

routeEnhancers:
  CamaligaPlugin:
        type: Extbase
        limitToPages: [24]
        extension: Camaliga
        plugin: Show
        routes:
          - { routePath: '/eintrag/{camaliga_title}', _controller: 'Content::show', _arguments: {'camaliga_title': 'content'} }
        defaultController: 'Content::list'
        aspects:
          camaliga_title:
                type: PersistedAliasMapper
                tableName: 'tx_camaliga_domain_model_content'
                routeFieldName: 'slug'

Achtung 1: wenn man das slug-Feld benutzt, sollte man sicher sein, dass die slug-Felder auch befüllt sind. Dazu kann man einen Scheduler-Task von camaliga benutzen.

Achtung 2: wenn man 2 Felder für das slug-Feld konfiguriert hat, wird '_' oder '-' statt '/' als Separator benutzt, wegen diesem Problem: https://forge.typo3.org/issues/87333

Achtung 3: wenn man die "Einzelansicht 2" (erweiterte Einzelansicht) benutzt, muss man Content::show durch Content::showExtended ersetzen.

Achtung 4: vor Camaliga 12 muss man bei plugin: Pi1 statt Show benutzen. Und ab Camaliga 12 muss man Show evtl. durch Showextended ersetzen, wenn man nicht die normale Single-Ansicht benutzt!

Man kann auch Kategorien in den routeEnhancers verwenden. Allerdings geht das nur mit Kategorien eines "parents". Wenn der parent die ID 10 hat, kann man so einen routeEnhancer für die Suche nach Camaliga-Elementen, die eine Kategorie haben, deren parent 10 ist:

routeEnhancers:
  CatCamaliga:
    type: Extbase
    extension: Camaliga
    plugin: Show
    limitToPages:
      - 45
    routes:
      -
        routePath: '/{category-name}'
        _controller: 'Content::search'
        _arguments:
          category-name: cat10
    defaultController: 'Content::search'
    aspects:
      category-name:
        type: PersistedAliasMapper
        tableName: sys_category
        routeFieldName: slug

Zusätzlich muss man das Template per TypoScript setzen, dass bei der Suche verwendet werden soll:

plugin.tx_camaliga.settings.extended.template = Openstreetmap

Hier noch 2 nicht so schöne / alte Beispiele:

routeEnhancers:
  CamaligaPlugin:
        type: Extbase
        limitToPages: [382]
        extension: Camaliga
        plugin: Pi1
        routes:
          - { routePath: '/googlemaps/{camaliga_place}', _controller: 'Content::map', _arguments: {'camaliga_place': 'content'} }
        defaultController: 'Content::map'
        aspects:
          camaliga_place:
                type: PersistedPatternMapper
                tableName: 'tx_camaliga_domain_model_content'
                routeFieldPattern: '^(?P<city>.+)-(?P<uid>\d+)$'
                routeFieldResult: '{city}-{uid}'

In diesem Beispiel wird die Stadt und die uid eines Camaliga-Eintrags benutzt, um ihn dann auf einer Google-maps-Karte anzuzeigen. Achtung: zur Zeit gibt es noch kein slug-Feld in der Camaliga-Tabelle, sodass keine Konvertierung zu einem guten Link-String stattfindet. Es tauchen also z.B. ggf. Leerzeichen im Link auf. Beachte: das Beispiel funktioniert nur, wenn man kein "/" bei der Stadt verwendet.

Man kann das ganze auch anders schreiben. Das Ergebnis ist allerdings das gleiche (aber ohne /googlemaps):

routeEnhancers:
  CamaligaPlugin:
        type: Plugin
        limitToPages: [382]
        namespace: 'tx_camaliga_pi1'
        routePath: '/{content}'
        requirements:
          content: '[0-9]{1..5}'
        aspects:
          content:
                type: PersistedPatternMapper
                tableName: 'tx_camaliga_domain_model_content'
                routeFieldPattern: '^(?P<city>.+)-(?P<uid>\d+)$'
                routeFieldResult: '{city}-{uid}'

Weitere Informationen dazu findet man hier: https://typo3worx.eu/2018/12/typo3-routing-extensions-and-enhancers/

RealUrl

Bis TYPO3 8 kann man RealUrl benutzen, um das Format der Links zu Einzelseiten zu ändern. Hier ein Beispiel für die RealUrl-config-Datei:

'postVarSets' => array(
  '_DEFAULT' => array(
  ...

        'camaliga' => array( // this key must be unique
            array(
                'GETvar' => 'tx_camaliga_pi1[action]',
            ),
            array(
                'GETvar' => 'tx_camaliga_pi1[controller]',
            ),
            array(
                'GETvar' => 'tx_camaliga_pi1[content]',
            ),
        ),

  ...
 ),
),