TYPO3 - 如何按 foreign_table 的字段而不是它的 uid 对记录进行排序?

TYPO3 - How can I sort a record by a field of a foreign_table and not by it's uid?

'passwordtype' => [
        'exclude' => false,
        'label' => '###label####',
        'config' => [
            'type' => 'select',
            'renderType' => 'selectMultipleSideBySide',
            'foreign_table' => 'passwordtypes',
            'foreign_sortby' => 'name',
        ],
    ],

tca 的那部分很有魅力。当我在后端打开密码记录时,密码类型按名称排序。

但我希望密码记录的排序也按密码类型进行。所以我在 'ctrl' 下尝试了 'sortby' => 'passwordtype' 但它只按 uid 排序,而不是按密码类型的名称排序。

我也试过 'sortby' => 'passwordtype.name' 但这会产生错误。是否可以按密码类型的名称而不是 uid 对其进行排序?它显然已经在密码列表中具有密码类型的名称,因为当我将 'ctrl' 下的 'label' 更改为 'passwordtype' 时,我可以看到正确的名称而不是 uids。

即使我必须更改我的数据库结构,我也愿意接受每一个想法。

简单的顺序是foreign_table_where:

   'passwordtype' => [
        'exclude' => false,
        'label' => '###label####',
        'config' => [
            'type' => 'select',
            'renderType' => 'selectMultipleSideBySide',
            'foreign_table' => 'passwordtypes',
            'foreign_table_where' => 'AND 1=1 ORDER BY name',
        ],
    ],

让我们深入核心...

记录列表是通过\TYPO3\CMS\Recordlist\Controller\RecordListController::main()生成的。获取列表本身,方法调用 \TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList::generateList().

generateList() 仅从实际 table 本身获取 select 数据。这里没有解决任何关系。那么为什么不能按关系字段排序就变得更清楚了:它们不是 selected 数据的一部分。


  • 但是...显示的是国外记录的标签

    是的,这是在呈现列表的具体行时完成的。那时 时刻,无法再应用排序。

  • 但是...它适用于按 UID 排序。

    是也不是。你有一个 1:n 关系,所以外部记录的 UID 在您的(密码记录)table 中保存为 foreign_key。这 'sortby' => 'passwordtype' 不适用于 table passwordtype 但到包含这些 UID 的列 passwordrecords.passwordtype


结论:

开箱即用,似乎没有按外部 table 字段排序的选项。

也许,您可以通过\TYPO3\CMS\Backend\RecordList\RecordListGetTableHookInterface::getDBlistQuery()(在\TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList::getTable中调用)hook到记录列表中,并修改查询部分以满足您的需要。