如何通过一个表单为多个模型对象设置值?

问题描述 投票:1回答:1

我使用TYPO3 7.6和extbase.我有模型 "Ticket","Answer "和 "Status"。

Ticket n:1 -> Status;
Ticket 1:n -> Answer;
Answer n:1 -> Ticket;
Status 1:n -> Ticket;

答案控制器

public function createAction(\Vendor\Extname\Domain\Model\Ticket $ticket, \Vendor\Extname\Domain\Model\Answer $newAnswer)
  {
      //Set tikcet and it's normaly
      $newAnswer->setTicket($ticket);
      // Try to set status and get error 
      $newAnswer->getTicket($ticket)->setStatus($status);
 }

在模板AnswerNew中

<f:form action="create" method="POST" enctype="multipart/form-data" name="newAnswer" controller="Answer" object="{newAnswer}" 
arguments="{ticket:ticket}">

      <f:form.select class="form-control" property="ticket.status" name="status" options="{status}" 
        optionLabelField="title" 
        optionValueField="uid"  />

    </f:form>

我得到

"PHP可捕获的致命错误,传给Domain/Model/Ticket::setStatus()的Argument 1必须是Domain/Model/Status的实例,给定为空"。传递给Domain/Model/Ticket::setStatus()的参数1必须是Domain/Model/Status的实例,给定为null"

如何通过一个表单设置多个模型对象的值?当我创建答案时,为票据设置状态。

typo3 extbase typo3-7.6.x
1个回答
0
投票

即使是这个问题也是相当古老的问题。

如果不同的对象类型共享同一个接口,你可以进行类型提示并将其作为参数。那么类型提示必须是关于接口的,而不是特定的对象或其他数据类型。

namespace Vendor\Extname\Domain\Model;

interface AnswerOrStatusInterface
{
    // can be empty or include common methods of both types
}

class answer implements \Vendor\Extname\Domain\Model\AnswerOrStatusInterface
{
    ...
}

class status implements \Vendor\Extname\Domain\Model\AnswerOrStatusInterface
{
    ...
}

还有控制器的另一个命名空间。

namespace Vendor\Extname\Controller;

class AnswerController
{
    public function createAction(
        \Vendor\Extname\Domain\Model\Ticket $ticket, 
        \Vendor\Extname\Domain\Model\AnswerOrStatusInterface $answerOrStatus
    ) {
        $answer = null;
        $status = null;
        if (is_a($answerOrStatus, \Vendor\Extname\Domain\Model\answer)) {
            $answer = $answerOrStatus;
        }
        elseif (is_a($answerOrStatus, \Vendor\Extname\Domain\Model\status)) {
            $status = $answerOrStatus;
        }
        // further logic
        ...
    }
 }

在PHP手册中你可以找到更多关于

从 PHP 7.4 开始,你仍然有更多的选择。

© www.soinside.com 2019 - 2024. All rights reserved.