You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:14:30