【问题标题】:Symfony: Get FormType Name From VariableSymfony:从变量中获取 FormType 名称
【发布时间】:2019-11-30 08:13:28
【问题描述】:

在我的项目中,当我更改选择时,ajax 调用会获取一个新的选择元素并将其替换为我当前的选择元素。 See page for reference.

所以基本上,我的 Ajax 调用 /ticket/owner-select 来获取所有者选项。一切正常。

这是我的 url 控制器:

//TicketController.php

...

/**
 * @Route("/ticket/owner-select", name="app_ticket_owner_select", methods={"GET"}, condition="request.isXmlHttpRequest()")
 */
public function getTicketOwnerSelect(Request $request, DepartmentRepository $departmentRepository)
{
    $department = $departmentRepository->findOneBy(['id' => $request->query->get('value')]); //gets id from get-parameter

    if(!$department) {
        return new Response(null, 204); //return empty response if no department selected or found
    }

    $ticket = new Ticket();
    $ticket->setDepartment($department);
    $form = $this->createForm(TicketType::class, $ticket);

    if(!$form->has('owner')) {
        return new Response(null, 204); //return empty response
    }

    return $this->render('ticket/select.html.twig', ['form' => $form->createView()]); //render the select element with correct options
}

...

现在我想为 other FormTypes 重复使用完全相同的 url,因为我有多个表单,其中所有者根据另一个选择字段而变化。

例子:

$form = $this->createForm(TicketType::class, $ticket);
$form = $this->createForm(AnotherTicketType::class, $ticket);
$form = $this->createForm(AnotherAnotherTicketType::class, $ticket);

所以 FormType 应该是动态的。可能最好的方法是另一个 get 参数,但我不太确定如何做到这一点,尤其是检查该类型是否存在(错误处理)。

原因:对于每个工单表单上的每个选择字段,控制器看起来都一样。由于我不想重复代码(大部分),我想创建一个动态解决方案。

也许有人可以帮助我。 提前致谢。

【问题讨论】:

    标签: php forms symfony dynamic


    【解决方案1】:

    您已经通过 ajax 请求中的查询字符串(id 参数)将参数传递给控制器​​,所以我假设您知道如何添加新参数,比如type

    由于::class 只返回一个带有完全限定类名的字符串,您可以使用这个新参数来构建您的FormType 类并正常实例化它。如果请求的类型不存在,createForm 将抛出 InvalidArgumentException

    $ticketType = $request->query->get('type', ''); // Set 'main' type if not specified
    $ticketFormType = 'App\Form\' . $ticketType . 'TicketType';
    
    $ticket = new Ticket();
    
    try {
        $form = $this->createForm(TicketType::class, $ticket);
    } catch (Symfony\Component\Form\Exception\InvalidArgumentException $e) {
         // FormType doesn't exist
         return new Response(null, 400);
    }
    
    return $this->render('ticket/select.html.twig', ['form' => $form->createView()]);
    

    【讨论】:

      【解决方案2】:

      带有类型的隐藏字段呢?

      【讨论】:

      • 感谢您的回复。你到底是什么意思?也许你可以给我例子=)谢谢
      猜你喜欢
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 2019-08-14
      • 2016-05-14
      • 2012-12-31
      相关资源
      最近更新 更多