如何为自定义FormType创建表单树枝模板?

时间:2016-02-06 13:19:59

标签: php forms symfony twig symfony-forms

鉴于Symfony 2.8项目,我希望使用一种更复杂的类型,其中包含4个文本输入字段(原因是用户输入每周工作日的开放时间)。

我的问题:

如何定义具有多个表单元素的此类型的自定义树枝模板? symfony如何知道哪个模板属于哪种类型? 我阅读了docs,但它们与不合适的标签和名称不匹配。

到目前为止我做了什么:

我创建了以下类型:

/**
 * Class OpeningType
 */
class OpeningType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('from', 'text', [
            'label' => '',
            'attr' => ['placeholder' => '08:00']
        ]);
        $builder->add('until', 'text', [
            'label' => '',
            'attr' => ['placeholder' => '18:00']
        ]);
    }
}

第一次尝试时,我只在这里添加了两个文本字段。

该类型已注册为服务:

example.form.type.opening:
    class: Example\MainBundle\Form\Type\OpeningType
    tags:
        - { name: form.type }

...并以这种方式添加到主表单中:

        ->add('opening_monday', OpeningType::class, ['label' => 'Monday'])

如何将自定义窗口小部件用作此自定义类型的树枝模板?

2 个答案:

答案 0 :(得分:0)

以下是doc中为主题定制的链接: http://symfony.com/doc/current/cookbook/form/form_customization.html#how-to-customize-an-individual-fieldhttp://symfony.com/doc/current/cookbook/form/form_customization.html#twig

你可以“本地”做什么:

{# /views/Controller/action.html.twig #}

{% block _{ form prefix }_opening_monday_row %}

    {# customize theme here #}

{% endblock %}

{% form_theme form _self %}

...

{{ form_row(form.opening_monday) }}

默认情况下,前缀是表单名称'form'和字段名称,这里是'open_monday',您可以在表单构建器中自定义它:

$builder->add('opening_monday', OpeningType::class, ['label' => 'Monday', 'block_name' => 'custom_prefix'])

或全球app/config.yml

twig:
    form_themes:
        - form/custom_fields.html.twig

app/Resources/views/form/custom_fields.html.twig

{% block custom_type_name_raw %}
    {# customise "form_row" here #}
{% endblock %}

{% block custom_type_name_label %}
    {# customise "form_label" here #}
{% endblock %}

{% block custom_type_name_widget %}
    {# customise "form_widget" here #}
{% endblock %}

需要CustomFormType中的以下方法:

// Symfony 2.8+
public function getBlockPrefix()
{
    return "custom_type_name";
}

// before 2.7 included
public function getName()
{
    return "custom_type_name";
}

答案 1 :(得分:-1)

我可以自己回答:)

<强> 1。在config.yml中定义form_themes-template:

twig:
    form_themes:
        - form/fields.html.twig

<强> 2。使用以下内容创建上述文件:

{% block opening_widget %}
       {# write your form stuff here #}
{% endblock %}

块名是&#34; opening_widget&#34;因为&#34; OpeningType&#34;是类型的名称。它可以被getPrefixName(或类似的东西)的方法覆盖,但这不是问题。