2013-05-24 5 views
21

나는 간단한 문제가 있습니다.Symfony2 -> 나뭇 가지 -> 양식 -> 필드 -> 렌더링 설정 = true

나는 예를 들어 필드와 형식이 : 내가 여러 블록을 사용하여 내 나뭇 가지 파일에서

$builder 
    ->add('x') 
    ->add('y') 
    ->add('z') 
; 

을 그리고 난 내가 b.html.twig를 볼 수 ... 필드를 렌더링 중지 을 원한다 파일!

a.html.twig

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

{% block form %} 
    {{ form.x.set('rendered', true) | default() }} 
    {{ parent() }} 
{% endblock form %} 

b.html.twig 내가 "기본()를"나는 오류를 얻을 제거하면 객체 캔트 그 문자열로 변환 될 수 있습니다. 그리고 실제로 양식은 모든 필드를 렌더링합니다 ... x 필드를 포함합니다. 하지만 그들은 x 필드를 렌더링해서는 안됩니다 ...

미리 감사드립니다!

답변

65

내가 여기에 질문을 실종? 단순 통화가 아니더라도 렌더링 된 필드를 설정하려면 다음과 같이하십시오.

{% do form.x.setRendered %} 

오해한다면, 사과드립니다.

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'id', 
      HiddenType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'name', 
      TextType::class, 
      array(          
       'required' => false 
      ) 
     ) 
     ->add(
      'comment', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ) 
     ->add(
      'amount', 
      TextType::class, 
      array(
       'required' => false 
      ) 
     ); 
} 

경우 :

예를 들어
{{ form_end(form, {'render_rest': false}) }} 

, 우리가 다음 양식을 정의

3

일종의 의사 결정 논리를 포함하여 FormType의 양식 필드를 제거하거나 추가해야합니다.

예를 들어, cerain 변수의 존재/값을 검사합니다.

이 변수는 생성자에 삽입 될 수 있습니다.

템플릿에서 제거하는 것은 템플릿에 속하지 않는 응용 프로그램 논리입니다.

다른 선택의 여지가없는 경우 FormView::setRendered() 메소드를 살펴보십시오.

당신은 나뭇 attribute function 사용하여 객체의 메소드를 액세스 할 수 있습니다

{{ attribute(object, method, arguments) }} 
+0

문제는 기본적으로 "form_widget (form)"이 포함 된 전역 양식 테마를 사용한다는 것입니다. 아래쪽에 필드가 있어야하며 rendered = true로 설정해야합니다. 그럼 내가 바닥과 내 글로벌 테마를 사용할 수있는 필드를 렌더링하지 않을 ... – PatrickB

+0

내 대답을 업데이 트 ... 귀하의 정확한 질문은 수동으로 양식에 행에 대한 setRendered()를 호출하는 방법입니다? – nifr

+0

질문은 twig (only) ^^로 이것을 수행하는 방법입니다. 지금은 자체 나뭇 가지 함수를 사용하고 있습니다. public function renderState (FormView $ field) {$ field-> setRendered (true); } – PatrickB

2

당신은 양식에 정의되어 있지만 템플릿에 설명되지 않은 양식 필드를 렌더링 방지하기 위해 다음 닫는 형태로 문을 사용할 수 있습니다 우리는 다음 템플릿을 설명하지만, 필드 id을 렌더링하고 싶지 않으므로, 을 form_end 블록에서 렌더링 할 수 있습니다. id :

{{ form_start(form) }} 
{{ form_row(form.name) }} 
{{ form_row(form.comment) }} 
{{ form_row(form.amount) }} 
{{ form_end(form, {'render_rest': false}) }} 
+4

설명을 추가하면이 대답이 더 나을 것입니다. – johnnyRose

+0

그러나 이것은 모든 필드에 적용됩니다. 또한 _csrf_token의 경우 _csrf 필드를 직접 추가해야합니다. – Tom