TYPO3 9.5 中的 enablecolumns 和 QueryBuilder

enablecolumns and QueryBuilder in TYPO3 9.5

我对 TYPO3 9.5 中的 enablecolumns 和 QueryBuilder 有疑问:

在 TCA 中,我定义了启用列:

    'ctrl' => [
      'title'       => '....'
      'tstamp'          => 'tstamp',
      'crdate'          => 'crdate',
      'versioningWS'        => 2,
      'versioning_followPages'  => true,
      'origUid'             => 't3_origuid',
      'languageField'   => 'sys_language_uid',
      'transOrigPointerField'   => 'l18n_parent',
      'transOrigDiffSourceField'    => 'l18n_diffsource',
      'delete'          => 'deleted',
      'enablecolumns' => [
        'disabled' => 'hidden',
        'fe_group' => 'fe_group',
      ],
    ]

在存储库中我创建了一个自定义查询:

    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_myext_domain_model_table'); 
    $result = $queryBuilder
      ->select('*')
      ->from('tx_myext_domain_model_table')
      ->where($where)
      ->execute();

如果我用

调试SQL
$queryBuilder->getSQL();

我看到删除和隐藏的条件但没有fe_group

如果我加上

$queryBuilder
->getRestrictions()
->removeAll()
->add(GeneralUtility::makeInstance(FrontendGroupRestriction::class))
->add(GeneralUtility::makeInstance(DeletedRestriction::class))
->add(GeneralUtility::makeInstance(HiddenRestriction::class));

在执行查询之前,添加了 fe_groups 条件。

我错过了什么?

谢谢 克里斯蒂安

这是因为 QueryBuilder 默认使用 DefaultRestrictionContainer 仅添加以下限制:

protected $defaultRestrictionTypes = [
    DeletedRestriction::class,
    HiddenRestriction::class,
    StartTimeRestriction::class,
    EndTimeRestriction::class
];

参考文献:

您可能正在寻找的是使用以下默认限制的 FrontendRestrictionContainer

protected $defaultRestrictionTypes = [
    DeletedRestriction::class,
    FrontendWorkspaceRestriction::class,
    HiddenRestriction::class,
    StartTimeRestriction::class,
    EndTimeRestriction::class,
    FrontendGroupRestriction::class,
];

参考:https://github.com/TYPO3/TYPO3.CMS/blob/9.5/typo3/sysext/core/Classes/Database/Query/Restriction/FrontendRestrictionContainer.php#L33-L40

一种可能的解决方案是使用此容器而不是默认容器:

$container = GeneralUtility::makeInstance(FrontendRestrictionContainer::class);
$queryBuilder->setRestrictions($container);