TYPO3 8.7.x/Extbase:如何获取FlexForm选择树视图的值?
解决FlexForm中selectTree选中值仅返回数量的问题
看起来你遇到的问题是因为在FlexForm的selectTree配置里错误使用了<MM>字段,导致TYPO3返回的是关联记录的数量而非选中的UID列表。下面给你两种可行的解决方案:
方案一:修正FlexForm配置(推荐)
<MM>配置是用来在TCA中定义双向关联字段的,而FlexForm里的select字段根本不需要这个配置——它的选中值会直接存在pi_flexform字段中,完全没必要通过中间表关联。只要移除<MM>节点就能解决问题:
<settings.kategorien> <TCEforms> <exclude>1</exclude> <label>Kategorien</label> <config> <type>select</type> <renderType>selectTree</renderType> <foreign_table>tx_myext_domain_model_adresskategorie</foreign_table> <foreign_table_where>ORDER BY kategoriename ASC</foreign_table_where> <size>20</size> <treeConfig> <parentField>eltern</parentField> <appearance> <expandAll>1</expandAll> <showHeader>1</showHeader> </appearance> </treeConfig> <maxitems>1000</maxitems> </config> </TCEforms> </settings.kategorien>
修改后,在控制器里就能直接拿到选中的UID列表:
// 将逗号分隔的UID字符串转成数组 $selectedCategoryUids = explode(',', $this->settings['kategorien']); // 用Repository查询对应的分类对象(假设你已经注入了AdressKategorieRepository) $categories = $this->adressKategorieRepository->findByUidList($selectedCategoryUids);
如果你的Repository没有findByUidList方法,可以自己添加一个:
// 在 tx_myext_domain_repository_adresskategorieRepository.php 中 public function findByUidList(array $uids) { $query = $this->createQuery(); $query->matching( $query->in('uid', $uids) ); return $query->execute(); }
方案二:手动解析FlexForm XML(必须保留MM配置时使用)
如果你因为某些特殊原因必须保留<MM>配置,可以手动解析FlexForm的原始XML来获取选中的UID:
use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Service\FlexFormService; // 获取当前内容元素的FlexForm原始数据 $contentObject = $this->configurationManager->getContentObject(); $flexFormXml = $contentObject->data['pi_flexform']; // 将XML解析成数组格式 $flexFormService = GeneralUtility::makeInstance(FlexFormService::class); $flexFormData = $flexFormService->convertFlexFormContentToArray($flexFormXml); // 提取选中的UID数组 $selectedCategoryUids = explode(',', $flexFormData['settings']['kategorien']); // 后续查询逻辑和方案一一致 $categories = $this->adressKategorieRepository->findByUidList($selectedCategoryUids);
问题根源说明
当你在FlexForm的select字段中添加<MM>配置时,TYPO3会把它当成TCA里的双向关联字段处理,返回的是关联记录的计数,而不是你需要的选中UID。FlexForm本身不需要MM关联,因为它的选中值直接存在tt_content表的pi_flexform字段里,完全不需要中间表中转。
内容的提问来源于stack exchange,提问作者Ralf
相关产品推荐
相关产品推荐

