[英]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批注@inject
或objectManager->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.