5

Sf2 のフォーム ビルダーを使用してフォームを作成しています。

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

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

<form action="#" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <input type="submit" value="Save"/>
</form>

最善の解決策は何ですか?

編集 **

具体的に言うと、firstName、lastName、birthDate、deathDate の 4 つのフィールドがあります。最初の 2 つのフィールドを最初のタブに、最後の 2 つのフィールドを 2 番目のタブに配置します。前述のように、フォームをレンダリングする方法を維持したいと思います。

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

4

3 に答える 3

3

「Tab」という独自のフィールドを定義し、新しいタブが表示されるときに追加します。

<?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
            ))
    ;
}
于 2012-05-20T21:28:49.410 に答える
1

フォームをフォーム ウィザードのように機能させたい場合は、マルチステップ フォーム バンドルを参照してください。

たとえば、ステップ 1 をソフトウェアの詳細を入力するように定義し、ステップ 2 でバージョンの詳細を入力することができます。またはあなたが望むものは何でも。

特徴

  • ナビゲーション (次へ、戻る、最初からやり直す)
  • ステップの説明
  • 指定されたステップのスキップ
  • ステップごとに異なる検証グループ
  • 動的ステップ ナビゲーション

そして、これがライブデモです

于 2012-05-13T12:22:51.993 に答える
0

しかし、小枝テンプレートでは、単一のコマンドを使用したい

フィールドをレンダリングするつもりですか?

{{ form_rest(form) }}

レンダリングされていないすべてのフォームをレンダリングします

于 2012-05-13T12:54:51.120 に答える