Как получить данные из отправленной формы в Symfony3?

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

1) У меня есть зависимый список, который рендеринг Symfony FormType выглядит так:
введите описание изображения здесь

2) Поля «Местоположение» и «Инструкция» зависят от поля «Компания».

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

4) Но при отправке формы у меня появляется ошибка:
введите описание изображения здесь

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

Мой 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"}]

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

0

Решение

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

Чтобы обойти эту ошибку, вы должны использовать Symfony’s События формы в вашем 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());
}
));
}
);
0

Другие решения

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

мой 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 и Instruction реализуют JsonSerializable и пользовательский интерфейс 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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector