У меня есть 3 объекта: Languages, Country и SetupWizard, который содержит отношение ManyToOne с предыдущими объектами через свойства languageID и countryID.У меня также есть SetupWizardType, поэтому я могу построить форму следующим образом:
$builder
->add('language', EntityType::class, [
'translation_domain' => 'labels',
'label' => 'label.languages',
'placeholder' => false,
'class' => Languages::class,
])
->add('country', EntityType::class, [
'translation_domain' => 'labels',
'label' => 'label.countries',
'placeholder' => false,
'class' => Countries::class
]);
Как вы можете видеть, в окончательной форме будет 2 поля выбора с их параметрами, и когда пользователь выбирает параметр изВыбор языков, запускается событие jquery, которое отправляет форму и передает задание моему контроллеру:
$entityManager = $this->getDoctrine()->getManager();
$setupWizard = $entityManager->getRepository(SetupWizard::class)->findSetup(1)
?? new SetupWizard();
$form = $this->createForm(SetupWizardType::class, $setupWizard);
$form->handleRequest($request);
$userLanguage = $form->get('language');
if ( $form->isSubmitted() ) {
$submittedData = $form->getData();
if( !empty($userLanguage->getData()) && empty($_POST['save']) ){
$setupWizard->setLanguage($userLanguage->getData());
$entityManager->persist($setupWizard);
$entityManager->flush();
return $this->redirectToRoute('wizard_index');
} elseif( $form->isValid() && !empty($_POST['save']) ) {
$entityManager->persist($submittedData);
$entityManager->flush();
return $this->redirectToRoute('app_homepage');
}
}
Что это делает?Ну, есть два случая, в первом была выбрана языковая опция, поэтому я сохраняю ее в БД, а на следующей странице загружает подписчик, проверяет его и меняет локаль, чтобы я мог отображать дополнительные поля / данные этой формы с помощьютребуемый язык. Во втором случае он проверяет, была ли заполнена вся форма и является ли она действительной, поэтому я могу вставить все значения в БД.
Почему я сделал это так?Я не знал лучшего способа, чтобы быть честным ... ajax находится вне предрассудков, потому что мне нужно, чтобы данные отображались на выбранном языке, и это возможно только посредством кодирования на стороне сервера ... я думаю. Если вы знаете лучший способделать это, пожалуйста, дайте мне знать.В чем проблема с моим кодом?В первом случае я хотел вставить только язык, вместо этого были добавлены все поля ... Это может быть потому, что я использовал поля EntityType, и когда я $entityManager->persist($setupWizard);
, он сохраняет весь объект. Есть способ сохранить толькозначение языка?
PS дайте мне знать, если вы думаете, что часть моего кода может быть преобразована в более качественную, что поможет мне узнать больше, так как я новичок в Symfony / doctrine.