簡體   English   中英

在預先設置的數據事件后生成的表單輸入上的Symfony2發布提交事件

[英]Symfony2 post submit event on a form input that is generated after a pre set data event

我的情況如下:我有一個多步驟注冊表格。 在第一步,用戶選擇他的角色(買方,供應商),然后進入第二步。 如果用戶選擇了角色“買方”,則表單中將包含輸入字段“公司”。 當用戶選擇isCompany = true時,將顯示其他字段。 我想將post_submit事件附加到字段“ isCompany”,但是我不知道如何執行此操作,因為此字段是由pre_set事件生成的,並且在首次呈現表單時不包括該字段。 我的表格類型:

    $builder
        ->add('firstName')
        ->add('lastName')
        ->add('telephone')
        ->add('email', 'email')
        ->add('password', 'repeated', array(
            'first_name' => 'password',
            'second_name' => 'confirm',
            'type' => 'password',
        ));


    $formModifier = function (FormInterface $form, $isCompany) {
        if ($isCompany == true) {
            $form->add('company', new CompanyType());
        }
    };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($formModifier) {
            $user = $event->getData();
            $form = $event->getForm();

            if ($user->getRole()->getRole() === 'ROLE_BUYER') {
                $form->add('isCompany', 'choice', array(
                    'choices'   => array('0' => 'Citizen', '1' => 'Company'),
                ));

                $formModifier($event->getForm(), $user->getIsCompany());
            }
        }
    );

    $builder->get('isCompany')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) use ($formModifier) {
            // It's important here to fetch $event->getForm()->getData(), as
            // $event->getData() will get you the client data (that is, the ID)
            $isCompany = $event->getForm()->getData();

            // since we've added the listener to the child, we'll have to pass on
            // the parent to the callback functions!
            $formModifier($event->getForm()->getParent(), $isCompany);
        }
    );

    $builder
        ->add('nextStep', 'submit')
        ->add('previousStep', 'submit', array(
            'validation_groups' => false,
        ));
}

在第一個事件監聽器中添加第二個事件監聽器:

$builder->addEventListener(
    FormEvents::PRE_SET_DATA,
    // put your POST_SUBMIT listener inside $otherListener, see below for more details
    function (FormEvent $event) use ($formModifier, $otherListener) {
        $user = $event->getData();
        $form = $event->getForm();

        if ($user->getRole()->getRole() === 'ROLE_BUYER') {
            $form->add( //note this part:
                $builder->create('isCompany', 'choice', array(
                    'choices'   => array('0' => 'Citizen', '1' => 'Company'),)
                )->addEventListener(FormEvents::POST_SUBMIT, $otherListener) // $otherListener is the listener you use in the post submit event (just like you've included in the question)
            );

            $formModifier($event->getForm(), $user->getIsCompany());
        }
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM