如何防止twig自动呈现嵌入表单?

时间:2015-11-05 13:19:26

标签: forms symfony twig embedding

我想要填充嵌入式表格。所以有公司的客户存在。在注册期间,他必须以单一形式描述自己和他的公司。因此我有:

namespace AppBundle\Form;

use AppBundle\Entity\Company;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CompanyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'type',
                'choice',
                [
                    'choices' => Company::choices()
                ]
            )
            ->add('name', 'text')
            ->add('licenseNumber', 'text')
            ->add('country', 'country')
            ->add('officeAddress', 'text')
            ->add('registrationAddress', 'text')
            ->add('phone', 'text')
            ->add('fax', 'text')
            ->add('email', 'email')
            ->add('description', 'textarea')
            ->add('Documents', 'text', [ 'compound' => true ])
        ;

        $builder->setMethod('POST');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundle\Entity\Company'
        ]);
    }

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




namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('email', 'email')
            ->add(
                'password',
                'repeated',
                [
                    'first_options'  => [
                        'label' => 'Password'
                    ],
                    'second_options' => [
                        'label' => 'Repeat Password'
                    ],
                    'type'           => 'password',
                    'property_path'  => 'rawPassword',
                ]
            )
            ->add('Companies', 'collection', ['type' => new CompanyType()] )
            ->add('submit', 'submit')
            ->setMethod('POST')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefaults(
                [
                    'data_class' => 'AppBundle\Entity\Customer'
                ]
            )
        ;
    }

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

所以在RegistreType中我想嵌入CompanyType。因此,在我的注册控制器中,我做了:

public function registerAction(Request $request)
    {
        if ($customer = $this->getUser()) {
            return $this->redirectToRoute('_profile_index');
        }

        $customerManager = $this->get('app.services.customer_manager');

        $customer = new Customer();
        $company = new Company();
        $customer->getCompanies()->add($company);

        $form = $this->createForm(new RegisterType(), $customer);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $customerManager->create($form->getData());

            //return $this->redirectToRoute('_security_register_confirmation');
        }

        return $this->render(
            'AppBundle:Security:register.html.twig',
            [
                'form' => $form->createView()
            ]
        );
    }

结果我重新获得嵌入式公司表单,但它会自动呈现,因为您认为它不好。 Pleasy帮助我。

enter image description here

2 个答案:

答案 0 :(得分:0)

我明白了!那是因为我不会手动处理表单字段,例如:

<root>
  <children>
    <child1></child1>
    <child2></child2>
    <child3></child3>
    <child4></child4>
    <child5></child5>
  </children>
  <persons>
    <child name="child1"></child>
    <adult name="adult1"></adult>
    <child name="child2"></child>
    <child name="child3"></child>
    <child name="child4"></child>
    <child name="child5"></child>
    <adult name="adult2"></adult>
    <adult name="adult3"></adult>
  </persons>
</root>

答案 1 :(得分:0)

我不知道你是否知道Form themes in Symfony,但我认为这可能就是你要找的。

您必须在src \ YourBundle \ Resources \ views \ Form(或其他任何地方,但这是Symfony文档指示的路径)中创建表单主题。我们称之为registrationForm.html.twig。

在里面,你将为你的个人用途创建一个自定义主题,按照你的意愿设计公司表格:

{% block _app_company_row %} // or {% block _app_company_widget %}
    // your custom template here
    // see documentation to learn how to do this correctly
    // as this can be rather difficult to understand
{% endblock %}

然后,您必须在模板中“调用”此主题:

{% form_theme form 'YourBundle:Form:registrationForm.html.twig' %}

form 是包含formView实例的twig变量。

但我认为你的问题中可能存在一些问题,例如“什么是选择形式组件?”..

关于公司实体的一些信息也可能有所帮助..