2012-05-13 7 views
5

私はSf2のフォームビルダーを使用してフォームを構築しています。編集Symfony2タブのあるフォームの大きなエンティティ

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('firstName') 
      ->add('lastName')... 

エンティティには多くのフィールドがあり、それらをjQuery UIタブに配置したいと考えています。しかし、小枝のテンプレートでは、私は単一のコマンドを使用したいと思います。

最適な解決策は何ですか?

編集**

よりconrete的には:firstNameの、lastNameの、たbirthDate、deathDate:私は4つのフィールドを持っています。最初の2つのフィールドを最初のタブに、最後の2つのフィールドを2番目のタブに配置します。私は前に述べたようにフォームをレンダリングする方法を保ちたい。

私は、必要なhtmlタグ(h3、divなど)をレンダリングする下層オブジェクトに接続されていない独自のフィールドを作成するソリューションを提供しています。

答えて

3

をレンダリングします。

<?php 
//\src\Alden\xyzBundle\Form\Type\TabsType.php 

namespace Alden\BonBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormError; 
use Symfony\Component\Form\CallbackValidator; 
use Symfony\Component\Form\FormValidatorInterface; 
use Symfony\Component\Form\Form; 

class TabsType extends AbstractType { 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->setAttribute('starting', $options['starting']); 
     $builder->setAttribute('ending', $options['ending']); 
     $builder->setAttribute('header', $options['header']); 
    } 

    public function buildView(FormView $view, FormInterface $form) 
    { 
     $parent = $form->getParent(); 
     if (is_null($parent->getParent())) 
     { 
      $tabs = $this->findTabs($parent); 
     } 
     else 
     { 
      $tabs = array(); 
     } 
     $view->set('starting', $form->getAttribute('starting')); 
     $view->set('ending', $form->getAttribute('ending')); 
     $view->set('header', $form->getAttribute('header')); 
     $view->set('tabs', $tabs); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'property_path' => false, 
      'starting' => true, 
      'ending' => true, 
      'header' => false, 
     ); 
    } 

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

    public function getParent(array $options) 
    { 
     return 'field'; 
    } 

    private function findTabs(Form $form) 
    { 
     $prefix = $form->getName(); 
     $tabs = array(); 
     foreach ($form->getChildren() as $child) 
     { 
      foreach ($child->getTypes() as $type) 
      /* @var $child \Symfony\Component\Form\Form */ 
      { 
       if (get_class($type) == __NAMESPACE__ . '\TabsType') 
       { 
        if ($child->getAttribute('starting')) 
        { 
         $tabs[$prefix . '_' . $child->getName()] = $child->getAttribute('label'); 
        } 
       } 
      } 
     } 
     return $tabs; 
    } 

} 

?> 

と小枝

フォームビルダで
{# \src\Alden\xyzBundle\Resources\views\Form\fields.html.twig #} 
{% block tabs_row %} 
{% if header %} 
<ul> 
    {% for tid, t in tabs %} 
     <li> 
      <a href="#{{ tid }}">{{ t }}</a> 
     </li> 
    {% endfor %} 
</ul> 
{% endif %} 
{% if ending %} 
</div> 
{% endif %} 
{% if starting %} 
<div id="{{ id }}"> 
{% endif %} 
{% endblock %} 

と使用方法:

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder 
      ->add('tabs_head', new TabsType(), array(
       'ending' => false, 
       'starting' => false, 
       'header' => true 
      )) 
      ->add('tab_1', new TabsType(), array(
       'ending' => false, 
       'label' => 'Podstawowe' 
      )) 
      ->add('firstName', null, array(
       'label' => 'Imię' 
      )) 
      ->add('lastName', null, array(
       'label' => 'Nazwisko' 
      )) 
      ->add('tab_contact', new TabsType(), array(
       'label' => 'Kontakt' 
      )) 
      ->add('address', new AddressType(), array(
       'label' => 'Adres zameldowania' 
      )) 
      ->add('tabs_end', new TabsType(), array(
       'starting' => false 
      )) 
    ; 
} 
1

フォームは、フォームウィザードのように動作する場合は、それはかなりいいですmulti-step form bundle

を見に見ることができる、あなたは例えば、塗りつぶし、STEP2で、ソフトウェアの詳細に記入して、ステップ1を定義することができますアウトバージョンの詳細。または何でもしたい。各ステップ

  • ダイナミックステップナビゲーション
  • ため

    特徴

    • ナビゲーション(次、バック、やり直し)
    • ステップの説明
    • 指定ステップのスキップ
    • 異なる検証グループ
    あなたはフィールドをレンダリングするために意味するか?

    そしてhere

    +0

    私は一度にすべてのフォームフィールドをロードする必要があります。 – koral

    0

    ライブデモである。しかし小枝テンプレートで私は、単一のコマンドに

    を使用したいですか

    {{ form_rest(form) }} 
    

    私は「タブ」と呼ばれる自分のフィールドを定義して、新しいタブが表示されますときにそれを追加し、すべてのレンダリングされていないフォーム