search

Home  >  Q&A  >  body text

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

请问使用form_widget()渲染表单
我使用form_widget(form.name)
大概渲染出来的input如下
<input type="text" id="shop_adminbundle_menu_name" name="shop_adminbundle_menu[name]" required="required" maxlength="255" value="admin_menu">

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

PHP中文网PHP中文网2818 days ago559

reply all(1)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 14:59:26

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

    <?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_p_layouts.html.twig';
    
            $container->setParameter( 'twig.form.resources' , $resources );
        }
    }
    

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

    <?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 ... 
    
        }
    }
    

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

    {% block form_row -%}
    
    
    <p class="form-group">
            {{- form_errors(form) -}}
            <label for="">{{- form_label(form) -}}</label>
            {{- form_widget(form) -}}
        </p>
    
    
    {%- 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('button_attributes') }} 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('widget_attributes') }} class="form-control" type="{{ type }}" {% if value is not empty %}value="{{ value }}" {% endif %}/>
    
    {%- endblock form_widget_simple %}
    
    {% block textarea_widget -%}
        <textarea  class="form-control" {{ block('widget_attributes') }}>{{ value }}</textarea>
    {%- endblock textarea_widget %}
    

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

    reply
    0
  • Cancelreply