Хобрук: Ваш путь к мастерству в программировании

Форма Symfony2 обновляет ту же страницу после отправки

У меня есть форма, содержимое которой создается из БД.

в моем контроллере у меня есть:

/**
 * @Route("/HR/manage/{projectID}", name="hr_manage")
 */
public function manageHRAction(Request $request, $projectID)
{
//here I get all the data from DB and create the form
if ($form->isValid()) 
    {
    //here I do all the relevant changes in the DB
    return $this->render('HR/show.html.twig', array('hrlist' => $HRsInMyDomain, 'form' => $form->createView(), 'HRs' => $HRsInThisProject, 'project' => $prj, ));
    }
return $this->render('HR/show.html.twig', array('hrlist' => $HRsInMyDomain, 'form' => $form->createView(), 'HRs' => $HRsInThisProject, 'project' => $prj, ));
}

Он правильно обновляет информацию в БД, но не строит снова форму с обновленными данными. Вместо возврата внутри isValid() мне просто нужно обновить текущую страницу.

Я предполагаю, что это возможно и легко сделать, но мне не удалось найти, как это сделать :/

РЕДАКТИРОВАТЬ - здесь идет более актуальный код:

/**
 * @Route("/HR/manage/{projectID}", name="hr_manage")
 */
public function manageHRAction(Request $request, $projectID)
{
$user = $this->container->get('security.context')->getToken()->getUser(); //get current user
$em = $this->getDoctrine()->getManager(); //connect to DB
$prj = $this->getDoctrine()->getRepository('AppBundle:Project')->findOneById($projectID);
[...]
// here comes some code to generate the list of $HRsInThisProject and the list of roles ($rolesListForForm)
[...]
foreach ($HRsInThisProject as $key => $HR)
    {
    $form->add('roleOf_'.$key, 'choice', array('choices'   => $rolesListForForm, 'required'  => true, 'data' => $HR['role'], 'label' => false, ));
    $form->add('isActive_'.$key, 'choice', array('choices'   => [0 => 'Inactive', 1 => 'Active'] , 'required'  => true, 'data' => $HR['is_active'], 'label' => false, ));
    }
[...]
// here there is some code to get the $HRsInMyDomainForForm
[...]
$form->add('HRid', 'choice', array('choices' => $HRsInMyDomainForForm,'required' => false, 'placeholder' => 'Choose a resource', 'label' => false, ));
$form->add('role', 'choice', array('choices' => $rolesListForForm,'required' => false, 'placeholder' => 'Choose a role', 'label' => false, ));            
$form->add('save', 'submit', array('label' => 'Save'));     

$form->handleRequest($request);

if ($form->isValid()) 
    {
        {
        [...] here there is a huge portion of code that determines if I need to generate a new "event" to be stored, or even multiple events as I can change several form fields at once

        // If I needed to create the event I persist it (this is inside a foreach)
        $em->persist($newHREvent);
        }
    $em->flush();
    return $this->render('HR/show.html.twig', array('projectID' => $prj->getId(), 'hrlist' => $HRsInMyDomain, 'form' => $form->createView(), 'HRs' => $HRsInThisProject, 'project' => $prj, ));
    }
return $this->render('HR/show.html.twig', array('projectID' => $prj->getId(), 'hrlist' => $HRsInMyDomain, 'form' => $form->createView(), 'HRs' => $HRsInThisProject, 'project' => $prj, ));
}

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

Если пользователь решит добавить новый ресурс, мне нужно сохранить его в БД (и это делается правильно), но затем мне нужно увидеть его в списке доступных HR без необходимости пользователю перезагружать страницу.


  • вам, вероятно, нужно показать свой полный код. 27.12.2014
  • Готово, смотрите обновленный вопрос 28.12.2014

Ответы:


1

Более динамичный способ:

$request = $this->getRequest();

return $this->redirectToRoute($request->get('_route'), $request->query->all());

или просто

return $this->redirect($request->getUri());
09.05.2016
  • Да, я использую return $this->redirect($request->getUri()); 20.04.2017
  • @Aistis Это решает мою проблему. Но может ли кто-нибудь указать, почему именно это происходит? 04.12.2018

  • 2

    Мне удалось решить ее простым (и, надеюсь, правильным) способом.

    Я просто заменил «рендеринг» внутри isValid() следующим:

    return $this->redirect($this->generateUrl('hr_manage', array('projectID' => $prj->getId())));
    

    У меня работает, но кто-нибудь предвидит проблемы с этим решением?

    28.12.2014
  • В этом нет ничего плохого. Вот как я перенаправляюсь при успешной отправке формы. 29.12.2014

  • 3

    Вы должны связать форму с запросом.

    $entity = new Entity();
    $form = $this->createFormBuilder($entity)
        ->add('field1', 'text')
        ->add('field2', 'date')
        ->add('save', 'submit', array('label' => 'Submit'))
        ->getForm();
    $form->handleRequest($request); // <= this links the form to the request.
    

    только после этого вы тестируете $form->isValid() и передаете эту форму при рендеринге шаблона. Если вы уже сделали это и не включили приведенный выше код, пожалуйста, покажите больше кода для лучшей справки.

    27.12.2014

    4

    Вот правильный способ сделать это. Событие, хотя у вас есть $projectId слаг, в Action вы можете пройти все Object, в данном случае Project. Symfony позаботится обо всем остальном (выберет для вас правильный Project объект.

    /**
     * @Route("/HR/manage/{projectID}", name="hr_manage")
     */
    public function manageHRAction(Request $request, Project $project)
    {
        $form = $this->createForm(new ProjectType(), $project);
        $form->handleRequest($request);
    
        // ... your business logic or what ever
    
        //here I get all the data from DB and create the form
        if ($form->isValid() && $form->isSubmitted()) {
            $em->persist($project);
            // no need to flush since entity already exists
            // no need to redirect
        }
    
        // here $form->createView() will populate fields with data since you have passed Poroject $project to form
        return $this->render('HR/show.html.twig', array('hrlist' => $HRsInMyDomain, 'form' => $form->createView(), 'HRs' => $HRsInThisProject, 'project' => $prj, ));
    }
    

    Обновлять

    Согласно вашему редактированию, вам нужно использовать javascript для манипулирования домом на стороне клиента. Проверьте эту ссылку из официального документа Symfony встроенные формы. Здесь вы найдете пример того, чего вы пытаетесь достичь.

    27.12.2014
  • Проблема в том, что моя форма создается динамически. Я обновлю свой пост с дополнительной информацией. 28.12.2014
  • Это кажется немного запутанным и, вероятно, излишним. Все, что мне нужно, это обновление :/ 28.12.2014
  • Вы сказали, что не хотите обновлять страницу. 28.12.2014
  • Наверное, меня неправильно поняли, в первом посте я написал, что мне просто нужно обновить текущую страницу, а ниже в одном из комментариев я написал ... без необходимости перезагрузки страницы пользователем. Я имел в виду, что мне нужно обновление, но я не хочу быть пользователем, выполняющим его вручную. 28.12.2014
  • Тем не менее вы можете использовать код, который я опубликовал, для достижения того, чего вы хотите. 28.12.2014
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..