6

2 つの選択肢フィールドがあり、一方は他方に依存します。

フォームを作成するときに、依存するフィールドが空の選択肢の配列を取得しました。

次に、JavaScript でこのフィールドに入力して、アクションからデータを要求します。

問題は検証に由来します。もちろん、単一または複数の値は空の値に対して有効ではないため、合格しません。それを解決するために、PRE_BIND基本的に削除して正しい値で選択フィールドを再作成するリスナーを作成しましたが、それでも検証に合格しません。

$form->getErrors()何も$form->getErrorsAsString()返しませんが、選択フィールドでエラーを返します。

私のフォーム:

<?php

namespace Foo\BarBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class BarFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // other fields

        // This field is filled in ajax
        $builder->add('stores', 'choice', array(
            'label' => 'form.label.stores',
            'translation_domain' => 'FooBarBundle',
            'choices' => $options['storesList'],
            'required' => false,
            'multiple' => true,
            'auto_initialize' => false,
            'attr' => array(
                'class' => 'chzn-select',
                'placeholder' => 'form.placeholder.stores'
        )));

        $func = function (FormEvent $e) use ($options) {
            $data = $e->getData();
            $form = $e->getForm();
            if ($form->has('stores')) {
                $form->remove('stores');
            }

            $brand = isset($data['brand']) ? $data['brand'] : null;

            if ($brand !== null) {
                $choices = $options['miscRepo']->getStoresNameIndexedById($brand);
                $choices = array_keys($choices);
                $choices = array_map('strval', $choices);
            } else {
                $choices = array();
            }

            $form->add('stores', 'choice', array('choices' => $choices, 'multiple' => true, 'attr' => array('class' => 'chzn-select')));
        };

        $builder->addEventListener(FormEvents::PRE_SUBMIT, $func);
    }

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

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired(array(
            'storesList',
            'miscRepo',
        ));
    }
}
4

1 に答える 1

0

私はあなたと同じ問題を抱えていました.javascriptを介してフィールドを更新しましたが、検証に合格しませんでした. PRE_SUBMIT イベントで、javascript で追加した値を読み取り、クエリを実行してその ID を持つオブジェクトを取得し、フィールドの選択を更新します。

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
    $data = $event->getData();
    $form = $event->getForm();
    $pageId = $data['page_id'];

    $page = $this->myManager->getPage($pageId);
    $options = array($page->getId() => $page->getTitle());

    $form->add('page_id', 'choice', array(
        'label'         => 'Select page',
        'choices'       => $options,
        'required'      => true,
        'placeholder'   => 'Select page'
    ));

    $form->getData()->setPageId($pageId);
});
于 2015-01-16T16:31:18.150 に答える