TYPO3 Extbase : How to get disabled related Object, 没有原始 sql 查询?

标签 typo3 extbase

设想:

我有以下型号:
Domain-Model

ContactPerson 与 FrontendUser 有关系,并且是关系的拥有方。现在我有以下问题:
我正在根据处于事件状态的 ContactPersons 在任务中激活/停用 FrontendUsers。当 FrontendUser 被禁用或删除时,contactPerson->getFrontendUser() 的结果为 null,即使两个存储库都忽略了EnableFields:

    /** @var Typo3QuerySettings $querySettings */
    $querySettings = $this->objectManager->get(Typo3QuerySettings::class);
    $querySettings->setIgnoreEnableFields(true);
    $querySettings->setRespectStoragePage(false);
    $this->frontendUserRepository->setDefaultQuerySettings($querySettings);

    $debugContactPerson = $this->contactPersonRepository->findOneByContactPersonIdAndIncludeDeletedAndHidden('634');
    $debugFrontendUser = $this->frontendUserRepository->findOneByUid(7);
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
        array(
            '$debugContactPerson' => $debugContactPerson,
            '$debugFrontendUser' => $debugFrontendUser,
        )
    );

结果:DebugResult

附注:$this->frontendUserRepository->findByUid(7);也不起作用,因为它没有使用查询,但是 persistenceManager->getObjectByIdentifier(...这当然忽略了查询设置。

问题是,在我的真实代码中,我无法使用 findOneByUid(),因为我无法在 contact_person 的 frontend_user 字段中获取 integer-Value(uid)。

有什么方法可以在不使用原始查询来获取 contact_person-row 的情况下解决这个问题?

我的(是原始查询)解决方案:

因为我不想编写自己的 QueryFactory 并且我不想向我的 contactPerson 添加冗余字段,所以我现在用原始语句解决了它。也许它可以帮助有同样问题的人:
class FrontendUserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{
    /**
     * @param \Vendor\ExtKey\Domain\Model\ContactPerson $contactPerson
     * @return Object
     */
    public function findByContactPersonByRawQuery(ContactPerson $contactPerson){
        $query = $this->createQuery();

        $query->statement(
            "SELECT fe_users.* FROM fe_users" .
            " LEFT JOIN tx_extkey_domain_model_contactperson contact_person ON contact_person.frontend_user = fe_users.uid" .
            " WHERE contact_person.uid = " . $contactPerson->getUid()
        );
        return $query->execute()->getFirst();
    }

}

最佳答案

直接调用存储库
fe_users的enable字段有两个方面:

  • $querySettings->setIgnoreEnableFields(true);
  • $querySettings->setEnableFieldsToBeIgnored(['disable']);

  • 看看一些 overview in the wiki page - 它说的是 6.2,但它在大多数情况下对于 7.6 和 8 仍然有效。但是,这仅适用于直接调用存储库的情况,而不适用于作为另一个实体的一部分检索实体的情况 - 在这种情况下,存储库不用于嵌套实体。
    修改嵌套实体的查询设置
    隐式检索嵌套实体 - 这发生在 DataMapper::getPreparedQuery(DomainObjectInterface $parentObject, $propertyName) .要调整子实体的查询设置,QueryFactoryInterface实现必须重载。
    ext_localconf.php 中注册替代实现(将 \Vendor\ExtensionName\Persistence\Generic\QueryFactory 替换为您的扩展的真实类名):
    $extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
        \TYPO3\CMS\Extbase\Object\Container\Container::class
    );
    $extbaseObjectContainer->registerImplementation(
        \TYPO3\CMS\Extbase\Persistence\Generic\QueryFactoryInterface::class,
        \Vendor\ExtensionName\Persistence\Generic\QueryFactory::class
    );
    

    对于新的 Typo3 版本 (v8+),registerImplementation 方法不再适用于 QueryFactory。相反,一个 XCLASS必须用于覆盖/扩展类:
    $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Extbase\Persistence\Generic\QueryFactory::class] = [
        'className' => \Vendor\ExtensionName\Persistence\Generic\QueryFactory::class,
    ];
    

    然后在实现里面:
    <?php
    namespace \Vendor\ExtensionName\Persistence\Generic;
    use TYPO3\CMS\Extbase\Domain\Model\FrontendUser;
    
    class QueryFactory extends \TYPO3\CMS\Extbase\Persistence\Generic\QueryFactory {
        public function create($className) {
            $query = parent::create($className);
            if (is_a($className, FrontendUser::class, true)) {
                // @todo Find a way to configure that more generic
                $querySettings = $query->getQuerySettings();
                $querySettings->setIgnoreEnableFields(true);
                // ... whatever you need to adjust in addition ...
            }
            return $query;
        }
    }
    
    

    关于TYPO3 Extbase : How to get disabled related Object, 没有原始 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993664/

    相关文章:

    output - 流体动力 TYPO3 FLUX Fluidcontent - 前端没有输出?

    typo3 - 获取其他语言的 TYPO3 Extbase Repository 项目

    TYPO3 Extbase - 在单一 View 中更改浏览器页面标题

    typo3 - 如何在 typescript 中启用 showPermaLogin?

    typo3 - 从 TYPO3 v9 升级到 v10 后 : Show Pages no longer work (Cannot access protected property)

    typo3 - 如何调试我的命令 Controller ?

    TYPO3 - 将变量从 Fluid 传递到 cObject

    php - 在 Extbase 存储库中组合两个 QueryResults

    TYPO3 v10 RouteEnhancer 生成 slug 但无法解析它

    typo3 - 在插件中设置 extbase Controller Action