首页 > 解决方案 > 带有自定义 ValueMapper 的 TYPO3 RouteEnhancer

问题描述

我目前正在尝试实现自定义 RouteEnhancer。

是我一个人,还是文档又严重不完整?除了更改日志条目中的一小段段落之外,我无法在 TYPO3 中找到有关自定义增强器的任何信息,我在哪里可以获得有关这些的更多信息?我无法在 API 文档中找到它们。

我的扩展中域模型的相关部分是TerminVeranstaltung.
有一个n to 1关系类型来自termin->veranstaltung。我的Veranstaltung->showAction()接受一个termin作为参数。我从默认的 PersistedAliasMapper 开始,这uid对于Termin. 不幸的是,实际标题在Veranstaltung实体中。

我想出了这些简单的转换器并将我的配置设置为使用它们。我有两个问题:

终端值映射器.php:

<?php
namespace REDACTED\REDACTEDVeranstaltungen\Routing\Aspect;

use TYPO3\CMS\Core\Routing\Aspect\PersistedMappableAspectInterface;
use TYPO3\CMS\Core\Site\SiteLanguageAwareTrait;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;

class TerminValueMapper implements PersistedMappableAspectInterface
{
    use SiteLanguageAwareTrait;

    /**
     * @param string $value
     *
     * @return string|null
     */
    public function generate(string $value): ?string
    {
        if($uid=intval($value)){

            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_REDACTEDveranstaltungen_domain_model_termin');
            $statement = $queryBuilder
               ->select('t.uid', 'v.titel', 'v.urltitel', 't.beginn')
               ->from('tx_REDACTEDveranstaltungen_domain_model_termin','t')
               ->leftJoin('t', 'tx_REDACTEDveranstaltungen_domain_model_veranstaltung', 'v', 't.veranstaltung = v.uid')
               ->where(
                  $queryBuilder->expr()->eq('t.uid', $uid)//$queryBuilder->createNamedParameter('horst')
               )
               ->execute();

            if($record = $statement->fetch()){
                if(is_array($record) && mb_strlen(trim($record['urltitel']))){
                    $beginn = new \DateTime();
                    $beginn->setTimestamp(intval($record['beginn']));
                    return $uid.'--'.str_replace('--', '-', $record['urltitel'].'-'.$beginn->format('d-m-Y') );
                }
            }
        }
        return $value;
    }

    /**
     * @param string $value
     *
     * @return string|null
     */
    public function resolve(string $value): ?string
    {
        return intval(explode('--',$value)[0]);
    }
}

配置:

routeEnhancers:
  REDACTEDveranstaltungen_veranstaltungen:
    type: Extbase
    extension: REDACTEDVeranstaltungen
    plugin: Veranstaltungen
    routes: 
      - { routePath: '/themenbereiche/{thema_titel}', _controller: 'Termin::search',  _arguments: {'thema_titel': 'veranstaltungsarten/0'} }
      - { routePath: '/veranstaltung/{termin_titel}', _controller: 'Veranstaltung::show',  _arguments: {'termin_titel': 'termin'} }
    aspects:
      termin_titel:
        #type: PersistedAliasMapper
        #tableName: 'tx_REDACTEDveranstaltungen_domain_model_termin'
        #routeFieldName: 'uid'
        type: TerminValueMapper
      thema_titel:
        type: PersistedAliasMapper
        tableName: 'sys_category'
        routeFieldName: 'title'

标签: routingtypo3extbasetypo3-9.x

解决方案


路由功能的文档 - 特别是扩展路由 - 可以在https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Routing/ExtendingRouting.html#writing-custom找到-增强剂

对于 cHash 的调试问题,请使用以下两个位置作为起点: \TYPO3\CMS\Core\Routing\PageRouter::buildPageArgumentsPackages/TYPO3.CMS/typo3/sysext/core/Classes/Routing/PageRouter.php:311

扩展路由时,请注意是否需要编写自定义路由增强器(如果您需要操作完整路由的外观和解析方式)还是自定义方面(如果您想操作单个路由参数(“变量”)被映射并解决)。两者都有子类型(增强器和装饰器、静态或动态映射器),您可以在文档中找到它们。


推荐阅读