使用制表符编辑表单中的Symfony2大实体

kor*_*ral 5 forms tabs symfony-forms symfony

我正在使用Sf2的表单构建器构建表单.

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('firstName')
            ->add('lastName')...
Run Code Online (Sandbox Code Playgroud)

实体有很多字段,我想把它们放在jQuery UI标签中.但在twig模板中,我想使用单个命令

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

什么是最佳解决方案?

编辑**

为了更加坦诚:我有4个字段:firstName,lastName,birthDate,deathDate.我希望前两个字段位于第一个选项卡上,最后两个字段位于第二个选项卡上.我想继续像前面提到的那样渲染表单.

我有一个解决方案来创建我自己的字段,而不是连接到底层对象,它将呈现所需的html标签(h3,div等).

kor*_*ral 4

我定义了自己的字段,名为“Tab”,并在新选项卡出现时添加它。

\n\n
<?php\n//\\src\\Alden\\xyzBundle\\Form\\Type\\TabsType.php\n\nnamespace Alden\\BonBundle\\Form\\Type;\n\nuse Symfony\\Component\\Form\\AbstractType;\nuse Symfony\\Component\\Form\\FormBuilder;\nuse Symfony\\Component\\Form\\FormView;\nuse Symfony\\Component\\Form\\FormInterface;\nuse Symfony\\Component\\Form\\FormError;\nuse Symfony\\Component\\Form\\CallbackValidator;\nuse Symfony\\Component\\Form\\FormValidatorInterface;\nuse Symfony\\Component\\Form\\Form;\n\nclass TabsType extends AbstractType {\n\n    public function buildForm(FormBuilder $builder, array $options)\n    {\n        $builder->setAttribute(\'starting\', $options[\'starting\']);\n        $builder->setAttribute(\'ending\', $options[\'ending\']);\n        $builder->setAttribute(\'header\', $options[\'header\']);\n    }\n\n    public function buildView(FormView $view, FormInterface $form)\n    {\n        $parent = $form->getParent();\n        if (is_null($parent->getParent()))\n        {\n            $tabs = $this->findTabs($parent);\n        }\n        else\n        {\n            $tabs = array();\n        }\n        $view->set(\'starting\', $form->getAttribute(\'starting\'));\n        $view->set(\'ending\', $form->getAttribute(\'ending\'));\n        $view->set(\'header\', $form->getAttribute(\'header\'));\n        $view->set(\'tabs\', $tabs);\n    }\n\n    public function getDefaultOptions(array $options)\n    {\n        return array(\n            \'property_path\' => false,\n            \'starting\' => true,\n            \'ending\' => true,\n            \'header\' => false,\n        );\n    }\n\n    public function getName()\n    {\n        return \'tabs\';\n    }\n\n    public function getParent(array $options)\n    {\n        return \'field\';\n    }\n\n    private function findTabs(Form $form)\n    {\n        $prefix = $form->getName();\n        $tabs = array();\n        foreach ($form->getChildren() as $child)\n        {\n            foreach ($child->getTypes() as $type)\n            /* @var $child \\Symfony\\Component\\Form\\Form */\n            {\n                if (get_class($type) == __NAMESPACE__ . \'\\TabsType\')\n                {\n                    if ($child->getAttribute(\'starting\'))\n                    {\n                        $tabs[$prefix . \'_\' . $child->getName()] = $child->getAttribute(\'label\');\n                    }\n                }\n            }\n        }\n        return $tabs;\n    }\n\n}\n\n?>\n
Run Code Online (Sandbox Code Playgroud)\n\n

和树枝

\n\n
{# \\src\\Alden\\xyzBundle\\Resources\\views\\Form\\fields.html.twig #}\n{% block tabs_row %}\n{% if header %}\n<ul>\n    {% for tid, t in tabs %}\n        <li>\n            <a href="#{{ tid }}">{{ t }}</a>\n        </li>\n    {% endfor %}\n</ul>\n{% endif %}\n{% if ending %}\n</div>\n{% endif %}\n{% if starting %}\n<div id="{{ id }}">\n{% endif %}\n{% endblock %}\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及表单生成器中的用法:

\n\n
public function buildForm(FormBuilder $builder, array $options)\n{\n    $builder\n            ->add(\'tabs_head\', new TabsType(), array(\n                \'ending\' => false,\n                \'starting\' => false,\n                \'header\' => true\n            ))\n            ->add(\'tab_1\', new TabsType(), array(\n                \'ending\' => false,\n                \'label\' => \'Podstawowe\'\n            ))\n            ->add(\'firstName\', null, array(\n                \'label\' => \'Imi\xc4\x99\'\n            ))\n            ->add(\'lastName\', null, array(\n                \'label\' => \'Nazwisko\'\n            ))\n            ->add(\'tab_contact\', new TabsType(), array(\n                \'label\' => \'Kontakt\'\n            ))\n            ->add(\'address\', new AddressType(), array(\n                \'label\' => \'Adres zameldowania\'\n            ))\n            ->add(\'tabs_end\', new TabsType(), array(\n                \'starting\' => false\n            ))\n    ;\n}\n
Run Code Online (Sandbox Code Playgroud)\n