当前位置: 首页 > 知识库问答 >
问题:

使用Sonata字段类型在控制器中创建窗体

秦飞航
2023-03-14

在Symfony admin中,我有一个表单,其中第二个字段类型取决于所选的ChoiceField值。第二个字段可以是Symfony Url字段类型,也可以是sonata提供的sonata_type_model_list字段类型。

我已经向我的Bundle控制器创建了一个ajax请求,以返回表单,其中包含所需字段。

> /src/MyBundle/Controller/MyController.php

namespace MyBundle\Controller

use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Sonata\AdminBundle\Form\FormMapper;

class MyController extends CRUDController
{
    public function getFieldAction()
  {
    //getting the value of choice field
    $type = $this->get('request')->get('type'); 

    //sonata.admin.reference is a service name of ReferenceBundle admin class
        $fieldDescription = $this->admin->getModelManager()
         ->getNewFieldDescriptionInstance($this->admin->getClass(), 'reference');
        $fieldDescription->setAssociationAdmin($this->container->get('sonata.admin.reference'));
        $fieldDescription->setAdmin($this->admin);
        $fieldDescription->setAssociationMapping(array(
            'fieldName' => 'reference',
            'type' => ClassMetadataInfo::ONE_TO_MANY,
        ));
    
    // Getting form mapper in controller:
    $contractor = $this->container->get('sonata.admin.builder.orm_form');
    $mapper = new FormMapper($contractor, $this->admin->getFormBuilder(), $this->admin);

    $form_mapper = $mapper->add('reference', 'sonata_type_model_list', array(
            'translation_domain' => 'ReferenceBundle',
            'sonata_field_description' => $fieldDescription,
            'class' => $this->container->get('sonata.admin.reference')->getClass(),
            'model_manager' => $this->container->get('sonata.admin.reference')->getModelManager(),
            'label' => 'Reference',
            'required' => false,
        ));


    //@ToDo build $form from $form_mapper


    return $this->render('MyBundle:Form:field.view.html.twig', array(
        'form' => $form->createView(),
    ));
  }
}

我在Sonata\AdminBundle\Form\FormMapper类中找不到任何方法来构建表单(似乎可以使用create()方法,但它只适用于常见的Symfony字段类型,而不适用于Sonata表单字段类型,通常在块或管理类中生成)。

是否可以在Controller中使用Sonata\AdminBundle\Form\FormMapper来构建表单?或者还有其他方法可以在控制器中使用Sonata表单字段类型构建表单?

共有2个答案

顾宸
2023-03-14

看起来您可以访问管理员,该管理员直接处理使用Sonata\AdminBundle\Admin\AbstractAdmin::getForm构建表单

$form = $this->admin->getForm();
林修真
2023-03-14

您不应该使用控制器,而应该使用Sonata管理服务。

Sonata为您提供了“Sonata类型选择字段掩码”类型,允许您根据此“Sonata类型选择字段掩码”输入的值动态更改窗体上显示的字段。

这是一个文档,你可以在这里找到关于奏鸣曲类型和选择场掩码的所有信息。

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('reference', 'sonata_type_choice_field_mask', array(
            'choices' => array(
                //The list of available 'Reference' here
                'choice1',
                'choice2'
            ),
            'map' => array(
                //What you want to display depending of the selected option
                'choice1' => array(
                    // List of the fields displayed if choice 1 is selected
                    'field1', 'field3'
                ),
                'choice2' => array(
                    // List of the fields displayed if choice 2 is selected
                    'field2', 'field3'
                )
            ),
            'placeholder' => 'Choose an option',
            'required' => false
        ))
        ->add('field1', 'sonata_type_model_list', array(/* Options goes here */))
        ->add('field2', 'url', array(/* Options goes here */))
        ->add('field3')
    ;
}
 类似资料:
  • 控制器文件位置 /_ 分组目录(如 /app) |_ controllers |_ 在此文件夹内创建控制器 控制器文件命名 [ 只支持字母 + 数字 ] 控制器名称.php 控制器代码编写规范 自定义控制器必须继承 grace 基础控制器! <?php class 控制器名称Controller extends grace{ //方法定义 publ

  • 问题内容: 这是有关django的问题。我有一个模特说“汽车”。这将具有一些基本字段,例如“颜色”,“车辆所有者名称”,“车辆成本”。 我想提供一个表格,用户可以根据他要添加的汽车添加额外的字段。例如,如果用户添加“汽车”,则他将在运行时动态地在表单中添加其他字段,例如“汽车里程”,“校准制造商”。假设用户想要添加“卡车”,他将添加“可以运载的货物”,“许可证”等。 如何在Django中实现这一目

  • 是关于JavaFX的。当我想在Scene Builder中注入fx:id时,我会得到这样的警告: 在FXML控制器类中找不到id为'something'的可注入字段。 我想忽略它,并创建了一个函数,但它也不起作用。我创建了mainController类并将其添加到我的FXML文件中。以下是我的代码… MainController.java 我在我的旧项目中做了同样的事情,它们像一个魅力一样工作。但

  • 问题内容: 如何创建可从所有控制器访问的某种utils捆绑包? 我的主模块中有以下路由代码: 我想是可以通用的功能,和。 我应该如何在AngularJS中做到这一点? 问题答案: 用角度定义通用代码的方法是通过服务。 您将像这样定义一个新服务: 在您的控制器中,您将注入此服务。 只需将CommonCode用作控制器函数的参数即可。Angular会为您注入它(请阅读Dependency Inject

  • 问题 你想通过改变实例创建方式来实现单例、缓存或其他类似的特性。 解决方案 Python程序员都知道,如果你定义了一个类,就能像函数一样的调用它来创建实例,例如: class Spam: def __init__(self, name): self.name = name a = Spam('Guido') b = Spam('Diana') 如果你想自定义这个步骤,你可

  • 问题内容: 在我的应用程序中,我有几个带有许多选项的表单字段。我遇到的问题类似于此问题:在每次页面加载时获取和解析所有选项的成本很高(Twig一次又一次地渲染所有选项,而无法进行客户端缓存)。这个问题使我创造了一种通过AJAX将选项发送到浏览器的方法。相当简单的方法: 通过AJAX获取所有选项(键值)(例如,通过获取/countries.json),并在可能的情况下进行缓存。(在这种情况下,国名不

  • 我接管了一个web应用程序,它将web api和mvc控制器分为两个项目。Web Api网站有自己的基本Api url localhost:0000,mvc网站有localhost:1111。我正在生成一个通过电子邮件发送的点击链接,目的是让用户返回mvc网站上的注册页面。现在,我唯一的选择是从webApi控制器执行此操作,但是当我使用Url生成链接时。链接或Url。内容我总是得到WebApi l

  • 问题内容: 我正在参加的编程班上为我提供了一个项目,但我不知道从哪里开始,并希望有人可以将我推向正确的方向。我只发布项目的一部分,以便有人可以向我展示一些代码,以了解如何完成编程,因为我之前参加过编程课程,但是我没有实践。 创建一个具有以下类的名为Registrar的应用程序: 一个学生类,该类至少为学生存储以下数据字段: 名称 学生证号码 学分数 还应该提供以下方法: 初始化名称和ID字段的构造