Model view controller 用1:n关系扩展FE用户

Model view controller 用1:n关系扩展FE用户,model-view-controller,typo3,relationship,extbase,Model View Controller,Typo3,Relationship,Extbase,在我的扩展中,我扩展了FE用户模型。 除新属性(即昵称)外,每个FE用户还可以有多个开发条目。 所以我在表fe_用户和表tx_squad_domain_model_开发之间有一个1:n的关系 我用扩展生成器启动了扩展。 在后端,我可以将开发添加到FE用户,但在前端,我无法获得特定FE用户的开发。 错误消息是“在null上调用成员函数getDevelopments()。 出什么事了 我用的是打字3-8。分机的钥匙是小队。这是我的密码: ext_tables.sql: # # Table struc

在我的扩展中,我扩展了FE用户模型。 除新属性(即昵称)外,每个FE用户还可以有多个开发条目。 所以我在表fe_用户和表tx_squad_domain_model_开发之间有一个1:n的关系

我用扩展生成器启动了扩展。 在后端,我可以将开发添加到FE用户,但在前端,我无法获得特定FE用户的开发。 错误消息是“在null上调用成员函数getDevelopments()。 出什么事了

我用的是打字3-8。分机的钥匙是小队。这是我的密码:

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\u打字脚本\u 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;
    }
...
}
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
{
    }
namespace Vendor\Squad\Domain\Repository;

/**
 * The repository for FrontendUsers
 */
class FrontendUserRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
    }
Repository/FrontendUserRepository.php

namespace Vendor\Squad\Domain\Repository;
class DevelopmentRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
    }
namespace Vendor\Squad\Domain\Repository;

/**
 * The repository for FrontendUsers
 */
class FrontendUserRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
{
    }
模板/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();

。。。啊,当然。你当然是对的。谢谢你的帮助。