Как получить данные из отправленной формы в Symfony3? - PullRequest
0 голосов
/ 12 декабря 2018

Я столкнулся с какой-то необычной для меня ситуацией.

1) У меня есть зависимый список, который отрисовывается Symfony FormType следующим образом: enter image description here

2) Поля Location и Instruction зависят от поля Company.

3) Когда я изменяю поле Company (событие onchange js), тогда идет запрос ajax, который извлекает данные из базы данных и создает раскрывающийся список.

4) Но при отправке формы у меня появляется ошибка: enter image description here

Пожалуйста, помогите мне решить эту проблему.Заранее спасибо.

My formType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('hours')
        ->add('messageText', null, ['required' => false])
        ->add('company', null, [
            'choice_label' => 'name',
            'placeholder' => 'Please select company',
            'required' => true
        ])
        ->add('procedure', TextType::class, ['attr' => ['placeholder' => 'Please type code or description'] ])
        ->add('instruction', ChoiceType::class, ['mapped' => false])
        ->add('location', ChoiceType::class, ['mapped' => false])

    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => InstructionNotification::class
    ));
}

Действие от контроллера:

/**
 * @Route("/admin/api/instructions", name="admin_api_instructions")
 * @param Request $request
 * @return JsonResponse
 */
public function getInstructionsByCompanyId(Request $request)
{
    $id = $request->get('id');
    if (!$id) {
        return new JsonResponse('No data', 404);
    }

    $instructions = $this->getDoctrine()->getRepository('OctaneBundle:Instruction')->findInstructionsByCompanyId($id);

    return new JsonResponse($instructions);
}

findInstructionsByCompanyId ($ id):

public function findInstructionsByCompanyId($id)
{
    $qb = $this->createQueryBuilder('i');
    if ($id) {
        $qb
            ->where('i.company = :id')
            ->setParameter('id', $id);
    }

    return $qb->getQuery()->getResult();
}

ответ от API (то есть: admin / api / инструкция? id = 1):

[{"id":2,"label":"First instruction"},{"id":3,"label":"First instruction"}]

Если вам нужна дополнительная информация, пожалуйста, оставьте комментарии ниже.Спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Спасибо за ответ, но я нашел более элегантное решение для моего случая.Итак,

my formType сейчас:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ...
        ->add('instruction', FormattedSelectType::class, ['class' => Instruction::class])
        ->add('location', FormattedSelectType::class, ['class' => Location::class])
    ;
}

FormattedSelectType:

class FormattedSelectType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'choice_label' => function (FormattedLabelInterface $entity) {
                return $entity->getFormattedLabel();
            }
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return EntityType::class;
    }
}

Реализация сущностей Etities Location и InstructionJsonSerializable и пользовательский интерфейс FormattedLabelInterface и имеют следующие методы:

/**
 * @return string
 */
public function getFormattedLabel()
{
    return sprintf(self::LABEL_FORMATTED, $this->zip, $this->city, $this->name, $this->address, $this->phone);
}

/**
 * @return array|mixed
 */
public function jsonSerialize()
{
    return [
        'id' => $this->id,
        'label' => $this->getFormattedLabel()
    ];
}
0 голосов
/ 12 декабря 2018

Валидатор Symfony ожидает, что ваша отправленная форма будет иметь отправленное значение instruction и location, которое существует в списке, который вы указали при создании формы в классе типа формы.Поскольку вы не предоставляете никаких опций для инструкций и местоположений, вы получаете ошибку проверки.

Чтобы обойти эту ошибку, вы должны использовать События формы Symfony в вашей функции buildForm вваш тип формы, как это:

$builder->get('company')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) {
            $company = $event->getForm()->getData();
            $form = $event->getForm()->getParent();
            $form->add('location', EntityType::class, array(
                'class' => Location::class,
                'query_builder' => function (EntityRepository $repo) use ($company) {
                    return $repo->createQueryBuilder('location')
                        ->where('location.company = :company')
                        ->setParameter('company', $company->getId());
                }
            ));
            $form->add('instruction', EntityType::class, array(
                'class' => Instruction::class,
                'query_builder' => function (EntityRepository $repo) use ($company) {
                    return $repo->createQueryBuilder('instruction')
                        ->where('instruction.company = :company')
                        ->setParameter('company', $company->getId());
                }
            ));
        }
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...