Symfony 2仅覆盖特定的表单输入

时间:2014-01-28 20:16:42

标签: php symfony twig

我想覆盖我的Symfony表单的特定元素,同时允许我的标准模板生成其余字段。到目前为止,这是一个/或。

首先,我的模板生成表单元素

<form action="" method="post" {{ form_enctype(form) }} autocomplete="off">
    {% form_theme form 'SuperSecretProjectBundle:Default:collection.html.twig' %}
    {{ form_widget(form) }}

    <input type="submit" class="right submit button primary small" value="Save" />
</form>

在collection.html.twig中,我有以下块:form_row是通用小部件渲染器,而image_sets_row是我想要覆盖的特定行。

{% block form_row %}
    <div class="row">
        <div class="large-12 columns{% if not form.vars.valid %}error{% endif %}">
            {{ form_label(form) }}
            {{ form_widget(form) }}
            <small>{{ form_errors(form) }}</small>
        </div>
    </div>
{% endblock form_row %}

{% block image_sets_row %}
    <div id="image_sets">
        <div class="row">
            <div class="columns large-12">
                <a href="#" id="add-image-set" class="button medium secondary right">Add image set</a>
            </div>
        </div>
    </div>
{% endblock %}

这会导致对所有字段使用form_row,而不使用我修改过的块。如何让Symfony输出未被特别覆盖的元素并包含我的新块?

1 个答案:

答案 0 :(得分:0)

对于您尝试使用自定义窗口小部件的字段,您需要的是custom field type

如链接所示,首先需要创建一个自定义Field Type类,如此

// src/AppBundle/Form/Type/ImageSetsType.php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; #should change to whatever parent type you need

class ImageSetsType extends AbstractType{
    public function configureOptions(OptionsResolver $resolver){
        $resolver->setDefaults( array() ); #set any option defaults you need here
    }

    public function getParent(){
        return ChoiceType::class; #again change this to whatever parent type you need
    }
}

接下来,我们让您的模块正常运行

{# app/Resources/views/form/fields.html.twig #}

{% block imagesets_widget %}
    <div id="image_sets">
        <div class="row">
            <div class="columns large-12">
                {{ form_label(form) }}
                {{ form_widget(child) }}
                <a href="#" id="add-image-set" class="button medium secondary right">Add image set</a>
                <small>{{ form_errors(form) }}</small>
            </div>
        </div>
    </div>
{% endblock %}

然后您在表单中使用新创建的类型,就像使用其他任何类型一样。

我认为你想要更多一点