TYPO3 Extbase:前端保存已排序标题问题
TYPO3多对多关联排序更新失效的解决方案
1. 补全TCA配置的关键项
仅在关联字段设置foreign_sortby不够,必须确保中间表的TCA也正确配置排序字段:
- 在
tx_bla_domain_model_offer的offerTitle字段TCA中,foreign_sortby要指向中间表的排序字段(比如sorting) - 中间表
tx_bla_blub_title_mm的ctrl段必须定义sortby字段,示例配置:
// 主表offer的offerTitle字段TCA 'offerTitle' => [ 'label' => 'LLL:EXT:bla/Resources/Private/Language/locallang_db.xlf:tx_bla_domain_model_offer.offerTitle', 'config' => [ 'type' => 'select', 'renderType' => 'selectMultipleSideBySide', 'foreign_table' => 'tx_bla_domain_model_blubtitle', 'MM' => 'tx_bla_blub_title_mm', 'MM_opposite_field' => 'offers', 'foreign_sortby' => 'sorting', // 关联中间表的排序字段 'multiple' => true, 'size' => 10, ], ], // 中间表tx_bla_blub_title_mm的TCA 'ctrl' => [ 'title' => 'LLL:EXT:bla/Resources/Private/Language/locallang_db.xlf:tx_bla_blub_title_mm', 'label' => 'uid', 'sortby' => 'sorting', // 必须明确指定排序字段 'delete' => 'deleted', 'enablecolumns' => ['disabled' => 'hidden'], ],
2. 强制控制器更新排序值
当仅调整已有关联项的排序时,Extbase可能不会自动触发中间表更新,需在updateAction中手动处理POST的排序数据:
public function updateAction(\Vendor\Bla\Domain\Model\Offer $offer) { $parsedBody = $this->request->getParsedBody(); $sortedTitleUids = $parsedBody['tx_bla']['offer']['offerTitle'] ?? []; if (!empty($sortedTitleUids)) { $connection = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( \TYPO3\CMS\Core\Database\ConnectionPool::class )->getConnectionForTable('tx_bla_blub_title_mm'); $offerUid = $offer->getUid(); foreach ($sortedTitleUids as $index => $titleUid) { $connection->update( 'tx_bla_blub_title_mm', ['sorting' => $index + 1], [ 'uid_local' => $offerUid, 'uid_foreign' => $titleUid ] ); } // 清除持久化缓存,确保读取最新排序 $this->persistenceManager->clearState(); } $this->offerRepository->update($offer); $this->redirect('list'); }
3. 确保Repository查询按排序字段返回
在OfferRepository中定义查询方法时,必须指定按中间表的排序字段排序:
public function findByUidWithSortedTitles($uid) { $query = $this->createQuery(); $query->matching($query->equals('uid', $uid)); $query->setOrderings([ 'offerTitle.sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING ]); return $query->execute()->getFirst(); }
4. 清理TYPO3缓存
缓存可能导致排序值未及时生效,执行以下操作:
- 后端点击“清除所有缓存”按钮
- 或使用命令行:
./typo3cms cache:flush
内容的提问来源于stack exchange,提问作者Gero Langheim
相关产品推荐
相关产品推荐

