使用 1:n 关系扩展 FE-Users
Extending FE-Users with 1:n relation
在我的扩展中,我扩展了 FE 用户模型。
除了新属性(即昵称)之外,每个 FE 用户都可以拥有多个开发条目。
所以我在 table fe_users 和 table tx_squad_domain_model_development.
之间有一个 1:n 关系
我使用扩展构建器启动了扩展。
在后端,我可以将开发添加到 FE-User,但在前端,我无法获得特定 FE-User 的开发。
错误消息是“调用成员函数 getDevelopments() on null”。
出了什么问题?
我用的是TYPO3 8,扩展键是squad。这是我的代码:
ext_tables.sql:
#
# Table structure for table 'fe_users'
#
CREATE TABLE fe_users (
...
nickname varchar(255) DEFAULT '' NOT NULL,
developments int(11) unsigned DEFAULT '0' NOT NULL,
tx_extbase_type varchar(255) DEFAULT '' NOT NULL,
...
);
#
# Table structure for table 'tx_squad_domain_model_development'
#
CREATE TABLE tx_squad_domain_model_development (
...
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
frontenduser int(11) unsigned DEFAULT '0' NOT NULL,
year varchar(255) DEFAULT '' NOT NULL,
...
);
TCA/Overrides/fe_users.php:
$tmp_squad_columns = [
...
'nickname' => [
'exclude' => true,
'label' => 'LLL:EXT:squad/Resources/Private/Language/locallang_db.xlf:tx_squad_domain_model_frontenduser.nickname',
'config' => [
'type' => 'input',
'size' => 30,
'eval' => 'trim'
],
],
'developments' => [
'exclude' => true,
'label' => 'LLL:EXT:squad/Resources/Private/Language/locallang_db.xlf:tx_squad_domain_model_frontenduser.developments',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_squad_domain_model_development',
'foreign_field' => 'frontenduser',
'maxitems' => 9999,
'appearance' => [
'collapseAll' => 0,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'showAllLocalizationLink' => 1
],
],
],
...
];
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users',$tmp_squad_columns);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
'fe_users',
'nickname, developments'
);
ext_typoscript_setup.txt
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
Tx_Squad_FrontendUser = Vendor\Squad\Domain\Model\FrontendUser
}
}
Vendor\Squad\Domain\Model\FrontendUser {
mapping {
tableName = fe_users
// Don't use recordType
recordType = 0
}
}
}
}
}
Model/FrontendUser.php
<?php
namespace Vendor\Squad\Domain\Model;
/**
* FrontendUser
*/
class FrontendUser extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
{
...
/**
* developments
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Squad\Domain\Model\Development>
* @cascade remove
*/
protected $developments = null;
/**
* __construct
*/
public function __construct()
{
//Do not remove the next line: It would break the functionality
$this->initStorageObjects();
}
/**
* Initializes all ObjectStorage properties
* Do not modify this method!
* It will be rewritten on each save in the extension builder
* You may modify the constructor of this class instead
*
* @return void
*/
protected function initStorageObjects()
{
$this->developments = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
...
/**
* Adds a Development
*
* @param Vendor\Squad\Domain\Model\Development $development
* @return void
*/
public function addDevelopment(\Vendor\Squad\Domain\Model\Development $development)
{
$this->developments->attach($development);
}
/**
* Removes a Development
*
* @param \Vendor\Squad\Domain\Model\Development $developmentToRemove The Development to be removed
* @return void
*/
public function removeDevelopment(\Vendor\Squad\Domain\Model\Development $developmentToRemove)
{
$this->developments->detach($developmentToRemove);
}
/**
* Returns the developments
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Squad\Domain\Model\Development> $developments
*/
public function getDevelopments()
{
return $this->developments;
}
/**
* Sets the developments
*
* @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Squad\Domain\Model\Development> $developments
* @return void
*/
public function setDevelopments(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $developments)
{
$this->developments = $developments;
}
...
}
Model/Development.php
namespace Vendor\Squad\Domain\Model;
/**
* Development
*/
class Development extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
/**
* year
*
* @var string
*/
protected $year = '';
/**
* Returns the year
*
* @return string $year
*/
public function getYear()
{
return $this->year;
}
/**
* Sets the year
*
* @param string $year
* @return void
*/
public function setYear($year)
{
$this->year = $year;
}
}
Controller/FrontendUserController.php
namespace Vendor\Squad\Controller;
/**
* FrontendUserController
*/
class FrontendUserController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
/**
* frontendUserRepository
*
* @var \Vendor\Squad\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $frontendUserRepository = null;
/**
* @var \Vendor\Squad\Domain\Repository\DevelopmentRepository
* @inject
*/
protected $developmentRepository;
/**
* action list
*
* @return void
*/
public function listAction()
{
$frontendUsers = $this->frontendUserRepository->findAll();
$this->view->assign('frontendUsers', $frontendUsers);
}
/**
* action show
*
* @param \Vendor\Squad\Domain\Model\FrontendUser $frontendUser
* @return void
*/
public function showAction(\Vendor\Squad\Domain\Model\FrontendUser $frontendUser)
{
$developments = $this->frontendUser->getDevelopments();
$this->view->assign('developments', $developments);
$this->view->assign('frontendUser', $frontendUser);
}
...
}
Repository/DevelopmentRepository.php
namespace Vendor\Squad\Domain\Repository;
class DevelopmentRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
}
Repository/FrontendUserRepository.php
namespace Vendor\Squad\Domain\Repository;
/**
* The repository for FrontendUsers
*/
class FrontendUserRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
}
Templates/FrontendUser/Show.html
...
<f:for each="{developments}" as="development">
<tr>
<td>{development.year}</td>
</tr>
</f:for>
...
删除控制器操作中的 $this->
。
您有 $developments = $this->frontendUser->getDevelopments();
,但没有 $this->frontendUser
。
当您为您的操作提供 $frontendUser
用户时,您需要使用此用户。 $this->frontendUser
当然是 null
.
所以:
将 showAction
的第一行更改为:
$developments = $frontendUser->getDevelopments();
在我的扩展中,我扩展了 FE 用户模型。 除了新属性(即昵称)之外,每个 FE 用户都可以拥有多个开发条目。 所以我在 table fe_users 和 table tx_squad_domain_model_development.
之间有一个 1:n 关系我使用扩展构建器启动了扩展。 在后端,我可以将开发添加到 FE-User,但在前端,我无法获得特定 FE-User 的开发。 错误消息是“调用成员函数 getDevelopments() on null”。 出了什么问题?
我用的是TYPO3 8,扩展键是squad。这是我的代码:
ext_tables.sql:
#
# Table structure for table 'fe_users'
#
CREATE TABLE fe_users (
...
nickname varchar(255) DEFAULT '' NOT NULL,
developments int(11) unsigned DEFAULT '0' NOT NULL,
tx_extbase_type varchar(255) DEFAULT '' NOT NULL,
...
);
#
# Table structure for table 'tx_squad_domain_model_development'
#
CREATE TABLE tx_squad_domain_model_development (
...
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
frontenduser int(11) unsigned DEFAULT '0' NOT NULL,
year varchar(255) DEFAULT '' NOT NULL,
...
);
TCA/Overrides/fe_users.php:
$tmp_squad_columns = [
...
'nickname' => [
'exclude' => true,
'label' => 'LLL:EXT:squad/Resources/Private/Language/locallang_db.xlf:tx_squad_domain_model_frontenduser.nickname',
'config' => [
'type' => 'input',
'size' => 30,
'eval' => 'trim'
],
],
'developments' => [
'exclude' => true,
'label' => 'LLL:EXT:squad/Resources/Private/Language/locallang_db.xlf:tx_squad_domain_model_frontenduser.developments',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_squad_domain_model_development',
'foreign_field' => 'frontenduser',
'maxitems' => 9999,
'appearance' => [
'collapseAll' => 0,
'levelLinksPosition' => 'top',
'showSynchronizationLink' => 1,
'showPossibleLocalizationRecords' => 1,
'showAllLocalizationLink' => 1
],
],
],
...
];
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users',$tmp_squad_columns);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
'fe_users',
'nickname, developments'
);
ext_typoscript_setup.txt
config.tx_extbase {
persistence {
classes {
TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
subclasses {
Tx_Squad_FrontendUser = Vendor\Squad\Domain\Model\FrontendUser
}
}
Vendor\Squad\Domain\Model\FrontendUser {
mapping {
tableName = fe_users
// Don't use recordType
recordType = 0
}
}
}
}
}
Model/FrontendUser.php
<?php
namespace Vendor\Squad\Domain\Model;
/**
* FrontendUser
*/
class FrontendUser extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
{
...
/**
* developments
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Squad\Domain\Model\Development>
* @cascade remove
*/
protected $developments = null;
/**
* __construct
*/
public function __construct()
{
//Do not remove the next line: It would break the functionality
$this->initStorageObjects();
}
/**
* Initializes all ObjectStorage properties
* Do not modify this method!
* It will be rewritten on each save in the extension builder
* You may modify the constructor of this class instead
*
* @return void
*/
protected function initStorageObjects()
{
$this->developments = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
...
/**
* Adds a Development
*
* @param Vendor\Squad\Domain\Model\Development $development
* @return void
*/
public function addDevelopment(\Vendor\Squad\Domain\Model\Development $development)
{
$this->developments->attach($development);
}
/**
* Removes a Development
*
* @param \Vendor\Squad\Domain\Model\Development $developmentToRemove The Development to be removed
* @return void
*/
public function removeDevelopment(\Vendor\Squad\Domain\Model\Development $developmentToRemove)
{
$this->developments->detach($developmentToRemove);
}
/**
* Returns the developments
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Squad\Domain\Model\Development> $developments
*/
public function getDevelopments()
{
return $this->developments;
}
/**
* Sets the developments
*
* @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Squad\Domain\Model\Development> $developments
* @return void
*/
public function setDevelopments(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $developments)
{
$this->developments = $developments;
}
...
}
Model/Development.php
namespace Vendor\Squad\Domain\Model;
/**
* Development
*/
class Development extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{
/**
* year
*
* @var string
*/
protected $year = '';
/**
* Returns the year
*
* @return string $year
*/
public function getYear()
{
return $this->year;
}
/**
* Sets the year
*
* @param string $year
* @return void
*/
public function setYear($year)
{
$this->year = $year;
}
}
Controller/FrontendUserController.php
namespace Vendor\Squad\Controller;
/**
* FrontendUserController
*/
class FrontendUserController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
/**
* frontendUserRepository
*
* @var \Vendor\Squad\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $frontendUserRepository = null;
/**
* @var \Vendor\Squad\Domain\Repository\DevelopmentRepository
* @inject
*/
protected $developmentRepository;
/**
* action list
*
* @return void
*/
public function listAction()
{
$frontendUsers = $this->frontendUserRepository->findAll();
$this->view->assign('frontendUsers', $frontendUsers);
}
/**
* action show
*
* @param \Vendor\Squad\Domain\Model\FrontendUser $frontendUser
* @return void
*/
public function showAction(\Vendor\Squad\Domain\Model\FrontendUser $frontendUser)
{
$developments = $this->frontendUser->getDevelopments();
$this->view->assign('developments', $developments);
$this->view->assign('frontendUser', $frontendUser);
}
...
}
Repository/DevelopmentRepository.php
namespace Vendor\Squad\Domain\Repository;
class DevelopmentRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
}
Repository/FrontendUserRepository.php
namespace Vendor\Squad\Domain\Repository;
/**
* The repository for FrontendUsers
*/
class FrontendUserRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
}
Templates/FrontendUser/Show.html
...
<f:for each="{developments}" as="development">
<tr>
<td>{development.year}</td>
</tr>
</f:for>
...
删除控制器操作中的 $this->
。
您有 $developments = $this->frontendUser->getDevelopments();
,但没有 $this->frontendUser
。
当您为您的操作提供 $frontendUser
用户时,您需要使用此用户。 $this->frontendUser
当然是 null
.
所以:
将 showAction
的第一行更改为:
$developments = $frontendUser->getDevelopments();