TYPO3 9.5: поместите сегмент пользовательского пути после усилителей языка / маршрута

При переходе с TYPO3 8.7 на 9.5 мне нужно заменить старую конфигурацию realurl, чтобы она соответствовала новой маршрутизации:

Конфигурация старого адреса Realurl: пользовательский сегмент для страны после языка:

'preVars' => array(
        array(
            'GETvar' => 'L',
            'valueMap' => array(
                'en' => '0', // darf nicht auskommentiert sein!
                'de' => '1',
                'pl' => '2',
                ...

        array(
            'GETvar' => 'C',
            'valueMap' => array(
                'de'=>'1',
                'ch'=>'2',
                'ch'=>'3',      

Я попробовал "простой" усилитель маршрута в конфигурации сайта TYPO3 9.5:

languages:
  -
    title: English
    enabled: true
    languageId: 0
    base: /en/
    typo3Language: default
    locale: en_US.UTF-8
    iso-639-1: en
    navigationTitle: English
    hreflang: en-us
    direction: ltr
    flag: us
  -
    title: German
    enabled: true
    base: /de/
    typo3Language: de
    locale: de_DE.UTF-8
    iso-639-1: de
    navigationTitle: ''
    hreflang: ''
    direction: ''
    fallbackType: fallback
    fallbacks: ''
    flag: de
    languageId: '1'
rootPageId: 1
routes: {  }
routeEnhancers:
  Country:
    type: Simple
    routePath: '/{Country}'
    defaults:
    requirements:
      C: '[1-21]'
    aspects:
      Country:
        type: StaticValueMapper
        map:             
          de: 1
          ch: 2

Но сегменты страны не будут отображаться между Language и main-slug: OLD URLS: www.mydomain.com/de/ch/home/

С моей конфигурацией Router-Enhancer (см. Выше): www.mydomain.com/de/home/ch/

Кто-нибудь знает, как я могу создать этот специальный сегмент и позволить ему появиться в нужном месте?

Большое спасибо за любые подсказки


person Stefan Müller    schedule 20.11.2019    source источник


Ответы (1)


Усилитель маршрута добавляет что-то после URL-адреса страницы. Однако у нас был похожий сценарий. Вот что мне пришлось сделать, чтобы он заработал:

Переход по нужной ссылке:

1. Разрешение входящего запроса страницы

Создайте собственное промежуточное программное обеспечение (после того, как язык определен и SiteRouteResult доступен в запросе PSR-7 в промежуточном программном обеспечении PSR-15) Это промежуточное программное обеспечение затем берет «хвост» SiteRouteResult и разрешает аргумент на основе заданного статического список (вроде бы он был в списке). После этого я создал новый объект SiteRouteResult с этим pathSegment, удаленным из хвоста. Имейте в виду, что может быть очень полезно сохранить разрешенный аргумент как «вариант» страницы, таким образом, эффективно подключаясь к TSFE, где createHashBase () построен для вычисления в этой переменной.

Я рекомендую сохранить эту строку в запросе как настраиваемое свойство или как настраиваемое свойство TSFE.

Невозможно разрешить prePathVar с помощью RouteEnhancer, поскольку правильные усилители маршрута выбираются только ПОСЛЕ того, как страница была найдена. Если в вашем URL-адресе указано «/ ch / home», TYPO3 PageRouter НЕ сможет найти нужную страницу.

2. Создание ссылок с параметром запроса "& c".

Создайте RouteEnhancer, который действует как декоратор (см. Улучшение PageType). Однако декоратору не нужно «убирать» / «разрешать» URL (ничего не делать). Это становится сложно, если вы также используете PageTypeDecorator, поскольку у вас может быть только один, поэтому вам может потребоваться расширить его из Core, если вам также нужно сопоставить typeNums.

В любом случае пользовательский Enhancer может затем префикс сгенерированного маршрута статической картой в зависимости от того, указан ли тип.

Надеюсь, это поможет!

person Benni    schedule 20.11.2019
comment
Большое спасибо! Это дает мне хорошее представление о том, что нужно делать. Хотя мне как typo3-интегратору может быть немного сложно добиться этого. Если кому-то нравится публиковать примеры кодирования - добро пожаловать! Тем временем я начал читать о промежуточных продуктах: usetypo3.com/psr15-middleware-in-typo3.html - person Stefan Müller; 21.11.2019
comment
Мне удалось создать customPageTypeDecorator: во всех сгенерированных ссылках & C = ... кодируется в нужном месте после языка. Мне также удалось создать промежуточное ПО и создать новый SiteRouteResult с обновленным путем. В основном это работает, пока. Но у меня проблемы с подключением к TSFE, где построен createHashBase (). Я думаю, мне нужны разные кешированные версии страницы в зависимости от разных C-параметров. Это сложная задача или ее можно решить с помощью нескольких строк кода? Какие-нибудь рекомендации по расширению, где я мог бы найти основы? - person Stefan Müller; 16.12.2019
comment
Вы можете сделать это, зарегистрировав ловушку в вашем ext_localconf.php, как это делает это расширение: github.com/sourcebroker/singleview/blob/master/ Перехватчик может выглядеть следующим образом, если изменить $ params ['hashParameters'] ['country'] = 'My Value'; github.com/sourcebroker/singleview/blob/master/Classes/ Крючки / - person Benni; 17.12.2019
comment
Большое спасибо ! В итоге все получилось очень красиво. Я поместил все 3 части (пользовательский PageTypeDecorator, промежуточное ПО PSR-15 и крючок для кеширования пользовательского параметра) в одно расширение. Когда я немного почистю свое расширение, я помещу его в GITlab и свяжу его отсюда, чтобы поделиться с сообществом ;-) Ура - person Stefan Müller; 20.12.2019
comment
@ StefanMüller Вы успели поделиться своим решением на GitLab? У нас очень похожая проблема, и мы будем признательны за ваши результаты. - person paul; 04.05.2020
comment
Привет, Пол, мое решение здесь: gitlab.com/mueller44/bitcountryrouter Но это, вероятно, не сработает коробки. Я использовал конфигурацию country2Language в additionalConfiguration.php. Может быть, вы найдете нужные подсказки. Надеюсь, это поможет. - person Stefan Müller; 05.05.2020
comment
Можно ли при таком подходе объединить сегменты языка и страны в один сегмент, например / de-AT /? - person smitrovic; 12.10.2020