TYPO3 9: добавить дату в усилители маршрутизации URL для расширения новостей - PullRequest
0 голосов
/ 13 февраля 2019

Для страниц с подробностями записей tx_news, а также расширения календаря, которое я написал сам, я хочу, чтобы дата записи в URL существовала до тех пор, пока она не была установлена ​​до TYPO3 8LTS с расширением realURL: /path-to/my-page/yyyy/mm/dd/extension-record-path-segment/.Мне удалось создать ссылку , но с прикрепленным cHash .

Мои настройки routeEnhancers для tx_news_pi1 в /typo3conf/sites/my-site/config.yaml следующие:

routeEnhancers:
  NewsPlugin:
    type: Extbase
    limitToPages: [7]
    extension: News
    plugin: Pi1
    routes:
      - { routePath: '/{year}/{month}/{day}/{news}', _controller: 'News::detail' }
    defaultController: 'News::detail'
    requirements:
      year: '^20[0-9]{2}$'
      month: '^[01][0-9]$'
      day: '^[0-3][0-9]$'
    aspects:
      news:
        type: PersistedAliasMapper
        tableName: 'tx_news_domain_model_news'
        routeFieldName: 'path_segment'

Я добавилраздел requirements с довольно строгими регулярными выражениями, потому что в описании в журнале изменений T3 при необходимости упоминается об этом, чтобы избежать cHash.

Я также пытался использовать StaticRangeMappers в aspects раздел для года, месяца и дня (, как описано в этом ответе ), но в результате PersistedAliasMapper игнорируется и вместо него отображается UID записи новостей.Или иногда даже в исключении TYPO3 (1/1) # 1537696772 OverflowException: возможный диапазон всех картографов превышает 10000 элементов (так было даже при удалении их на месяц и день и установкедиапазон для года - только 2016–2019 гг.).

      year:
        type: StaticRangeMapper
        start: '2016'
        end: '2100'
      month:
        type: StaticRangeMapper
        start: '01'
        end: '12'
      day:
        type: StaticRangeMapper
        start: '01'
        end: '31'
      event:
        type: PersistedAliasMapper
        tableName: 'tx_thesimplecal_domain_model_events'
        routeFieldName: 'path_segment'

РЕДАКТИРОВАТЬ: Я обновил этот пост, чтобы он был короче, поскольку волшебным образом исчезли некоторые из первоначально упомянутых ошибок.

Ответы [ 2 ]

0 голосов
/ 16 августа 2019

Причиной этой проблемы является то, что месяц представляет собой строку с начальным нулем, но StaticRangeMapper строит диапазон без ведущих нулей и не отображает месяц, как 01. Отображение останавливается, как только одно значение не может быть сопоставлено, и теперьUID записи новостей не отображается, так как это может произойти после отображения месяца.

Простое решение - написать StaticMonthMapper

class StaticMonthMapper implements StaticMappableAspectInterface, \Countable
{
/**
 * @var array
 */
protected $settings;


/**
 * @param array $settings
 * @throws \InvalidArgumentException
 */
public function __construct(array $settings)
{
    $this->settings = $settings;
}

/**
 * {@inheritdoc}
 */
public function count(): int
{
    return 12;
}

/**
 * {@inheritdoc}
 */
public function generate(string $value): ?string
{
    return $this->respondWhenInRange($value);
}

/**
 * {@inheritdoc}
 */
public function resolve(string $value): ?string
{
    return $this->respondWhenInRange($value);
}

/**
 * @param string $value
 * @return string|null
 */
protected function respondWhenInRange(string $value): ?string
{
    switch ($value) {
        case '01':
        case '02':
        case '03':
        case '04':
        case '05':
        case '06':
        case '07':
        case '08':
        case '09':
        case '10':
        case '11':
        case '12':
            return $value;
        default:
            return null;
    }
}
}

и зарегистрировать его в

$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['StaticMonthMapper'] = \Package\Namespace\StaticMonthMapper::class;

Это можно использовать в конфигурации сайта.Для параметра days можно создать аналогичное сопоставление.

year:
    type: StaticRangeMapper
    start: '2016'
    end: '2100'
month:
    type: StaticMonthMapper
0 голосов
/ 18 февраля 2019

Вся концепция новой маршрутизации теперь немного отличается: -)

По сути, сейчас идея состоит в том, чтобы создать слаг для определенной записи и сохранить его в базе данных, а не создавать/ разбор строк по запросу.Это также делается с путями и страницами в v9, просто посмотрите на поле slug в таблице pages.

Итак, теперь в бэкэнде есть новый тип поля TCA, называемый пробковые .Вы можете настроить его для создания из нескольких полей базы данных. Подсказка : знайте, редактору необходимо разрешение на запись во все поля, из которых вы хотите создать слаг. ошибка с полями readonly, так что имейте это в виду!Если тогда поле правильно хранится в базе данных, вы можете использовать маршрут следующим образом:

routeEnhancers:
  News:
    type: Extbase
    limitToPages:
      - <YOUR-DETAIL-PID-HERE>
    extension: <YOUR-EXTENSION-NAME>
    plugin: <YOUR-PLUGIN-NAME>
    routes:
      -
        routePath: '/{news_title}'
        _controller: 'News::show'
        _arguments:
          offer_title: news
    defaultController: 'News::show'
    aspects:
      news_title:
        type: PersistedAliasMapper
        tableName: <YOUR-TABLE-NAME>
        routeFieldName: slug
        routeValuePrefix: ''

Все другие необычные картографы предназначены для очень особых случаев.

...