TYPO3 9:在URL路由增强器中添加日期以进行新闻扩展

时间:2019-02-13 11:48:58

标签: routing typo3 tx-news typo3-9.x

对于tx_news记录的详细页面以及日历扩展名,我写了我自己想要的URL中的记录日期,直到拥有realURL扩展名/path-to/my-page/yyyy/mm/dd/extension-record-path-segment/的TYPO3 8LTS为止。我设法创建了链接,但附加了cHash

/typo3conf/sites/my-site/config.yaml中tx_news_pi1的我的routeEnhancers设置如下:

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部分添加了非常严格的正则表达式,因为description in the T3 changelog会根据需要提及这一点,以避免cHash。

我还尝试在StaticRangeMappers部分的aspects中使用年,月和日(as described in this answer),但这会导致 PersistedAliasMapper被忽略< / strong>,并显示新闻记录的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 :(得分:1)

此问题的原因是月份以带前导零的字符串形式出现,但StaticRangeMapper生成的范围不带前导0,并且不映射像01那样的月份。一旦无法映射一个值,现在映射停止。未映射新闻记录的uid,因为这会在映射月份之后发生。

一个简单的解决方案是编写一个StaticMonthMapper

Error The file 'Resources/LaunchScreen.xib' conflicts with 'Resources/LaunchScreen.xib'.

并向

注册
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;
    }
}
}

这可以在站点配置中使用。对于days参数,可以创建类似的映射器。

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

答案 1 :(得分:0)

新路线的整个概念现在有些不同:-)

基本上,现在的想法是为特定记录创建一个段并将其存储在数据库中,而不是在请求时间创建/解析字符串。 v9中的路径和页面也可以做到这一点,只需查看slug表中的pages字段即可。

因此,后端现在有一种新型的TCA字段,称为slug。您可以将其配置为从多个数据库字段中创建。 提示:请注意,编辑器需要对您要从中生成段符的所有字段具有写权限。有readonly个字段的a bug,所以请记住这一点! 然后,如果该字段正确存储在数据库中,则可以使用以下路由:

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: ''

其他所有mappers都用于特殊情况。