首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过一个表单为多个模型对象设置值?

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

Stack Overflow用户
提问于 2016-04-29 18:40:27
回答 1查看 340关注 0票数 2

我使用的是TYPO3 7.6和extbase。我有模型“工单”、“答案”和“状态”。

代码语言:javascript
复制
Ticket n:1 -> Status;
Ticket 1:n -> Answer;
Answer n:1 -> Ticket;
Status 1:n -> Ticket;

在应答控制器中

代码语言:javascript
复制
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);
 }

在模板答案/新建中

代码语言:javascript
复制
<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()的参数1必须是Domain\Model\Status的实例,给定的值为null

如何通过一个表单为多个模型对象设置值?在创建应答时设置工单的状态。

EN

回答 1

Stack Overflow用户

发布于 2020-04-24 05:05:29

甚至这个问题也是相当古老的:

如果不同的对象类型共享相同的接口,则可以输入提示并将它们指定为参数。那么类型提示必须是关于接口的,而不是关于特定对象或其他数据类型的:

代码语言:javascript
复制
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
{
    ...
}

控制器的另一个命名空间:

代码语言:javascript
复制
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开始,您仍然有更多的选择:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36936169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档