簡體   English   中英

TYPO3 Extbase:如何獲取禁用相關的Object,沒有原始的sql-query?

[英]TYPO3 Extbase: How to get disabled related Object, without raw sql-query?

場景:

我有以下型號: 域的模型

ContactPerson與FrontendUser有關系,是關系的擁有方。 現在我有以下問題:
我正在基於活動的ContactPersons激活/停用任務中的FrontendUsers。 當FrontendUser被禁用或刪除時,contactPerson-> getFrontendUser()的結果為null,即使兩個存儲庫都是ignoreEnableFields:

    /** @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

Ps: $this->frontendUserRepository->findByUid(7); 也不起作用,因為它沒有使用查詢,而是persistenceManager->getObjectByIdentifier(...當然忽略了查詢設置。

問題是,在我的實際代碼中我不能使用findOneByUid(),因為我無法在contact_person的frontend_user字段中獲取整數值(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的啟用字段有兩個方面:

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

看看維基頁面中的一些概述 - 它說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
);

然后在實現中:

<?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;
    }
}

我對這個問題的解決方案是禁用TCA定義中的“enablecolumns”並自己在存儲庫中處理它。 這里是一個findAll方法的例子:

public function findAll($ignoreEnableFields = false) {
    $query = $this->createQuery();
    if (!$ignoreEnableFields) {
        $currTime = time();
        $query->matching(
            $query->logicalAnd(
                $query->equals("hidden", 0),
                $query->logicalOr(
                    $query->equals("starttime", 0),
                    $query->lessThanOrEqual("starttime", $currTime)
                ),
                $query->logicalOr(
                    $query->equals("endtime", 0),
                    $query->greaterThanOrEqual("endtime", $currTime)
                )
            )
        );
    }
    return $query->execute();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM