Но теперь у меня возникла проблема: мне нужно каким-то образом в форме группировать варианты выбора вопросы (с использованием EntityType с множественным и расширенным значением true). И нет — group_by EntityType не работает для Multiple = Extended = True. Это работает только для поля выбора.
Позже я добавил в запрос связь с вопросом. Это решило половину проблемы — теперь я мог в FormType добавлять к вопросам CollectionType (который является еще одним FormType RequestQuestionType). Обратите внимание, что это создает избыточность в БД, что нехорошо. (На самом деле это не так. У меня нет информации, какие вопросы использовались для этого запроса, поскольку вопросы могут меняться со временем, если установить isActive или добавление новых вопросов). Но теперь проблема в RequestQuestionType. Я не могу добавить ответ, так как вопрос не имеет этого отношения (он имеет только Request или QuestionChoice).
Вопрос в том, как мне получить ответы в этой форме? Я не могу использовать родительский (
Код: Выделить всё
RequestFormType
Код: Выделить всё
RequestQuestionType
Запрос
Код: Выделить всё
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="uuid")
*/
private $uuid;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="requests")
* @ORM\JoinColumn(nullable=false)
*/
private $User;
/**
* @ORM\Column(type="datetime")
*/
private $created;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $resolved;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $resolvedBy;
/**
* @ORM\Column(type="string", length=32)
*/
private $state;
/**
* @ORM\Column(type="string", length=255)
*/
private $address;
/**
* @ORM\ManyToMany(targetEntity=RequestQuestion::class, inversedBy="requests")
*/
private $questions;
/**
* @ORM\ManyToMany(targetEntity=RequestQuestionChoice::class, inversedBy="scholarRequestsAnswers")
*/
private $answers;
Код: Выделить всё
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $description;
/**
* @ORM\Column(type="boolean")
*/
private $isActive;
/**
* @ORM\OneToMany(targetEntity=RequestQuestionChoice::class, mappedBy="Question", orphanRemoval=true)
*/
private $choices;
/**
* @ORM\ManyToMany(targetEntity=Request::class, mappedBy="questions")
*/
private $requests;
Код: Выделить всё
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="boolean")
*/
private $correct;
/**
* @ORM\ManyToOne(targetEntity=RequestQuestion::class, inversedBy="choices")
* @ORM\JoinColumn(nullable=false)
*/
private $Question;
Код: Выделить всё
class RequestFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('address', TextType::class, [
'constraints' => [
new NotBlank([
'message' => "Zadejte adresu"
])
]
])
->add('questions', CollectionType::class, [
'entry_type' => RequestQuestionType::class,
'entry_options' => [
'questions' => $builder->getData()->getQuestions()
]
])
->add('tos', CheckboxType::class, [
'mapped' => false,
'value' => false,
'constraints' => [
new IsTrue([
'message' => "Musíte souhlasit s našimi podmínkami použití"
])
]
])
->add('Submit', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Request::class
]);
}
}
Код: Выделить всё
class RequestQuestionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$index = str_replace(["[", "]"], "", $builder->getPropertyPath());
$builder
->add('???', EntityType::class, [
'class' => RequestQuestionChoice::class,
'choice_label' => 'name',
'choices' => $options["questions"][$index]->getChoices(),
'expanded' => true,
'multiple' => true
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'questions' => []
]);
}
}
Примечание: запрос предварительно создается с фиктивными данными — вопросами и передается в эту форму.
Примечание. Раньше я также пытался разложить отношение ManyToMany в Request — RequestChoice как RequestAnwer с bool as пользователь отметил или нет выбор и заранее сгенерировал все ответы на вопрос «Выбор выбора». Но проблема с группировкой вариантов по вопросам тоже существовала, поэтому мне тоже не удалось заставить ее работать.
Подробнее здесь: https://stackoverflow.com/questions/715 ... th-choices