Typo3 自定义扩展路由增强器

Typo3 custom extension route enhancers

我使用 Extension Builder 扩展创建了自定义 Typo3 v9.5.26 扩展。

我的扩展驻留在 typo3conf/ext/xyz_sortitems 中并对项目进行排序。

项目具有属性 itemid、name、date 和 amount。

我的 ext_localconf.php 看起来像这样:

<?php  
if (!defined('TYPO3_MODE')) {  
    die ('Access denied.');  
}  
  
call_user_func(  
    function() {  
  
        \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(  
            'XYZ.XyzSortitems',  
            'Sortitems',  
  
            // cacheable actions  
            ['Sortitems' => 'sortbyname,sortbydate,sortbyamount,showsingleitem'],  
  
            // non-cacheable actions  
            ['Sortitems' => 'sortbyname,sortbydate,sortbyamount,showsingleitem']  
        );  
  
    }  
);

我的视图控制器位于 typo3conf/ext/xyz_sortitems/类/Controller/SortitemsController.php 中,看起来像这样:

<?php  
  
namespace XYZ\XyzSortitems\Controller;  
  
class SortitemsController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {  
  
    protected $sortitemsRepository = null;  
  
    public function injectSortitemsRepository(\XYZ\XyzSortitems\Domain\Repository\SortimtesRepository $sortitemsRepository) {  
        $this->sortitemsRepository = $sortitemsRepository;  
    }  
  
    public function sortbynameAction() {  
        // sorts items by name here...  
    }  
  
    public function sortbydateAction() {  
        // sorts items by date here...  
    }  
  
    public function sortbyamountAction() {  
        // sorts items by amount here...  
    }  
  
    public function showsingleitemAction() {  
        // displays a single item here...  
    }  
  
}

...我的视图模板(例如 sortbydateAction)驻留在 ext/xyz_sortitems/Resources/Private/Templates/Sortbydate.html 中并生成指向各个项目的链接,如下所示:

<html xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">  
    <f:layout name="defaultLayout" />  
    <f:section name="sectionname">  
        <f:for each="{items}" as="item">  
  
            <!-- here the link to the single item page is generated -->  
            <f:link.action action="showsingleitem" pageUid="4321" arguments="{itemid: item.itemid}">  
  
        </f:for>  
    </f:section>  
</html>

我的扩展按预期工作。

现在,当我查看显示排序项目列表(例如按日期排序)的页面的前端时,Fluid 模板引擎会生成此列表中的项目到相应目标页面的链接(每个显示单个项目)大约是这样的:

http://example.com/item  
?tx_xzysortitems_sortitems%5Baction%5D=showsingleitem 
&tx_xzysortitems_sortitems%5Bcontroller%5D=Sortitems  
&tx_xzysortitems_sortitems%5Bitemid%5D=12345  
&cHash=38a2dd43d7b0c4997c3b0ff6d4430e55

相反,我需要链接到显示单个项目的各个页面,如下所示:

http://example.com/item/{itemid}/{name}  
(e.g. http://example.com/item/12345/ice-cream-on-toast)

由于 RealURL 在 Typo2 v9 中消失了,我显然需要 typo3conf/ext/xyz_sortitems/config.yaml 中的 Route Enhancer,从 Typo3 数据库中的扩展名 table 中读取 itemid 和名称并将将这些值添加到指向单个项目页面的 URL 中。

不幸的是,我能找到的所有代码示例中大约有 90% 都参考了 Georg Ringer 基于 pi 的“新闻”扩展作为示例。这个扩展是一个非常特殊的扩展(因为它是基于 pi 的,并且出于许多其他原因)并且关于这个扩展的示例的纯粹重复并没有使这个主题对我来说更容易理解。我能找到的其余 10% 的说明,包括官方 Typo3 文档(目前 here)提供了很好的示例,但不要提及哪个值来自哪里。

我主要对 config.yaml 的顶部感兴趣:

  routeEnhancers:  
    {SecondLine}:  
      type: {typedefinition}  
      extension: {extensionname}  
      plugin: {pluginname}  
      namespace: {namespace}  
      limitToPages:  
        - {a_page_id}  
        - {another_page_id}  
      routes:  
      # routes here...

我需要这些值中的哪些以及我从哪里获取它们?

到目前为止我发现的说明通常要么根本不解释这些值,要么用“从你的 ext_localconf.php 中获取这些值”来引用它们。这对我没有太大帮助,因为这没有解释 config.yaml 中的哪个值对应于 ext_localconf.php 中的哪个值,以及各个值的语法是否需要小写,首字母大写和其余小写或驼峰式,如果它需要在单引号或双引号中,转义,可以包含空格,需要下划线或语法要求的任何其他内容才能有效。像“扩展名”这样的术语可能会产生误导,因为在我的示例中,这可能是“sortitems”、“xyz_sortitems”、“XYZ.Sortitems”、“XyzSortitems”或“Sortitems”,仅举几例。

我希望得到一个 config.yaml 代码示例的回答,以通用的方式 详细解释这些值 ,以便阅读此问题并了解的每个人像我一样理解手册的相同问题可以轻松地将这些宝贵的知识应用到他们自己的自定义 Typo3 扩展中。

根据您的问题,这是对值的解释。

routeEnhancers:  
    {SecondLine}:  
      type: {typedefinition}  
      extension: {extensionname}  
      plugin: {pluginname}  
      namespace: {namespace}  
      limitToPages:  
        - {a_page_id}  
        - {another_page_id}  
      routes:  
      # routes here...

{SecondLine} 的价值

示例:XzySortitemsShow

增强子的唯一名称,内部用于引用。 Found in core doc.

{typedefinition} 的值

示例:Extbase

TYPO3 comes with the following route enhancers out of the box:

  • Simple Enhancer (enhancer type “Simple”)
  • Plugin Enhancer (enhancer type “Plugin”)
  • Extbase Plugin Enhancer (enhancer type “Extbase”)

更多类型在core docs中描述。

{extensionname} 的值

示例:XyzSortitems

UpperCamelCase of the extension name (the name of the folder of your extension)

来源:typo3_src-10.4.14/sysext/extbase/Classes/Utility/ExtensionUtility.php

configurePlugin()函数参数为

public static function configurePlugin(
    $extensionName, 
    $pluginName, 
    array $controllerActions, 
    array $nonCacheableControllerActions = [], 
    $pluginType = self::PLUGIN_TYPE_PLUGIN)

来自 configurePlugin() 代码的注释 * @param string $扩展名 扩展名称(采用 UpperCamelCase) 或扩展密钥(在 lower_underscore 中)

{pluginname} 的值

示例:Sortitems

来源:typo3_src-10.4.14/sysext/extbase/Classes/Utility/ExtensionUtility.php

configurePlugin()函数参数为

public static function configurePlugin(
    $extensionName, 
    $pluginName, 
    array $controllerActions, 
    array $nonCacheableControllerActions = [], 
    $pluginType = self::PLUGIN_TYPE_PLUGIN)

来自 configurePlugin() 代码的评论

* @param string $pluginName must be a unique id 
      for your plugin in UpperCamelCase 
      (the string length of the extension key 
      added to the length of the plugin name 
      should be less than 32!)

{命名空间}

是 extbase 类型的替代。

可以找到示例 here in core doc and the plugin enhancer is described here in core doc

For the Extbase Plugin Enhancer, it is also possible to configure the namespace directly by skipping extension and plugin properties and just using the namespace property as in the regular Plugin Enhancer.

题外话: Georg Ringer 的 EXT:news 不是基于圆周率的!