2014-09-28 35 views
2

我是Symfony2的初学者,我希望社区能够帮助我和另一些人解决这个问题。Symfony2 + Twig:无法访问“body”块之外的表单行吗?

我有2个表单发送到视图,我把这2个渲染成2个不同的块(main-col和left-col),实际上main-col包含用户配置文件表单,left-col包含要上传的表单资料图片..这样的轮廓图像也不会出现

但当资料图片是进入主-COL(体块),它的工作原理...

有更好的理解一些例子:

这个例子不起作用:

{% extends 'FOOBAR\QuoteMachineBundle::base.html.twig' %} 


{% block menu -%} 
    {% include 'FOOBAR\QuoteMachineBundle::CompanyProfile/menu.html.twig' %} 
{% endblock %} 

{% block title -%}Edit company{% endblock %} 

{% block leftcol -%} 

    <h3>Company Logo</h3> 
    {{ form(picture_form) }} 

    Current Picture :<br/> 
    <img class="opttool" src="{{ entity.pictureWebPath }}" alt="" /> 

{% endblock %} 


{% block body -%} 
    {{ form(form) }} 
{% endblock %} 

但这种人会

{% extends 'FOOBAR\QuoteMachineBundle::base.html.twig' %} 


{% block menu -%} 
    {% include 'FOOBAR\QuoteMachineBundle::CompanyProfile/menu.html.twig' %} 
{% endblock %} 

{% block title -%}Edit company{% endblock %} 

{% block leftcol -%} 

{% endblock %} 


{% block body -%} 
    {{ form(form) }} 



    <h3>Company Logo</h3> 
    {{ form(picture_form) }} 

    Current Picture :<br/> 
    <img class="opttool" src="{{ entity.pictureWebPath }}" alt="" /> 
{% endblock %} 

我换了“当前图片的形式”从leftcol身体......其实形式只适用于基体块。

我应该准确地说我可以使用正常的变量到左边的block中,这样可以工作。 在leftcol的形式将与独生子女元素的“空”的形式元素:

<input type="hidden" name="_method" value="PUT"> 

我怎样才能正确地呈现picture_form到leftcol块?

编辑:就像你问,我发表了我的base.html.twig

<!DOCTYPE html> 
    <html> 
     <head> 
       ... 
     </head> 

     <body> 

     <div class="container"> 

       {% if block('leftcol') is not empty %} 
         <div class="left-col">{% block leftcol %}{% endblock %}</div> 
       {% endif %} 

      <div class="col-main"> 
       <h1>{{ block('title') }}</h1> 
       <article> 
        {% block body %}{% block fos_user_content %}{% endblock fos_user_content %}{% endblock %} 
       </article> 
      </div> 


       {% if block('rightcol') is not empty %} 
         <div class="right-col">{% block rightcol %}{% endblock %}</div> 
       {% endif %} 
     </div> 

     </body> 
    </html> 

感谢的样本!

+1

请张贴base.html.twig你正在延伸。 – 2014-09-28 11:51:37

+2

这可能与leftcol块有关。你可以请你发布你的部分base.html.twig你定义leftcol块吗? – herr 2014-09-29 13:19:05

回答

0

我不是100%确定它会解决你的问题,但在IF语句中使用block方法会导致一个新的请求(意味着所有事情都会被调用两次)。你应该试试这个:

{% set _block = block('leftcol') %} 
    {% if _block is not empty %} 
     <div class='left-col'> {{ _block|raw }} </div> 
    {% endif %} 

而不是

{% if block('leftcol') is not empty %} 
     <div class="left-col">{% block leftcol %}{% endblock %}</div> 
    {% endif %} 

,做记住,你应该把那样的逻辑,在控制器中只要有可能。

0

如果我不得不做出一个有根据的猜测,我会说在同一个模板/块中同时渲染两种形式会使SF /树枝感到困惑。我现在不能测试这两个线索,但这里是如果我是你,我会尝试:

  1. 在树枝观呼唤你的两个表格时要更精确:

    <form action="foo" method="post" etc...> 
        {{ form(form_picture) }} 
    
        {{ form_rest(form_picture) }} 
    {{ form_end(form_picture) }} 
    

的Symfony的形式呈现是高度可定制的,在这里找到所有的细节,如果你还没有发现他们尚未:How to Customize Form Rendering

  • 使用特定的控制器,或者至少你的表格的至少一种,最好为每个表单(但是这是一个的personnal偏好)一个单独的模板:

    {% block leftcol %} 
        {% render(controller('upload_picture') %} 
        // or 
        {% include('upload_picture_form.html.twig', with('form':'form_picture') %} 
        // Pardon my pseudo-code :P 
    {% endblock %} 
    
    {% block body %} 
        {{ form(form) }} 
    {% endblock %}