2014-12-27 3 views
2

У меня есть форма, содержимое которой создается из БД.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()» мне просто нужно обновить текущую страницу.

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

EDIT - здесь идет более соответствующий код:

/** 
* @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,)); 
} 

Я также включать скриншот из форма: enter image description here

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

+1

вам, вероятно, нужно, чтобы показать свой полный код. –

+0

Выполнено, см. Обновленный вопрос –

ответ

0

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

$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() и передаете эту форму при рендеринге шаблона. Если вы уже сделали это и не включили в код выше, пожалуйста, показать больше кода для лучшей помощи.

+0

Я делаю это, см. Мой обновленный вопрос –

0

Это правильный способ сделать это. Если у вас есть $projectId slug, в Action вы можете передать весь Object, в данном случае Project. Symfony будет заботиться для отдыха (Fetching правого 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,)); 
} 

Update

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

+0

Проблема в том, что моя форма создается динамически. Я обновляю свой пост с дополнительной информацией. –

+0

Кажется немного запутанным и, вероятно, излишним. Все, что мне нужно, это обновление:/ –

+0

Вы сказали, что не хотите обновлять страницу. –

3

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

Я просто сменил «вынести» внутри IsValid() со следующим:

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

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

+0

Нет ничего плохого в этом. Именно так я перенаправляю на успешные формы. –

5

Более динамичный путь будет:

$request = $this->getRequest(); 

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

или просто

return $this->redirect($request->getUri()); 
+0

Да, я использую 'return $ this-> redirect ($ request-> getUri());' – rybo111

Смежные вопросы