Как я могу сохранить данные в базе данных с помощью формы, загружаемой через ajax в symfony 4?

homepage.html.twig

<a class="load-form" href="{{ path('article_load_form', {slug:page.slug}) }}">Load my beautiful form</a>

<div  class="show-form">form will appear here</div>

  <script>
$( ".load-form" ).on( "click", function(e) {

        e.preventDefault();

        var $link = $(e.currentTarget);

        $.ajax({method:'POST', url: $link.attr('href')}).done(function(data){
          $('.show-form').html(data.output);

        });
      });
</script>

myController.php

 /**
  * @Route("/pages/{slug}/heart", name="article_load_form", methods={"POST"})
  */


     public function loadForm($slug, Request $request){

        $id = 9;

        $item = new User();

        $item= $this->getDoctrine()->getRepository(User::class)->find($id);
        $form = $this->createFormBuilder($item)
        ->add('username', TextType::class, array('attr' => array('class' => 'form-control')))
        ->add('email', EmailType::class, array('attr' => array('class' => 'form-control')))
        ->add('is_active', HiddenType::class)
        ->add('plainPassword', RepeatedType::class, array('type' => PasswordType::class,'invalid_message' => 'The password fields must match.','options' => array('attr' => array('class' => 'password-field')),'required' => false,'first_options'  => array('label' => 'Passwort', 'attr' => array('class' => 'form-control')),'second_options' => array('label' => 'Passwort wiederholen', 'attr' => array('class' => 'form-control')),))
        ->add('cancel', ButtonType::class, array('label' => 'Abbrechen','attr' => array('class' => 'cancel form-btn btn btn-default pull-right close_sidebar close_h')))
        ->add('save', SubmitType::class, array('label' => 'Speichern','attr' => array('class' => 'form-btn btn btn-info pull-right','style' => 'margin-right:5px')))
        ->getForm();
        $form->handleRequest($request);

        $response = new JsonResponse(
          array(
            'message' => 'Success',
            'output' => $this->renderView('form.html.twig',
            array(
              'entity' => $item,
              'form' => $form->createView(),
            ))), 200);

            return $response;

            if($form->isSubmitted() && $form->isValid()) {
              $entityManager = $this->getDoctrine()->getManager();
              $entityManager->flush();
            }

          }

Моя форма загружается, когда я нажимаю «Загрузить мою красивую форму» со всеми данными из базы данных для каждого поля. Так что это работает нормально. НО, когда я затем изменяю данные внутри формы (например, имя пользователя с «leo» на «alan») и нажимаю кнопку «Сохранить», данные не сохраняются в базе данных (имя пользователя по-прежнему остается «leo»).

В профилировщике параметры POST верны. Но никаких форм по этому запросу не было.

Пожалуйста, я буду очень рад, если вы скажете, почему я проголосовал против. Потому что я действительно не нахожу решения. И я опубликовал свой подход. Сообщений об ошибках нет, поэтому я не мог опубликовать ошибки.

peace_love 10.08.2018 17:04
1
1
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Действие вернет ответ до того, как будет достигнут следующий блок

    if($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->flush();
    }

Таким образом, в БД ничего не будет храниться.

тогда посмотрим, что вы пытаетесь сделать, вы пытаетесь получить свою красоту с помощью ajax и поместить ее в свою загрузочную форму, поэтому вам нужно сначала использовать метод get, method: 'GET',

после этого вам понадобится другой метод ajax для загрузки ваших данных на сервер с помощью сообщения

$('#submit-my-beautiful-form').click(function(e){
        e.preventDefault();
        var form = $(this).closest('form');
        var formData = form.serialize(); 
        alert(formData);         
        $.ajax({
            method:'POST',
            url: $link.attr('href'),
            data: formData,
            success: function(data){
                alert(data);
            }
        });
})

ps: данные вашей формы будут сериализованы и затронуты переменной formData, а затем загружены на сервер ps: вам нужно добавить идентификатор к вашей кнопке сохранения:

 ->add('save', SubmitType::class, array('label' => 'Speichern','attr' => array('id' => 'submit-my-beautiful-form', 'class' => 'form-btn btn btn-info pull-right','style' => 'margin-right:5px')))

ps: не забудьте сохранить свой объект $ item

$entityManager->persist($item);

Спасибо. Итак, что я могу сделать, чтобы его сохранить?

peace_love 10.08.2018 16:33

Я пытался установить этот блок перед блоком ответа json. Но это не решило проблему

peace_love 10.08.2018 16:34

вам нужно сохранить свой объект перед его очисткой, потому что вы только что создали его экземпляр, $ entityManager = $ this-> getDoctrine () -> getManager (); $ entityManager-> персистировать ($ item); $ entityManager-> flush ();

Jabri Amine 10.08.2018 17:13

Спасибо! Я тестировал $entityManager->persist($item);, но данные по-прежнему не сохраняются

peace_love 10.08.2018 17:15

Для этого запроса не было отправлено никаких форм.

peace_love 10.08.2018 17:19

Другие вопросы по теме