【问题标题】:How to prevent twig to render embedded form automatically?如何防止树枝自动呈现嵌入的表单?
【发布时间】:2015-11-05 13:19:26
【问题描述】:

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

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';
    }
}

所以我想在 RegistryType 中嵌入 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()
            ]
        );
    }

结果我收到了嵌入式公司表格,但它是自动呈现的,正如你所见,它并不好。请帮帮我。

【问题讨论】:

    标签: forms symfony twig embedding


    【解决方案1】:

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

     {{ form_label(form.Companies[0].name) }}                                   
     {{ form_errors(form.Companies[0].name) }}
     {{ form_widget(form.Companies[0].name) }}
    

    【讨论】:

      【解决方案2】:

      我不知道你是否知道Form themes in Symfony,但我想这可能就是你要找的。​​p>

      您必须在 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 变量。

      但我认为您的问题可能还有其他问题,例如“什么是选择表单组件?”..

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 2016-01-27
        • 2021-04-21
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多