Локализация статического сегмента routePath в TYPO3 RouteEnhancer - PullRequest
1 голос
/ 14 апреля 2019

Начиная с TYPO3 версии 9.5 RouteEnhancer s можно использовать для перевода параметров расширений в удобные и удобочитаемые URL-пути.

Пример конфигурации для расширения news такой:

routeEnhancers:
  News:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      -
        routePath: '/page/{page}'
        _controller: 'News::list'
        _arguments:
          page: '@widget_0/currentPage'
      -
        routePath: '/article/{news_title}'
        _controller: 'News::detail'
        _arguments:
          news_title: news
      -
        routePath: '/category/{category_name}'
        _controller: 'News::list'
        _arguments:
          category_name: overwriteDemand/categories
      -
        routePath: '/tag/{tag_name}'
        _controller: 'News::list'
        _arguments:
          tag_name: overwriteDemand/tags
    defaultController: 'News::list'
    defaults:
      page: '0'
    requirements:
      news_title: '^[a-zA-Z0-9].*$'
      page: \d+
    aspects:
      news_title:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_news
        routeFieldName: path_segment
      page:
        type: StaticRangeMapper
        start: '1'
        end: '100'
      category_name:
        type: PersistedAliasMapper
        tableName: sys_category
        routeFieldName: title
      tag_name:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_tag
        routeFieldName: title

Мой вопрос:
Как можно локализовать статически сконфигурированные сегменты пути на routePath s выше, чтобы page, article, category и tag были переведены на текущий язык?

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Простые переводы по моему вопросу могут быть добавлены как @Ricardo, найденный для меня, ищите его ответ на этой странице.

Более сложные вещи возможны только при замене (хотя бы) одного класса.

Замена довольно проста, и опасность получения некоторых несовместимостей в будущем путем введения собственного кода в ядро ​​довольно мала, поскольку методы в существующем классе весьма ограничены.

Итак, как заменить классы, связанные с RouteEnhancers?

Все важные классы указаны в глобальном массиве $GLOBALS['TYPO3_CONF_VARS'] и могут быть определены в файлах typo3conf/LocalConfiguration.php или typo3conf/AdditionalConfiguration.php.
Класс, который необходим для отображения локализованных значений на определенные локальные объекты (например, de_DE, en_GB, en_US), регистрируется следующим образом:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['LocaleModifier'] = \TYPO3\CMS\Core\Routing\Aspect\LocaleModifier::class;

Определение там собственного класса дает возможность предоставить дополнительную функциональность.

Какие другие связанные с маршрутизацией классы могут быть определены?
Механизм маршрутизации довольно сложен, поэтому существует несколько классов, которые можно легко заменить.
Чтобы получить обзор предопределенных и заменяемых классов, вы можете проверить
массив $GLOBALS['TYPO3_CONF_VARS']['SYS']['routing'] в бэкэнде TYPO3, открыв
модуль System -> Configuration и там в верхней части страницы в раскрывающемся поле выбрал $GLOBALS['TYPO3_CONF_VARS'] (Global Configuration).

В текущей версии TYPO3-9.5.5 сконфигурированы следующие классы по умолчанию

// Aspects
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['LocaleModifier'] = TYPO3\CMS\Core\Routing\Aspect\LocaleModifier::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['PersistedAliasMapper'] = TYPO3\CMS\Core\Routing\Aspect\PersistedAliasMapper::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['PersistedPatternMapper'] = TYPO3\CMS\Core\Routing\Aspect\PersistedPatternMapper::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['StaticRangeMapper'] = TYPO3\CMS\Core\Routing\Aspect\StaticRangeMapper::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['StaticValueMapper'] = TYPO3\CMS\Core\Routing\Aspect\StaticValueMapper::class;

// Enhancers
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['Extbase'] = TYPO3\CMS\Extbase\Routing\ExtbasePluginEnhancer::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['PageType'] = TYPO3\CMS\Core\Routing\Enhancer\PageTypeDecorator::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['Plugin'] = TYPO3\CMS\Core\Routing\Enhancer\PluginEnhancer::class;
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['Simple'] = TYPO3\CMS\Core\Routing\Enhancer\SimpleEnhancer::class;

В настоящее время я не вижу необходимости программировать собственное решение, но не стесняйтесь публиковать его как ответ, если вы его запрограммировали.

1 голос
/ 14 апреля 2019

Пожалуйста, посмотрите на статью https://typo3worx.eu/2018/12/typo3-routing-extensions-and-enhancers для параграфа "Localemodifier".(Блог - это сундук с полезной информацией;)).

Важная информация, связанная с вашим вопросом:

LOCALEMODIFIER
LocaleModifier «переводит» части URL между языками.Это полезно, если в URL есть статические строки, которые должны выглядеть по-разному на разных языках.Примером может служить база данных продуктов, как в следующем примере:

routeEnhancers:
  NewsArchive:
    type: Extbase
    limitToPages: [13]
    extension: MyProducts
    plugin: Pi1
    routes:
      - { routePath: '/{localized_product}/{product}', _controller: 'MyProducts::detail' }
    defaultController: 'MyProducts::list'
    aspects:
      localized_product:
        type: LocaleModifier
        default: 'product'
        localeMap:
          - locale: 'fr_FR.*|fr_CA.*'
            value: 'produit'
          - locale: 'de_DE.*'
            value: 'produkt'
          - locale: 'es_ES.*'
            value: 'producto'

Я не знаю, возможно ли использовать файл locallang.xlf для такого вида отображения между статической частьюмаршрута и используемых языков.

...