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到记录列表中,并修改查询部分以满足您的需要。
'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'
不适用于 tablepasswordtype
但到包含这些 UID 的列passwordrecords.passwordtype
。
结论:
开箱即用,似乎没有按外部 table 字段排序的选项。
也许,您可以通过\TYPO3\CMS\Backend\RecordList\RecordListGetTableHookInterface::getDBlistQuery()
(在\TYPO3\CMS\Recordlist\RecordList\DatabaseRecordList::getTable
中调用)hook到记录列表中,并修改查询部分以满足您的需要。