对于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'
编辑:由于一些不可思议的最初提到的错误消失了,我已将帖子更新为较短的内容。
答案 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都用于特殊情况。