繁体   English   中英

TYPO3 extbase:从FrontendUserGroupRepository获取一些信息

[英]TYPO3 extbase: get some from FrontendUserGroupRepository

在类文件中,我可以从不是我的另一个存储库中获取所有记录

$allUsergroups = $this->feGroupRepository->findAll();

如何使自定义函数以最正确的方式在这样的存储库中完成类似的事情?

// magic default function that takes a uid list (or array) as argument
$someUsergroups = $this->feGroupRepository->findSomeByUidList('2,4,6,8');

或者我可以使用我自己的自定义功能扩展现有存储库,在这种情况下,基于$query->in(list)

您可以在extensionRepository.php类中创建自己的方法

您可以使用 :

in($propertyName, $operand)

要么

contains($propertyName, $operand)

相反,in()和contains()中的方法接受多值数据类型作为参数(例如Array,ObjectStorage)。

看一下其他扩展程序是如何工作的。 (如tx_news扩展名)

或在此处阅读一些文档: https : //docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html

是的,您可以在TYPO3中扩展另一个类,而无需更改任何其他代码。 在ExtBase上下文中,它称为Dependency Injection

首先,创建一个新的存储库类your_ext/Classes/Domain/Repository/FrontendUserRepository.php并向其中添加以下内容:

<?php
namespace Tillebeck\YourExt\Domain\Repository;

class FrontendUserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository {
    /**
     * @param array $uidList
     * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface
     */
    public function findByUidList(Array $uidList)
    {
        $query = $this->createQuery();
        //$query->getQuerySettings()->setRespectStoragePage(false);
        $query->matching(
            $query->in('uid', $uidList)
        );
        return $query->execute();
    }

    /**
     * @return string
     */
    protected function getRepositoryClassName()
    {
        return get_parent_class($this);
    }
}

在这里,我们使用所需的参数$uidList实现了您的方法findByUidList ,该参数必须是数组。

由于存储库通过其自己的类名称来解析其模型名称,因此我们需要更改方法getRepositoryClassName以返回父类名称,在本例中为TYPO3\\CMS\\Extbase\\Domain\\Repository\\FrontendUserRepository

但是,仅此一项是行不通的。 我们需要告诉ExtBase,每次我们通过PHPDocBlock批注@injectobjectManager->get注入或初始化TYPO3\\CMS\\Extbase\\Domain\\Repository\\FrontendUserRepository ,我们真的想初始化我们的新存储库。 这是在TypoScript中完成的。

config.tx_extbase.objects {
    TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository {
        className = Tillebeck\YourExt\Domain\Repository\FrontendUserRepository
    }
}

您还可以通过将config.tx_extbase替换为plugin.tx_yourext来将更改仅限于自己的扩展名。

最后一步:清除所有缓存,并可能删除typo3temp目录中的所有文件。

现在,在您的控制器(或其他类)中,您可以在下面的代码下运行。

$uidList = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', '2,4,6,8', true);
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
    $this->frontendUserRepository->findByUidList($uidList)
);

我已经在TYPO3 7.6中测试了上述解决方案,并且可以正常工作。 从6.1版开始就存在Dependency Injection

按照我的定义,这是按照您的要求在您自己的TYPO3扩展中实现此功能的必须正确的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM