Symfony多步形式问题(craue form bundle)

时间:2016-02-15 17:46:07

标签: php forms symfony symfony-forms symfony-2.3

流程完成后返回的表单数据有点奇怪。两个实体属性(使用嵌入的表单填充)采用数组格式,由字段名称键入,而不是字符串。

Form data

值lol。

的引擎和模型数组

我为此做了什么?

这是我的设置。

流程

<?php
namespace AppBundle\Form;

use AppBundle\Form\Type\CreateVehicleFormType;
use Craue\FormFlowBundle\Form\FormFlow;
use Craue\FormFlowBundle\Form\FormFlowInterface;

/**
 * Class CreateVehicleFlow
 * @package AppBundle\Form
 */
class CreateVehicleFlow extends FormFlow
{
    protected $allowRedirectAfterSubmit = true;

    /**
     * @return array
     */
    protected function loadStepsConfig()
    {
        return [
            // Step 1.
            [
                'label' => 'Wheels',
                'form_type' => CreateVehicleFormType::class,
            ],
            // Step 2.
            [
                'label' => 'Engine',
                'form_type' => CreateVehicleFormType::class,
                'skip' => function($estimatedCurrentStepNumber, FormFlowInterface $flow) {
                    return $estimatedCurrentStepNumber > 1 && !$flow->getFormData()->canHaveEngine();
                },
            ],
            // Step 3.
            [
                'label' => 'Model',
                'form_type' => CreateVehicleFormType::class
            ],
            // Step 4.
            [
                'label' => 'Confirmation',
            ],
        ];
    }
}

家长创建车辆表格

    <?php

    namespace AppBundle\Form\Type;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\FormBuilderInterface;

    /**
     * Class CreateVehicleFormType
     * @package AppBundle\Form\Type
     */
    class CreateVehicleFormType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            switch ($options['flow_step']) {
                case 1:
                    $validValues = [2, 4];
                    $builder->add(
                        'numberOfWheels',
                        ChoiceType::class, [
                        'choices' => array_combine($validValues, $validValues),
                            'attr' => [
                                'class' => 'form-control input-lg',
                                'required' => 'required'
                            ],
                        ]);
                    break;
                case 2:
                    $builder->add('engine', VehicleEngineFormType::class, []);
                    break;
                case 3:
                    $builder->add('model', VehicleModelFormType::class, [
                        'numberOfWheels' => $options['data']->getNumberOfWheels()
                    ]);
                    break;
            }
        }

        /**
         * @return string
         */
        public function getBlockPrefix()
        {
            return 'createVehicle';
        }

        /**
         * @return string
         */
        public function getName()
        {
            return 'create_vehicle';
        }
    }

儿童车辆引擎表格

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;

/**
 * Class CreateVehicleFormType
 * @package AppBundle\Form\Type
 */
class VehicleEngineFormType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('engine', ChoiceType::class, [
                'label' => false,
                'choices' => [
                    'Diesel' => 'Diesel',
                    'Petrol' => 'Petrol',
                    'Electric' => 'Electric',
                    'Hybrid' => 'Hybrid'
                ],
                'attr' => [
                    'class' => 'form-control input-lg',
                    'required' => 'required'
                ],
            ]
        );
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'vehicle_engine';
    }
}

儿童车辆模型表格

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Class CreateVehicleFormType
 * @package AppBundle\Form\Type
 */
class VehicleModelFormType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $choices = [];

        if ($options['numberOfWheels'] === 2) {
            $choices['BMW R nineT'] = 'BMW R nineT';
            $choices['Ducati Monster 1200S'] = 'Ducati Monster 1200S';
        } else {
            $choices['Ferrari LaFerrari'] = 'Ferrari LaFerrari';
            $choices['Aston Martin One-77'] = 'Aston Martin One-77';
        }

        $builder->add('model', ChoiceType::class, [
                'label' => false,
                'choices' => $choices,
                'attr' => [
                    'class' => 'form-control input-lg',
                    'required' => 'required'
                ],
            ]
        );
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'numberOfWheels' => 2,
        ]);
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'vehicle_model';
    }
}

最后我的控制器包括我的黑客将它们作为字符串属性取回

/**
 * One form type for the entire flow.
 *
 * @param Request $request
 * @return Response
 *
 * @Route("/create.vehicle", name="create.vehicle")
 */
public function CreateVehicleAction(Request $request)
{
    $formData = new Vehicle();

    $flow = $this->get('app.form.flow.create_vehicle'); // must match the flow's service id
    $flow->setGenericFormOptions([
        'action' => $this->generateUrl('create.vehicle')
    ]);
    $flow->bind($formData);

    // form of the current step
    $form = $submittedForm = $flow->createForm();

    if ($flow->isValid($form)) {
        $flow->saveCurrentStepData($form);

        if ($flow->nextStep()) {
            // form for the next step
            $form = $flow->createForm();
        } else {
            // flow finished
            // Bit hacky but not sure hy they are arrays set to the property.
            if (is_array($formData->getEngine())) {
                $formData->setEngine($formData->getEngine()['engine']);
            }

            if (is_array($formData->getModel())) {
                $formData->setModel($formData->getModel()['model']);
            }

            $flow->reset();

            $this->flashMessage(
                'success',
                [
                    'title' => 'Vehicle Created',
                    'message' => sprintf(
                        'You have created a %s %d wheeled vehicle.',
                        $formData->getModel(),
                        $formData->getNumberOfWheels()
                    )
                ]
            );

            return $this->redirect(
                $this->getPresencePath('sign_in.page')
            );
        }
    }

    if ($flow->redirectAfterSubmit($submittedForm)) {
        $params = $this
            ->get('craue_formflow_util')
            ->addRouteParameters(
                array_merge(
                    $request->query->all(),
                    $request->attributes->get('_route_params')
                ),
                $flow
            );

        return $this->redirect(
            $this->getPresencePath('sign_in.page', $params)
        );
    }

    return $this->render('AppBundle:multi-step-form:create-vehicle.html.twig', array(
        'form' => $form->createView(),
        'flow' => $flow
    ));
}

有人能发现这个问题吗?

0 个答案:

没有答案