1

私はCraueFormFlowBundleでフォーム ウィザードを作成しましたが、$flow->isValid() が失敗する最後のステップまで機能し、フォーム ウィザード アクションの目的の最後に移動する代わりに、常に最後のステップをレンダリングします。

私がどこを間違えたのかを理解するために必要なコードは次のとおりです。

コントローラ:

public function indexAction(Activity $activity)
{
    $currency = $this->getDoctrine()->getRepository('MycompanyUtilBundle:UtilCurrency')->find(1);

    $booking = new Booking();
    $booking->setActivity($activity)
        ->setCurrency($currency)
        ->setReferenceCode(uniqid())
        ->setUserAccount($this->getDoctrine()->getRepository('MycompanySettingsBundle:UserAccount')->find(1));

    $flow = $this->get('mycompany.form.flow.Booking');
    $flow->bind($booking);

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

        if ($flow->nextStep()) {
            $form = $flow->createForm();
        } else {
            return new JsonResponse(['Status' => 'Form is valid']);
        }
    }

    return $this->render(
        '@MycompanyDemoBundle/Default/booking.flow.html.twig',
        [
            'form' => $form->createView(),
            'flow' => $flow,
            'activity' => $activity->getTitle(),
            'formData' => $booking,
            'error' => $form->getErrors(true, true),
        ]
    );
}

services.yml:

mycompany.form.Booking:
    class: mycompany\BookingBundle\Form\BookingType
    tags:
        - { name: form.type, alias: mycompany_bookingbundle_booking_form }
mycompany.form.flow.Booking:
    class: mycompany\BookingBundle\Form\BookingFlow
    parent: craue.form.flow
    scope: request
    calls:
        - [ setFormType, [ @mycompany.form.Booking ] ]

BookingType.php:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    switch ($options['flow_step']) {
        case 1:
            $builder
                ->add(
                    'activity',
                    'entity',
                    [
                        'class' => 'Mycompany\ActivityBundle\Entity\Activity',
                        'property' => 'title',
                    ]
                )
                ->add(
                    'scheduledDeparture',
                    'entity',
                    [
                        'class' => 'Mycompany\ActivityBundle\Entity\ActivityScheduledDeparture',
                        'property' => 'departureDateTimeString',
                        'empty_value' => 'Select departure time',
                    ]
                )
                ->add(
                    'payer',
                    new CrmContactType()
                );
            break;
        case 2:
            $builder
                ->add(
                    'numberOfAdults',
                    'choice',
                    [
                        'choices' => range(1, 5),
                        'empty_value' => 'Select number of adult travellers'
                    ]
                )
                ->add(
                    'numberOfChildren',
                    'choice',
                    [
                        'choices' => range(1, 5),
                        'empty_value' => 'Select number of child travellers'
                    ]
                );
    }
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(
        [
            'data_class' => 'Mycompany\BookingBundle\Entity\Booking',
        ]
    );
}

予約フロー:

protected function loadStepsConfig()
{
    return
        [
            [
                'label' => 'Select tour',
                'type' => $this->formType,
            ],
            [
                'label' => 'Select travellers',
                'type' => $this->formType,
            ],
            [
                'label' => 'Confirmation',
            ],
        ];
}

最後に小枝ファイル:

{% stylesheets '@CraueFormFlowBundle/Resources/assets/css/buttons.css' %}
    <link type="text/css" rel="stylesheet" href="{{ asset_url }}"/>
{% endstylesheets %}
<div>
    Steps:
    {% include '@CraueFormFlow/FormFlow/stepList.html.twig' %}
</div>
{{ form_start(form) }}
    {{ form_errors(form) }}
    {{ activity }}
    {{ form_rest(form) }}
    {% include '@CraueFormFlow/FormFlow/buttons.html.twig' %}
{{ form_end(form) }}

<div>
    Errors:
    {{ dump(error) }}
</div>
<div>
    Form:
    {{ dump(form) }}
</div>

追加の検証はまったくありません。そのフィールドを空にすることはできません。最後のステップに到達し、Finishボタンをクリックすると、Symfony が「フォームは有効です」という値で JSON を生成すると思っていましたが、最後のステップを何度も繰り返すだけです。そのセクションをデバッグすると、終了をクリックすると $flow->isValid($form) に false が返されますが、前のステップはすべて true であり、ここで JSON 応答を返すことはできません。

小枝で form と form->getErrors の値もダンプしていますが、エラーが発生しているようなものはありません。そのデータを永続化しようとすると、正常に永続化されます。

バンドルのgitページでこれに対する解決策が見つかりませんでした。ここにいる皆さんは、どこで解決策を探すべきか知っていますか?

4

1 に答える 1