我自己的域存储库的调用扩展了TYPO3 7.6 don';行不通
我在自己扩展的模型中有一个类,它扩展了TYPO3 7.6的FE用户call CommunityManager,我想使用存储库的公共调用,如我自己的域存储库的调用扩展了TYPO3 7.6 don';行不通,typo3,typoscript,extbase,typo3-7.6.x,Typo3,Typoscript,Extbase,Typo3 7.6.x,我在自己扩展的模型中有一个类,它扩展了TYPO3 7.6的FE用户call CommunityManager,我想使用存储库的公共调用,如findByUid()或findAll(),但它们不起作用,返回值为Null 我一直在研究它,甚至在这里的几个问题,但它仍然不起作用。我目前有以下设置 在我的社区管理控制器中 /** * communityManagerRepository * * @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUse
findByUid()
或findAll()
,但它们不起作用,返回值为Null
我一直在研究它,甚至在这里的几个问题,但它仍然不起作用。我目前有以下设置
在我的社区管理控制器中
/**
* 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);
}
社区管理机构
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);
}
}
还有打字代码
不变
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
}
}
}
}
}
我希望您能指导我解决这个问题首先,您正在使用inject注释加载类型为
\TYPO3\CMS\Extbase\Domain\repository\FrontendUserRepository
的存储库,但您在操作中使用供应商\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;
}
}
inject注释不适合使用。你可以在这里阅读,为什么是:
现在您不需要objectManager的代码行,因为inject方法可以为您完成这项工作
最后,根据您的配置,communityManagerRepository将返回\VENDOR\MyExt\Domain\Model\CommunityManager
类型的对象,但是由于$defaultQuerySettings->setreservestagepage(false),您的storagePid设置将被忽略代码>。
无论如何,您现在应该获得系统中存在的所有fe_用户记录,除非您在模型的持久性设置中为fe_用户添加了新的记录类型(根据您的示例,您没有添加)。然后extbase将只向您返回正确记录类型的fe_用户记录。首先,您正在使用注入注释加载类型为\TYPO3\CMS\extbase\Domain\repository\FrontendUserRepository的存储库,但您可以在操作中使用供应商\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;
}
}
inject注释不适合使用。你可以在这里阅读,为什么是:
现在您不需要objectManager的代码行,因为inject方法可以为您完成这项工作
最后,根据您的配置,communityManagerRepository将返回\VENDOR\MyExt\Domain\Model\CommunityManager
类型的对象,但是由于$defaultQuerySettings->setreservestagepage(false),您的storagePid设置将被忽略代码>。
无论如何,您现在应该获得系统中存在的所有fe_用户记录,除非您在模型的持久性设置中为fe_用户添加了新的记录类型(根据您的示例,您没有添加)。然后extbase将只向您返回正确记录类型的fe_用户记录。我假设供应商和MyExt在您的设置中是正确的,并且模型CommunityManager存在
class CommunityManager extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}
class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}
在类似的情况下,我必须使用子类和记录类型稍微扩展设置:
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
}
}
}
}
}
另请参见我假设供应商和MyText在您的设置中是正确的,并且模型CommunityManager存在
class CommunityManager extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}
class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}
在类似的情况下,我必须使用子类和记录类型稍微扩展设置:
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.
检查在具有pid
5的fe_用户中是否存储了用户
2.检查扩展名typoscript
是否添加到模板中
3.进入安装工具并按清除缓存按钮
4.在控制器中,您不使用CommunityManagerRepository
,但是extbase
中的FrontendUserRepository
如果您使用CommunityManagerRepository
,您可以通过第一步和第二步,因为在这里您将respectStorage
设置为false
需要检查的点很少此处:
1.
检查在具有pid
5的fe_用户中是否存储了用户
2.检查扩展名typoscript
是否添加到模板中
3.进入安装工具并按清除缓存按钮
4.在控制器中,您不使用CommunityManagerRepository
,但是extbase
中的FrontendUserRepository
如果您使用CommunityManagerRepository
,您可以通过第一步和第二步,因为在这里您将respectStorage
设置为false
,我的答案对于这篇文章来说可能太晚了。但我遇到了同样的问题,在调试extbase类之后,我找到了解决方案
你的设置很好;除了1个缺少的变量recordTypeColumnName(这应该是fe_users表记录中包含值“Tx_MyExt_CommunityManager”的字段)
在我自己的解决方案中,我利用了表行中的pid列。正如我所知,我的存储文件夹的id对于扩展中的所有记录都将保持不变
有两种方法可以设置recordTypeColumnName的值:
方法1:
在TCA中,在ctrl数组中键入集合
$GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid';
方法2:
在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}
}
}
}
}
}
我的回答对这篇文章来说可能太晚了。但我遇到了同样的问题,在调试extbase类之后,我找到了解决方案
你的设置很好;除了1个缺少的变量