【问题标题】:Render collection automatically in Symfony 2 using entity type form使用实体类型表单在 Symfony 2 中自动渲染集合
【发布时间】:2013-08-09 21:44:20
【问题描述】:

我有两个实体:产品和类别。 每个实体使用Symfony Form Builder 呈现一个自定义表单。

我正在尝试使用collection field type 在产品表单中包含类别表单。包含行如下所示:

$builder->add('idCategory', 'collection', array('type' => new CategoryType());

一切正常(根据Symfony documentation)。但我不想使用 JavaScript 创建表单,我希望在不更改树枝模板的情况下将其与表单的其余部分一起呈现:

<form action="{{ path('product_create') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <button type="submit">Create</button>
</form>

有可能吗?有什么想法吗?

【问题讨论】:

    标签: forms symfony collections entity twig


    【解决方案1】:

    您知道要在产品中包含的类别数量吗?

    【讨论】:

    • 没有。我的意思是,类别是动态创建并存储在数据库中的
    【解决方案2】:

    我找到了一种解决方法,因为不使用 JavaScript 似乎无法自动呈现表单。

    我没有使用{{ form_widget(form) }} 一次呈现整个表单,而是逐个字段呈现并使用{{ form_widget(form.categoy.vars.prototype) }} 呈现Category 集合。模板代码如下所示:

    <div id="form">
        {{ form_start(form) }}
        {{ form_errors(form) }}
        ... 
        {{ form_row(form.name) }}
        {{ form_row(form.price) }}
        ...
        <h2>Categories</h2>
        {{ form_row(form.idCategory) }}
        {{ form_widget(form.idCategoryNew.vars.prototype) }}
        ...
        <button type="submit">Create</button>
        {{ form_end(form) }}
    </div>
    

    产品类型:

    $builder
        ->add('name'))
        ->add('price'))
        ...
        ->add('idCategory', 'entity', array('class' => 'MyBundle\Entity\Category'))
        ->add('idCateogryNew', 'collection', array('type' => new CategoryType(), 'allow_add' => true))
        ...
    

    编辑:

    我找到了一个更好的解决方法,它包括将集合表单传递给 twig 模板。这种方式很容易处理表单提交后的post请求。如果有人想要代码,请询问:)

    编辑 2:

    根据@agapitocandemor 请求:

    在您的 MainEntityController(在我的例子中为 ProductController)中,搜索呈现表单的方法(在我的例子中为 newAction)并创建您要呈现的实体表单:

    public function newAction()
    {
        $entity = new Product();
        $entityform = $this->createForm(new ProductType(), $entity);
        $subentityform = $this->createForm(new CategoryType(), new Category);
    
        return $this->render('MyBundle:Product:new.html.twig', array(
            'entity' => $entity,
            'entityform' => $entityform->createView(),
            'subentityform' => $subentityform->createView()
        ));
    }
    

    最后,为了渲染subentityform,您只需从主实体的new 模板调用{{ form_widget(subentityform) }}

    【讨论】:

    • 你去。希望对你有用
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 2016-09-27
    • 1970-01-01
    • 2015-08-04
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多