【问题标题】:TYPO3 How to handle routes for custom extensionsTYPO3 如何处理自定义扩展的路由
【发布时间】:2020-11-08 23:16:06
【问题描述】:

假设我有一个假设的 ZOO 扩展,它只有 Animal 模型,以及用于显示简单 listShowroom 插件和show 动作。到目前为止非常基本的案例。

Animal 模型只包含两个字段 name 应该是 URI 部分和 color... 只是颜色。

SQL 只是

CREATE TABLE tx_zoo_domain_model_animal (
    name varchar(255) DEFAULT '' NOT NULL,
    color varchar(255) DEFAULT '' NOT NULL,
);

为了链接到单个视图(show 操作),我们可以使用没有路由增强器的简单 URI:

/zoo?tx_zoo_showroom[action]=show&tx_zoo_showroom[animal]=123&tx_zoo_showroom[controller]=Animal&cHash=17c7b0009b50eaf0222fe66d9f

接下来,要为我们的扩展添加路由,我们想在 typo3conf/sites/yoursite/config.yaml 中添加这样的增强器

routeEnhancers:
  Zoo:
    type: Extbase
    limitToPages:
      - 107  # it's always good idea to limit enhancers only to pages containing plugin
    extension: Zoo
    plugin: Showroom
    routes:
      - routePath: '/'
        _controller: 'Animal::list'
      - routePath: '/{animal-name}'
        _controller: 'Animal::show'
        _arguments:
          animal-name: animal
    aspects:
      animal-name:
        type: PersistedAliasMapper
        tableName: tx_zoo_domain_model_animal
        routeFieldName: name

会产生类似http://domain.tld/zoo/Elephant的链接

到目前为止,一切都很好,无论如何我们在这里遇到了几个问题:

  • URI 不是小写的
  • 它不会替换空格,所以如果我们有一个具有 Ultra Weird Fish 名称的动物,那么 URI 将是 http://domain.tld/zoo/Ultra%20Weird%20Fish 而不是 http://domain.tld/zoo/ultra-weird-fish
  • 它不关心唯一性,所以当我们添加几个动物时,例如鱼名,但颜色不同,它会为所有动物创建相同的 URI:http://domain.tld/zoo/Ultra%20Weird%20Fish

如何正确处理这种情况?

【问题讨论】:

    标签: routes typo3 typo3-9.x typo3-10.x


    【解决方案1】:

    在这种情况下,我们应该在模型/表中使用附加字段,例如 slug 就像在 pages TCA 中一样。首先要做的是在typo3conf/ext/zoo/ext_tables.sql中将它添加到我们的SQL中

    CREATE TABLE tx_zoo_domain_model_animal (
        name varchar(255) DEFAULT '' NOT NULL,
        color varchar(255) DEFAULT '' NOT NULL,
        slug varchar(2048), -- quite large value, but your name/slug may be loooong
    );
    

    如果我们的表的TCA typo3conf/ext/zoo/Configuration/TCA/tx_zoo_domain_model_animal.php,我们需要为新字段添加配置

    <?php
    return [
        'ctrl' => [...],
        'interface' => [
            // add slug to showRecordFieldList
            'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, name, slug, color',
        ],
        'types' => [
            // add slugto showitem
            '1' => ['showitem' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, name, slug, color, --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, starttime, endtime'],
        ],
        'columns' => [
            'sys_language_uid' => [...],
            'l10n_parent' => [...],
            'l10n_diffsource' => [...],
            't3ver_label' => [...],
            'hidden' => [...],
            'starttime' => [...],
            'endtime' => [...],
    
            'name' => [...],
            'color' => [...],
            // add config for slug
            'slug' => [
                'exclude' => true,
                'label' => 'Slug',
                'displayCond' => 'VERSION:IS:false',
                'config' => [
                    'type' => 'slug',
                    'size' => 50,
                    'generatorOptions' => [
                        'fields' => ['name'],
                        'replacements' => [
                            '/' => '-'
                        ],
                    ],
                    'fallbackCharacter' => '-',
                    'eval' => 'uniqueInSite', // optionaly 'unique' can be used to make sure it's unique within whole TYPO3 instance.
                    'default' => ''
                ]
            ],
    
        ],
    ];
    

    最后编辑我们的路由增强器以使用slug 而不是typo3conf/sites/yoursite/config.yaml 中的name

    routeEnhancers:
      Zoo:
        type: Extbase
        limitToPages:
          - 107  # it's always good idea to limit enhancers only to pages containing plugin
        extension: Zoo
        plugin: Showroom
        routes:
          - routePath: '/'
            _controller: 'Animal::list'
          - routePath: '/{animal-name}'
            _controller: 'Animal::show'
            _arguments:
              animal-name: animal
        aspects:
          animal-name:
            type: PersistedAliasMapper
            tableName: tx_zoo_domain_model_animal
            routeFieldName: slug
    

    感谢这种方法 slug 字段将在后端表单编辑期间得到正确处理:

    ProTip 像往常一样,每次更改代码后,尤其是在config.yaml 不要忘记 清除所有缓存数百万次:D

    除了cmets中的问题

    对非唯一 URI 使用数字后缀是很长一段时间内 TYPO3 中路由(或一般的 URL 重写)的标准行为。实际上,使用添加的 slug 字段可以让您为每个项目输入自定义 slug,而不是使用 elephant-1elephant-2

    您也可以选择修改 slug 字段的 TCA,以组合来自 DB 的更多字段,而无需手动编辑 slug:

    'slug' => [
        'exclude' => true,
        'label' => 'Slug',
        'displayCond' => 'VERSION:IS:false',
        'config' => [
            'type' => 'slug',
            'size' => 50,
            'generatorOptions' => [
                'fields' => ['name', 'color'], // combine more fields
                'fieldSeparator' => '/', // or '-' if you want slug like 'elephant-cyan' instead of `elephant/cyan`
                'replacements' => [
                    '/' => '-'
                ],
            ],
            'fallbackCharacter' => '-',
            'eval' => 'uniqueInSite', // optional 'unique' can be used
            'default' => ''
        ]
    ],
    

    根据 color 字段的值自动创建 slug,例如:

    BE预览:

    TCA 中的外观配置

    由于 TYPO3 版本:10.x,可以使用 presented in documentation 类向 slug 字段添加自定义前缀,它只会添加类似于您可以在翻译页面/记录中看到的前缀。

    实际上它继承了两个参数,$parameters$referenceTYPO3\CMS\Backend\Form\FormDataProvider\TcaSlug,所以它可以用于添加路由的语言部分,但是,它已经完成了,所以我暂时找不到许多其他用途。

    【讨论】:

    • 所以假设数据库表中存在一个红色和一个绿色的大象(好吧,大象不是真实世界的例子:D)应该如何自动创建蛞蝓?我想要的不仅仅是elephantelephant-1elephant-2
    • 您可以选择精美的颜色 :D 编辑后,我也可以添加带有红点的绿色大象 ;-) 所以到目前为止,您从不使用任何额外的类来处理蛞蝓 - 开启时一方面它不那么复杂和容易,另一方面缺少该选项的示例。
    • 随意添加一个;)
    • 顺便说一句,文档中提到了自定义类处理:docs.typo3.org/m/typo3/reference-tca/master/en-us/ColumnsConfig/…
    • 是的,return 'custom base url'; 的示例有点奇怪,但从未解释过它的需求或选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多