我自己的域存储库扩展 TYPO3 7.6 的 FE 用户的调用不起作用



我在自己的扩展模型中有一个扩展 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.检查pid5 fe_users中是否存储了用户。

2.检查扩展typoscript是否已添加到template

3.进入安装工具,然后按clear cache button

4.在那里,在控制器中,您不使用CommunityManagerRepository,而是FrontendUserRepositoryextbase如果您使用CommunityManagerRepository,则可以通过第一步和第二步,因为在那里您将respectStorage设置为false

相关内容

  • 没有找到相关文章