2014-02-25 34 views
8

用戶等級和積分形式:Symfony:如何避免自定義表單類型自動封裝在div中?

class UserType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('email', 'email', ['label' => 'EMail']); 
     // various other fields.... 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'validation_groups' => array('registration'), 
      'data_class' => 'Vendor\Model\Entity\User', 
     )); 
    } 

    public function getName() 
    { 
     return 'form_user'; 
    } 
} 

TutorType形式:

class TutorType extends Translate 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('user', new UserType(), ['label' => false]); 

     $builder->add('school', 'entity', [ 
      'class' => 'Model:School', 
      'property' => 'name', 
      'label' => 'Label' 
     ]); 

     // Various other fields 
     $builder->add('save', 'Submit'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      //'validation_groups' => array('registration'), 
      'data_class' => 'Vendor\Model\Entity\Tutor', 
      'cascade_validation' => true, 
     )); 
    } 

    public function getName() 
    { 
     return 'form_tutor'; 
    } 
} 

渲染時,該UserType是一個div裏面呈現的,我不能找到一種方法來克服這一點。

表單被渲染爲

the result

<form name="form_tutor" 
     method="post" 
     action="" 
     novalidate="novalidate" 
     class="form-horizontal form-horizontal" 
     id="form_tutor"> 
    <div id="form_tutor" 
     novalidate="novalidate" 
     class="form-horizontal"> 
     <div class="form-group"> 
      <div class="col-lg-10"> 
       <div id="form_tutor_user"> 
        <div class="form-group"> 
         <label class="col-lg-2 control-label aaaa required" 
          for="form_tutor_user_email">EMail</label> 

         <div class="col-lg-10"> 
          <input type="email" 
           id="form_tutor_user_email" 
           name="form_tutor[user][email]" 
           required="required" 
           class="form-control" /> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label class="col-lg-2 control-label aaaa required" 
       for="form_tutor_tutorType">Type</label> 

      <div class="col-lg-10"> 
       <select id="form_tutor_tutorType" 
        name="form_tutor[tutorType]" 
        class="form-control"> 
        </select> 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-lg-offset-2 col-lg-10"> 
       <button type="submit" 
        id="form_tutor_save" 
        name="form_tutor[save]" 
        class="btn btn-default">Speichern</button> 
      </div> 
     </div><input type="hidden" 
      id="form_tutor__token" 
      name="form_tutor[_token]" 
      class="form-control" 
      value="s6i6zPxJs7KU5CiEe8i6Ahg_ca8rc2t5CnSk5yAsUhk" /> 
    </div> 
</form> 

form_tutor_user包裝在自己的形式的基團的div。 我試圖覆蓋form_tutor_user_widget,但這是一個深層次的。 (只有一個快速修復,它應該是全球適用於所有表單類型 - 類)

我如何更改主題,以便所有自定義類型不包含默認的form_row模板?

或者我怎麼知道在「子窗體」呈現時,樹枝上? 所以我可以決定在子節點不是子窗體時打印<div class="form-group">,或者跳過它,如果是這樣的話。

TIA

+0

您使用有什麼引導束?或者,這是你自己的自定義boostrap形式主題?標準版不使用「form-group」類呈現div。 – nifr

+0

即時通訊使用http://themeforest.net/item/avant-clean-and-responsive-bootstrap-31-admin/5961888 – Rufinus

+0

和https:// github。com/braincrafted/bootstrap-bundle(但主題文件稍作修改以匹配我的html) – Rufinus

回答

4

默認情況下,在基本形式的主題:

{% block form_row %} 
{% spaceless %} 
    <div> 
     {{ form_label(form) }} 
     {{ form_errors(form) }} 
     {{ form_widget(form) }} 
    </div> 
{% endspaceless %} 
{% endblock form_row %} 

而且,對於定製化合物型:

{% block form_widget_compound %} 
{% spaceless %} 
    <div {{ block('widget_container_attributes') }}> 
     {% if form.parent is empty %} 
      {{ form_errors(form) }} 
     {% endif %} 
     {{ block('form_rows') }} 
     {{ form_rest(form) }} 
    </div> 
{% endspaceless %} 
{% endblock form_widget_compound %} 

除非你改變了這裏的東西,你看到了DIV應該來自一個或模板的另一位。

然而,在你的specfic例如,如果form_tutor_user_row定義,第一位是從未使用過,如果form_tutor_user_widget定義,最後一位從未使用過。

