Во-первых, вам нужно привязать вашу форму к вашему классу тегов. Итак, в TagType.php у вас будет:
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'data_class' => Tag::class,
'csrf_token_id' => 'tag_form'
]);
}
Есть много способов реализовать желаемую функциональность. Например, вы можете найти все теги в вашей базе данных, перечислить их и с помощью кнопок редактирования отредактировать каждый нужный тег. Тогда у вас также будет кнопка «Создать» для создания новых тегов.
Но так, как вы решили его реализовать, вам не нужно отправлять форму при смене пользователя или адреса. Все, что вам нужно, это создать функцию javascript следующим образом:
function onChange(){
var userId = $('input#user_input').val();
var addressId = $('input#address_input').val();
$.post( "check-tag", { user: userId, address: addressId }).done(function( data ) {
if (data.tagText !== ""){
$( "input#text_input" ).val( data.tagText );
}
});
}
Затем привяжите ваши обработчики событий следующим образом:
$('input#user_input, input#address_input').on('change', function() {
onChange();
});
Ваш контроллер для маршрута 'check-tag' должен выглядеть следующим образом:
/**
* @Route("/check-tag", name="check-tag", options={ "expose" = true })
*/
public function checkTag(Request $request, EntityManagerInterface $em) {
$userId = $request->request->get('user');
$addressId = $request->request->get('address');
$tagRepository = $em->getRepository(Tag::class);
$tag = $tagRepository->findBy(['user' => $userId, 'address' => $addressId]);
$tagText = $tag ? $tag->getText() : '';
return $this->json(['tagText' => $tagText]);
}
Наконец, вы можете правильно заполнить форму, когда будете готовы. Нет необходимости в проверке и т. Д., Когда вам просто нужно проверить, существует ли тег, и получить его текст.
ПРИМЕЧАНИЯ:
- Код выше предполагает, что вы используете доктрину для обработки вашего соединения с базой данных. В противном случае просто измените код правильно.
- Вы должны использовать FOSJsRoutingBundle для генерации маршрутов в javascript вместо их жесткого кодирования, как в моем примере. Вот где в моей конфигурации маршрута используется опция expose = true.
- Вам придется еще раз проверить, существует ли тег в вашем контроллере, где вы обрабатываете отправку формы, в противном случае вы получите сообщение об ошибке доктрины для повторной вставки при попытке сохранить уже существующий тег.
- Конечно, вам придется немного изменить мой код, особенно если вы не используете jQuery.