首頁 >後端開發 >php教程 >请问个关于表单渲染的问题,希望能解答一下,谢谢

请问个关于表单渲染的问题,希望能解答一下,谢谢

WBOY
WBOY原創
2016-06-06 20:43:291106瀏覽

请问使用form_widget()渲染表单
我使用form_widget(form.name)
大概渲染出来的input如下

这个时候,因为我有自带的css样式
对于像bootstrap 这种完整的后台模版,如果使用在外面加一个div 来做class的话
量太大了
请问我怎么才能重写这个form_widget 渲染出来的 attr
我看了vendor 里的form_div_layout.html.twig 这个页面里的
widget_attributes 这个block
但是我不可能去修改这个把,请给一个办法,谢谢

回复内容:

请问使用form_widget()渲染表单
我使用form_widget(form.name)
大概渲染出来的input如下

这个时候,因为我有自带的css样式
对于像bootstrap 这种完整的后台模版,如果使用在外面加一个div 来做class的话
量太大了
请问我怎么才能重写这个form_widget 渲染出来的 attr
我看了vendor 里的form_div_layout.html.twig 这个页面里的
widget_attributes 这个block
但是我不可能去修改这个把,请给一个办法,谢谢

可以使用 form_theme
详细参考 How to Customize Form Rendering
可以渲染自己的form_div_layout.html.twig
考虑到你的前台和后台css主题不一样 给你一种方案 使用 compass 来修改不同bundle内的 form_div_layout.html.twig:
比如AcmeDemoBundle 在你的Acme\Bundle\DemoBundle\DependencyInjection\Compiler ( 创建目录 Compiler )目录下创建 TwigFormPass.php :

<code><?php namespace Acme\Bundle\DemoBundle\DependencyInjection\Compiler;


use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class TwigFormPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $resources = $container->getParameter('twig.form.resources');
        $resources[] = 'StoreBackendBundle::form/form_div_layouts.html.twig';

        $container->setParameter( 'twig.form.resources' , $resources );
    }
}
</code>

$resources[] = 'AcmeDemoBundle::form/form_div_layouts.html.twig';
这一行给你的TwigExtension更新了form_div_layout.html.twig
这样你在bundle中渲染的form_widget都会来自于
Acme\Bundle\DemoBundle\Resources\views\form\form_div_layouts.html.twig
然后添加CompilerPass :
在你的
Acme\Bundle\DemoBundle\AcmeDemoBundle.php中加入 build(ContainerBuilder $builder)方法使compiler生效:

<code><?php namespace Acme\Bundle\DemoBundle;

use Acme\Bundle\DemoBundle\DependencyInjection\Compiler\MenuRenderPass;
use Acme\Bundle\DemoBundle\DependencyInjection\Compiler\TwigFormPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;


class StoreBackendBundle extends Bundle
{

    public function build( ContainerBuilder $container)
    {

        $container->addCompilerPass( new TwigFormPass() );
        //add more compiler ... 

    }
}
</code>

最后创建form_theme:
Acme\Bundle\DemoBundle\Resources\views\form\form_div_layouts.html.twig 里面包含了一些form_widget跟form_row , widget attribute视情况加 :

<code>{% block form_row -%}


<div class="form-group">
        {{- form_errors(form) -}}
        <label for="">{{- form_label(form) -}}</label>
        {{- form_widget(form) -}}
    </div>


{%- endblock form_row %}

{% block submit_widget -%}
    {% set type = type|default('submit') %}
    {{- block('button_widget') -}}
{%- endblock submit_widget %}

{% block button_widget -%}
    {% if label is empty -%}
        {% set label = name|humanize %}
    {%- endif -%}
    <button block class="btn btn-primary" type="{{ type|default('button') }}">{{ label|trans({}, translation_domain) }}</button>
{%- endblock button_widget %}

{% block form_widget_simple -%}

    {% set type = type|default('text') -%}
    <input block class="form-control" type="{{ type }}" if value is not empty endif>

{%- endblock form_widget_simple %}

{% block textarea_widget -%}
    <textarea class="form-control" block>{{ value }}</textarea>
{%- endblock textarea_widget %}
</code>

最后在Twig中试试你的 {% form( form ) %}

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn