扩展 TYPO3 7.6 的 FE 用户的我自己的域存储库的调用不起作用
The calls of my own domain repository that extend FE user of TYPO3 7.6 don't work
我在自己的扩展模型中有一个 class,它扩展了 TYPO3 7.6 的 FE 用户调用 CommunityManager,我想使用存储库通用的调用,如 findByUid()
或 findAll()
但它们不起作用,return 的值为 Null
。
我一直在研究它,即使在这里有几个问题,但它仍然不起作用。我目前有以下设置
在我的 CommunityManagerController 中
/**
* communityManagerRepository
*
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $communityManagerRepository = null;
/**
* action list
*
* @return void
*/
public function listAction()
{
$this->communityManagerRepository = $this->objectManager->get('VENDOR\MyExt\Domain\Repository\CommunityManagerRepository');
$communityManagers = $this->communityManagerRepository->findAll();
$this->view->assign('communityManagers', $communityManagers);
}
CommunityManagerRepository
class CommunityManagerRepository extends TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
}
以及 Typoscript 代码
常数
plugin.tx_myext_nameofmyplugin {
persistence {
storagePid = 5
}
}
设置中
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager
}
}
VENDOR\MyExt\Domain\Model\CommunityManager {
mapping {
tableName = fe_users
recordType = Tx_MyExt_CommunityManager
}
}
}
}
}
非常感谢您指导我解决问题
首先,您正在使用注入注释加载类型为 \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
的存储库,但您在操作中使用 VENDOR\MyExt\Domain\Repository\CommunityManagerRepository
覆盖了它。您可以简单地在您的 communityManagerRepository-属性 的类型注释中添加您自己的存储库类名。
第二:不要使用注入注释。使用像这样的注入方法进行注入:
class CommunityManagerController extends TYPO3\CMS\Extbase\Mvc\Controller\ActionController{
/**
* The communityManagerRepository
*
* @var \VENDOR\MyExt\Domain\Model\CommunityManagerRepository
*/
protected $communityManagerRepository;
/**
* Inject the communityManagerRepository
*
* @param \VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository
*/
public function injectCommunityManagerRepository(\VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository){
$this->communityManagerRepository = $communityManagerRepository;
}
}
注入注释不好用。你可以在这里阅读,为什么是这样:https://gist.github.com/NamelessCoder/3b2e5931a6c1af19f9c3f8b46e74f837
现在您不需要与 objectManager 相关的行,因为注入方法会为您完成此操作。
最后,根据您的配置,communityManagerRepository 将 return 个类型为 \VENDOR\MyExt\Domain\Model\CommunityManager
的对象,但由于 $defaultQuerySettings->setRespectStoragePage(false);
,您的 storagePid 设置将被忽略。
无论如何,您现在应该获得系统中存在的所有 fe_users 记录,除非您在模型的持久性设置中为 fe_users 添加了新的记录类型(根据您的示例,您没有这样做) ).那么extbase只会return fe_users条正确记录类型的记录给你。
我假设 VENDOR 和 MyExt 在您的设置中是正确的,并且模型 CommunityManager 存在。
class CommunityManager extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}
class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}
在类似的情况下,我不得不使用子类和 recordType 稍微扩展一下设置:
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager
}
}
VENDOR\MyExt\Domain\Model\CommunityManager {
mapping {
tableName = fe_users
recordType = Tx_MyExt_CommunityManager
}
}
}
}
}
另见
这里有几点需要检查:
1.
检查 fe_users 和 pid
5 您是否存储了用户。
2. 检查扩展名 typoscript
是否添加到 template
.
3.进入安装工具然后按clear cache button
4. 在那里,在 Controller 中,你不使用 CommunityManagerRepository
但 FrontendUserRepository
来自 extbase
你可以先通过第二步,如果您使用 CommunityManagerRepository
,因为您将 respectStorage
设置为 false
。
我的回答可能为时已晚 post。但是我遇到了同样的问题,在调试 extbase 类 之后我找到了解决方案。
您的设置没问题;除了 1 个缺失变量 recordTypeColumnName(这应该是 fe_users table 记录中包含值 "Tx_MyExt_CommunityManager" 的字段)。
在我自己的解决方案中,我利用了 table 行中的 pid 列。据我所知,我的存储文件夹的 id,对于我所有的扩展记录将保持不变。
有两种方法可以设置 recordTypeColumnName 的值:
方法一:
在 TCA 中,在 ctrl 数组中设置类型。
$GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid';
方法二:
在 TypoScript 中 constants.txt
PID.myStorage = 5
在 TypoScript 中 setup.txt
plugin.tx_MyExt.persistence.storagePid = {$PID.myStorage}
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
{$PID.myStorage} = VENDOR\MyExt\Domain\Model\CommunityManager
}
recordTypeColumnName = pid
}
VENDOR\MyExt\Domain\Model\CommunityManager {
mapping {
tableName = fe_users
recordType = {$PID.myStorage}
}
}
}
}
}
我在自己的扩展模型中有一个 class,它扩展了 TYPO3 7.6 的 FE 用户调用 CommunityManager,我想使用存储库通用的调用,如 findByUid()
或 findAll()
但它们不起作用,return 的值为 Null
。
我一直在研究它,即使在这里有几个问题,但它仍然不起作用。我目前有以下设置
在我的 CommunityManagerController 中
/**
* communityManagerRepository
*
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $communityManagerRepository = null;
/**
* action list
*
* @return void
*/
public function listAction()
{
$this->communityManagerRepository = $this->objectManager->get('VENDOR\MyExt\Domain\Repository\CommunityManagerRepository');
$communityManagers = $this->communityManagerRepository->findAll();
$this->view->assign('communityManagers', $communityManagers);
}
CommunityManagerRepository
class CommunityManagerRepository extends TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{
public function initializeObject()
{
$defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$defaultQuerySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($defaultQuerySettings);
}
}
以及 Typoscript 代码
常数
plugin.tx_myext_nameofmyplugin {
persistence {
storagePid = 5
}
}
设置中
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager
}
}
VENDOR\MyExt\Domain\Model\CommunityManager {
mapping {
tableName = fe_users
recordType = Tx_MyExt_CommunityManager
}
}
}
}
}
非常感谢您指导我解决问题
首先,您正在使用注入注释加载类型为 \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
的存储库,但您在操作中使用 VENDOR\MyExt\Domain\Repository\CommunityManagerRepository
覆盖了它。您可以简单地在您的 communityManagerRepository-属性 的类型注释中添加您自己的存储库类名。
第二:不要使用注入注释。使用像这样的注入方法进行注入:
class CommunityManagerController extends TYPO3\CMS\Extbase\Mvc\Controller\ActionController{
/**
* The communityManagerRepository
*
* @var \VENDOR\MyExt\Domain\Model\CommunityManagerRepository
*/
protected $communityManagerRepository;
/**
* Inject the communityManagerRepository
*
* @param \VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository
*/
public function injectCommunityManagerRepository(\VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository){
$this->communityManagerRepository = $communityManagerRepository;
}
}
注入注释不好用。你可以在这里阅读,为什么是这样:https://gist.github.com/NamelessCoder/3b2e5931a6c1af19f9c3f8b46e74f837
现在您不需要与 objectManager 相关的行,因为注入方法会为您完成此操作。
最后,根据您的配置,communityManagerRepository 将 return 个类型为 \VENDOR\MyExt\Domain\Model\CommunityManager
的对象,但由于 $defaultQuerySettings->setRespectStoragePage(false);
,您的 storagePid 设置将被忽略。
无论如何,您现在应该获得系统中存在的所有 fe_users 记录,除非您在模型的持久性设置中为 fe_users 添加了新的记录类型(根据您的示例,您没有这样做) ).那么extbase只会return fe_users条正确记录类型的记录给你。
我假设 VENDOR 和 MyExt 在您的设置中是正确的,并且模型 CommunityManager 存在。
class CommunityManager extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}
class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}
在类似的情况下,我不得不使用子类和 recordType 稍微扩展一下设置:
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager
}
}
VENDOR\MyExt\Domain\Model\CommunityManager {
mapping {
tableName = fe_users
recordType = Tx_MyExt_CommunityManager
}
}
}
}
}
另见
这里有几点需要检查:
1.
检查 fe_users 和 pid
5 您是否存储了用户。
2. 检查扩展名 typoscript
是否添加到 template
.
3.进入安装工具然后按clear cache button
4. 在那里,在 Controller 中,你不使用 CommunityManagerRepository
但 FrontendUserRepository
来自 extbase
你可以先通过第二步,如果您使用 CommunityManagerRepository
,因为您将 respectStorage
设置为 false
。
我的回答可能为时已晚 post。但是我遇到了同样的问题,在调试 extbase 类 之后我找到了解决方案。
您的设置没问题;除了 1 个缺失变量 recordTypeColumnName(这应该是 fe_users table 记录中包含值 "Tx_MyExt_CommunityManager" 的字段)。
在我自己的解决方案中,我利用了 table 行中的 pid 列。据我所知,我的存储文件夹的 id,对于我所有的扩展记录将保持不变。
有两种方法可以设置 recordTypeColumnName 的值:
方法一:
在 TCA 中,在 ctrl 数组中设置类型。
$GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid';
方法二:
在 TypoScript 中 constants.txt
PID.myStorage = 5
在 TypoScript 中 setup.txt
plugin.tx_MyExt.persistence.storagePid = {$PID.myStorage}
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
{$PID.myStorage} = VENDOR\MyExt\Domain\Model\CommunityManager
}
recordTypeColumnName = pid
}
VENDOR\MyExt\Domain\Model\CommunityManager {
mapping {
tableName = fe_users
recordType = {$PID.myStorage}
}
}
}
}
}