Heim > Backend-Entwicklung > PHP-Tutorial > 请问个关于表单渲染的问题,希望能解答一下,谢谢

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

WBOY
Freigeben: 2016-06-06 20:43:29
Original
1095 Leute haben es durchsucht

请问使用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>
Nach dem Login kopieren

$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>
Nach dem Login kopieren

最后创建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>
Nach dem Login kopieren

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage