TYPO3扩展手动排序问题:后端视图与新记录排序值异常
哈哈,这俩问题我太熟了!之前帮客户搞TYPO3扩展的时候刚好碰到过几乎一模一样的情况,给你两个靠谱的解决方案,分分钟搞定:
问题1:让后端列表默认降序排列,不用手动切换
你之前说不能在sortby里加ASC/DESC,这个判断完全正确——sortby只负责指定排序字段,不能带方向。但TYPO3专门提供了defaultSorting配置来控制列表默认的排序方向,完全不会影响原有查询逻辑。
直接在你的TCA配置的ctrl数组里,在sortby后面加一行配置:
'ctrl' => [ // 你的其他原有配置(title、label等) 'sortby' => 'sorted', 'defaultSorting' => 'sorted DESC', // 新增这行! ],
设置完成后,后端列表加载时会默认按sorted字段降序排列,排序值最高的最新记录直接显示在第一页最前面,再也不用手动切换排序方向或者翻到最后一页了。
问题2:让新记录自动获得最高排序值
TYPO3默认的排序逻辑是给新记录赋值当前最大排序值+1,但因为你是降序显示,所以需要确保新记录的排序值是当前的最大值+1,这样它才能排在列表最前面。我们可以用TYPO3的事件监听来在保存新记录前自动计算并设置这个值:
- 先在你的扩展里创建一个事件监听类,比如
Classes/Hooks/DataHandlerHook.php,代码如下:
<?php namespace Vendor\YourExtension\Hooks; use TYPO3\CMS\Core\DataHandling\Event\BeforeDataProcessingEvent; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; class DataHandlerHook { public function __invoke(BeforeDataProcessingEvent $event) { $fieldArray = $event->getFieldArray(); $table = $event->getTable(); $id = $event->getId(); // 替换成你自己的表名! $targetTable = 'tx_yourextension_domain_model_yourrecord'; if ($table === $targetTable && $id === 'NEW') { // 查询当前表中最大的sorted值 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($targetTable); $maxSortValue = $queryBuilder ->select('MAX(sorted)') ->from($targetTable) ->executeQuery() ->fetchOne(); // 给新记录设置最高排序值:无记录时设为1,否则最大值+1 $fieldArray['sorted'] = $maxSortValue !== false ? (int)$maxSortValue + 1 : 1; $event->setFieldArray($fieldArray); } } }
- 然后在你的扩展的
Configuration/Services.yaml里注册这个监听:
services: Vendor\YourExtension\Hooks\DataHandlerHook: tags: - name: event.listener identifier: 'your-extension/set-highest-sort-value' event: TYPO3\CMS\Core\DataHandling\Event\BeforeDataProcessingEvent
注意把代码里的Vendor\YourExtension替换成你实际的扩展命名空间,tx_yourextension_domain_model_yourrecord替换成你的表名就行。
这样以后新增记录时,系统会自动把它的sorted值设为当前所有记录里的最大值+1,新记录直接出现在后端列表的最顶部,完美解决你的问题!
内容的提问来源于stack exchange,提问作者Jacqueline Scheidl
相关产品推荐
相关产品推荐

