从TYPO3 extbase中的一个控制器中的两个不同型号获取数据

Mem*_*pan 4 forms controller typo3 extbase

我是TYPO3上"新"MVC框架extbase的新手.

我正在尝试使用两个选择器创建一个简单的表单,一个用于"Schools",另一个用于"Programs".

我使用Extension Builder制作了两个模型,并且我能够列出各自列表模板中的所有学校和所有程序.

由于框架使用约定优于配置,我不知道如何构造一个能够从这两个模型获取数据并将它们传递给模板的Controller.

我想在模板中使用此代码:

<f:form name="form">
        <f:form.select name="form" options="{schools}" optionValueField="uid" optionLabelField="school" />
        <f:form.select name="form" options="{programs}" optionValueField="uid" optionLabelField="program" />
    </f:form>
Run Code Online (Sandbox Code Playgroud)

我的控制器骨架:

/**
 * action show
 *
 * @param \Vendor\Extension\Domain\Model\Form $form
 * @return void
 */
public function showAction(\Vendor\Extension\Domain\Model\Form $form) {

       // Some code        
       $this->view->assign('schools', $schools);

       // Some code
       $this->view->assign('programs', $programs);

}
Run Code Online (Sandbox Code Playgroud)

der*_*sen 12

学校和程序的所有记录都可以通过存储库访问,Extension Builder已经创建了您的存储库.

要在控制器中使用这两个存储库,必须使用依赖注入.从ExtBase 4.7开始,您只需使用@inject注释通过依赖注入注入对象.

将以下内容添加到您的控制器:

/**
 * School repository
 *
 * @var \Vendor\Extension\Domain\Repository\SchoolRepository
 * @inject
 */
 protected $schoolRepository;

/**
 * Program repository
 *
 * @var \Vendor\Extension\Domain\Repository\ProgramRepository
 * @inject
 */
 protected $programRepository;
Run Code Online (Sandbox Code Playgroud)

将两个存储库添加到控制器后,可以在操作中使用它们.

你的行动看起来像这样:

/**
 * action show
 *
 * @param \Vendor\Extension\Domain\Model\Form $form
 * @return void
 */
public function showAction(\Vendor\Extension\Domain\Model\Form $form) {
       $schools = $this->schoolRepository->findAll();
       $programs = $this->programRepository->findAll();

       $this->view->assign('schools', $schools);
       $this->view->assign('programs', $programs);
}
Run Code Online (Sandbox Code Playgroud)

现在,您的表单应显示两个选择框,其中包含来自school-programm-repository的所有记录.