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

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

WBOY
Release: 2016-06-06 20:43:29
Original
1096 people have browsed it

请问使用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>
Copy after login

$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>
Copy after login

最后创建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>
Copy after login

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template