我在自己的扩展模型中有一个扩展 TYPO3 7.6 的 FE 用户的类调用 CommunityManager,我想使用存储库常见的调用,如findByUid()
或findAll()
,但它们不起作用,返回值是Null
。
我一直在研究它,即使在这里的几个问题中,但它仍然不起作用。我目前有以下设置
在我的社区管理器控制器中
/**
* communityManagerRepository
*
* @var TYPO3CMSExtbaseDomainRepositoryFrontendUserRepository
* @inject
*/
protected $communityManagerRepository = null;
/**
* action list
*
* @return void
*/
public function listAction()
{
$this->communityManagerRepository = $this->objectManager->get('VENDORMyExtDomainRepositoryCommunityManagerRepository');
$communityManagers = $this->communityManagerRepository->findAll();
$this->view->assign('communityManagers', $communityManagers);
}
社区管理器存储库
class CommunityManagerRepository extends TYPO3CMSExtbaseDomainRepositoryFrontendUserRepository
{
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(TYPO3CMSExtbasePersistenceGenericTypo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
}
和排版代码
在常量中
plugin.tx_myext_nameofmyplugin {
persistence {
storagePid = 5
}
}
设置中
config.tx_extbase {
persistence {
classes {
TYPO3CMSExtbaseDomainModelFrontendUser {
subclasses {
Tx_MyExt_CommunityManager = VENDORMyExtDomainModelCommunityManager
}
}
VENDORMyExtDomainModelCommunityManager {
mapping {
tableName = fe_users
recordType = Tx_MyExt_CommunityManager
}
}
}
}
}
感谢您指导我解决问题
我假设供应商和MyExt在您的设置中是正确的,并且模型社区经理存在。
class CommunityManager extends TYPO3CMSExtbaseDomainModelFrontendUser {
}
class CommunityManagerRepository extends TYPO3CMSExtbasePersistenceRepository {
}
在类似的情况下,我不得不使用子类和 recordType 稍微扩展设置:
config.tx_extbase {
persistence {
classes {
TYPO3CMSExtbaseDomainModelFrontendUser {
subclasses {
Tx_MyExt_CommunityManager = VENDORMyExtDomainModelCommunityManager
}
}
VENDORMyExtDomainModelCommunityManager {
mapping {
tableName = fe_users
recordType = Tx_MyExt_CommunityManager
}
}
}
}
}
另请参阅 https://stackoverflow.com/a/22374970/7896428
首先,您使用注入注释来加载类型为TYPO3CMSExtbaseDomainRepositoryFrontendUserRepository
的存储库,但您在操作中用VENDORMyExtDomainRepositoryCommunityManagerRepository
覆盖了它。您可以简单地在 communityManagerRepository-property 的类型注释中添加自己的存储库类名。 第二:不要使用注入注释。使用这样的注射方法进行注射:
class CommunityManagerController extends TYPO3CMSExtbaseMvcControllerActionController{
/**
* The communityManagerRepository
*
* @var VENDORMyExtDomainModelCommunityManagerRepository
*/
protected $communityManagerRepository;
/**
* Inject the communityManagerRepository
*
* @param VENDORMyExtDomainModelCommunityManagerRepository $communityManagerRepository
*/
public function injectCommunityManagerRepository(VENDORMyExtDomainModelCommunityManagerRepository $communityManagerRepository){
$this->communityManagerRepository = $communityManagerRepository;
}
}
注入注释不好使用。你可以在这里阅读,为什么是:https://gist.github.com/NamelessCoder/3b2e5931a6c1af19f9c3f8b46e74f837
现在你不需要带有对象管理器的行,因为 inject-method 会为你做到这一点。
最后,根据您的配置,社区管理器存储库将返回VENDORMyExtDomainModelCommunityManager
类型的对象,但您的 storagePid 设置会因为$defaultQuerySettings->setRespectStoragePage(false);
而被忽略。 无论如何,您现在应该获取系统中存在的所有fe_users记录,除非您在模型的持久性设置中为fe_users添加了新的 recordType(根据您的示例,您没有这样做)。然后extbase只会将正确记录类型的fe_users记录返回给您。
对于这篇文章来说,我的回答可能为时已晚。但是我遇到了同样的问题,在调试extbase类后,我找到了解决方案。
您的设置很好;除了 1 个缺少的变量recordTypeColumnName(这应该是包含值"Tx_MyExt_CommunityManager"fe_users表的记录中的字段)。
在我自己的解决方案中,我利用了表格行中的pid列。正如我知道我的存储文件夹的 id,它将为扩展名中的所有记录保持不变。
有两种方法可以设置记录类型列名称的值:
方法一:
在 TCA 中,在 ctrl 数组中键入。
$GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid';
方法2:
在 TypoScript 常量中.txt
PID.myStorage = 5
在 TypoScript 设置中.txt
plugin.tx_MyExt.persistence.storagePid = {$PID.myStorage}
config.tx_extbase {
persistence {
classes {
TYPO3CMSExtbaseDomainModelFrontendUser {
subclasses {
{$PID.myStorage} = VENDORMyExtDomainModelCommunityManager
}
recordTypeColumnName = pid
}
VENDORMyExtDomainModelCommunityManager {
mapping {
tableName = fe_users
recordType = {$PID.myStorage}
}
}
}
}
}
这里有几点需要检查:
1.检查pid
5 fe_users中是否存储了用户。
2.检查扩展typoscript
是否已添加到template
。
3.进入安装工具,然后按clear cache button
4.在那里,在控制器中,您不使用CommunityManagerRepository
,而是FrontendUserRepository
extbase
如果您使用CommunityManagerRepository
,则可以通过第一步和第二步,因为在那里您将respectStorage
设置为false
。