回到你的問題。您的問題是: 「我如何更改主題,以便所有自定義類型都不包含默認的form_row模板?「

下面是我看到的問題:你希望你的TOP表單(包含所有子表單的表單)都有一個共同的呈現方式,分節。在一個類=「form-group」的DIV中,你可能想要投入一些額外的渲染操作,但我會限制自己,以保持簡單。

你需要做的是創建一個specfic表單鍵入並使所有TOP表單繼承此新表單類型。例如:

class TopType extends AbstractType 
{ 
    public function getName() 
    { 
     return 'top_form'; 
    } 
} 

...和一個繼承的表單:

class MyFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     ... 
    } 

    public function getName() 
    { 
     return 'my_form'; 
    } 

    public function getParent() 
    { 
     return 'top_form'; 
    } 
} 

正如你所看到的,沒有必要爲形式化繼承工作而使PHP繼承。

模板的主題化,明智的(可我甚至說?),如果沒有特定形式的主題化設置爲my_form,Symfony的會理解,默認形式的主題,這裏用的是top_form形式的主題,你可以這樣定義:

{% block top_form_widget %} 
{% spaceless %} 
    {% for child in form %} 
     <div class="form-group"> 
      {{ form_widget(child) }} 
     </div> 
    {% endfor %} 
    {{ form_rest(form) }} 
{% endspaceless %} 
{% endblock top_form_widget %} 

我應該補充說這是一個我已經遇到和解決的問題。告訴我這是如何爲你工作的。

編輯:

總而言之,你必須做的是:

  • 創建TopType表單類型,
  • 添加top_form_widget塊表單中的主題,
  • 對於所有的根表單(即頂級表單,沒有父表單的表單),添加一個getParent() od將返回TopType表單的名稱(「top_form」)
+0

我會試試這個,但看起來我會在主題文件中看到很多表單控件塊。這麼久纔是最好的解決方案謝了哥們。 – Rufinus

+0

但我只計算了1個表單主題塊和1個整體解決方案類?我帖子中的第一個主題塊來自SF2的默認主題,他們只是爲了解釋。 – Zephyr

+0

也許我是missunderstand,但my_form和top_form必須是唯一的字符串,不是嗎?我在這個應用程序中有20個表單/子表單。 – Rufinus

2

從理論上講,如果你這樣覆蓋form_widget_compound塊在全球形式的主題,它應該工作,只要你想:

// app/Resources/views/form.html.twig 

{% block form_widget_compound %} 
    {% if form.parent is empty %} 
     <div {{ block('widget_container_attributes') }}> 
     {{ form_errors(form) }} 
    {% endif %} 
    {{ block('form_rows') }} 
    {{ form_rest(form) }} 
    {% if form.parent is empty %} 
     </div> 
    {% endif %} 
{% endblock %} 

和註冊表格主題:

// app/config/config.yml 
twig: 
    form: 
     resources: 
      - "::form.html.twig" 
+0

首先,感謝您的回答,不幸的是這不起作用。化合物也嵌套。 (複合代碼中的複合代碼) – Rufinus

3

我通常通過手動呈現嵌套窗體的字段來解決此問題:

{{ form_row(form.tutor.school) }} 
{{ form_row(form.tutor.user.email) }} 

也許這不是最優雅的解決方案,但它適用於我,我還沒有尋找一個優雅的。

+0

感謝您的回答。這是我目前的解決方法,但即時通訊需要多種形式,這會改變很多(agil項目),每當我改變窗體的時候改變視圖都不是我想要的。 – Rufinus

+0

如果你找到更好的方法,我會很高興知道它。它從來不是我的首要任務。 –

+0

這個解決方案簡單,有效,並且即使在幾個月後回到代碼時也很容易理解 - 完美! – Ben

-1

嘗試使用form_themes。

首先,在你父模板定義表單主題:

{% form_theme form with ['BundleName:ControlerName:somesubform_form.html.twig'] %} 

BTW用正確的名稱替換BUNDLENAME,ControllerName和somesubform。

然後使其:

{{ form_row(form.somesubform) }} 
0

也許它不是一個完美的解決方案,但是對我的作品,因爲我也試圖找到解決方案。

舉個例子:

{% for custom_field in form.custom_fields %} 
<div class="edit_custom"> 
{{ form_row(custom_field.name) }} 
{{ form_row(custom_field.value) }} 
</div> 
{% endfor %} 

<script> 
$('.edit_custom').find('input').unwrap(); 
</script> 
相關問題