2015-11-25 60 views
0

在我的例子,我有我想要使用一個博客平臺四個實體:所有者帖子用戶位置如何構建Symfony來檢查`onChange`下拉字段?

  • 所有者可以有多個帖子
  • A 可以有多個用戶位置

我試圖創建一個管理員的形式,我可以從下拉菜單中選擇所有者,這將刷新表單onChange填充帖子的下拉菜單。

郵政然後選擇,形式再次用表單字段用戶關聯到該柱位置刷新。我可以然後:

  1. 更新更多的信息,現有的實體(例如用戶的出生日期或地點的GPS座標)
  2. 創建任何一個實體的新實例附加到郵政

我還沒有包含位置實體並沒有包含名稱空間/包含語句,因爲它們會降低我如何在控制器/ Formtypes中編寫這樣一個管理頁面的主要問題(我的嘗試如下):

控制器:

/** 
* @Route("/adminposts", name="admin_posts") 
*/ 
public function updatePostsAction(Request $request) 
{ 
    $user = new User(); 
    $form = $this->createForm(new UserType(), $user); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($owner); 
     $em->persist($post); 
     $em->persist($user); 
     $em->persist($location); 
     $em->flush(); 
     return $this->redirectToRoute('homepage'); 
    } 
    return $this->render('AppBundle:Default:adminupdate.post.html.twig', array(
     'form' => $form->createView(), 
)); 
} 

用戶Formtype:

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('owner','entity',array(
        'class'=>'AppBundle:Owner', 
        'choice_label'=>'username', 
        'query_builder'=>function(EntityRepository $er) { 
         return $er->createQueryBuilder('d') 
          ->orderBy('d.username','ASC'); 
        })) 

      ->add('post','entity',array(
        'class'=>'AppBundle:Post', 
        'choice_label'=>'posttext', 
        'query_builder'=>function(EntityRepository $er) { 
         return $er->createQueryBuilder('d') 
          ->orderBy('d.postdate','ASC'); 
        })) 

      ->add('Firstname') 
      ->add('Surname') 
      ->add('DOB') 
      ->getForm(); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Users', 
     )); 
    } 

    public function getName() 
    { 
     return 'user'; 
    } 
} 
+0

我建議你使用Ajax,你有試過嗎? – Delphine

+0

謝謝@Delphine,我在開始使用Symfony之前曾嘗試過Ajax - 說實話,我不確定我將如何在Symfony中實現Ajax以及OO框架和樹枝模板。你能指出我正確的方向嗎? – Bendy

回答

0

好吧,也許你可以在這裏看看:Symfony2: Change choices with ajax and validation或按我的方法:

在您的用戶類型:

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('owner','entity',array(
       'class'=>'AppBundle:Owner', 
       'choice_label'=>'username', 
       'query_builder'=>function(EntityRepository $er) { 
        return $er->createQueryBuilder('o') 
         ->orderBy('o.username','ASC'); 
       })) 

      ->add('Firstname') 
      ->add('Surname') 
      ->add('DOB'); 

     // Add listeners for Post field 
     $builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData')); 
     $builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmit')); 
    } 


    protected function addElements(FormInterface $form, $owner = null) 
    { 
     if($owner){ 
      $form->add('post','entity',array(
       'class'=>'AppBundle:Post', 
       'choice_label'=>'posttext', 
       'query_builder'=>function(EntityRepository $er, $owner) { 
        return $er->createQueryBuilder('p') 
         ->join('p.owner', 'o') 
         ->where('o.id = :ownerID') 
         ->setParameter('ownerID', $owner->getID()) 
         ->orderBy('d.postdate','ASC'); 
       })); 
     } 
     else{ 
      $form->add('post','choice',array(
       'choice_label'=>'posttext', 
       'empty_value' => '-- Choose --', 
       'choices' => array()) 
      ); 
     } 
    } 

    public function onPreSubmit(FormEvent $event) 
    { 
     $form = $event->getForm(); 
     $data = $event->getData(); 

     $this->addElements($form, $data->getOwner()); 
    } 

    public function onPreSetData(FormEvent $event) 
    { 
     /** @var User user */ 
     $user = $event->getData(); 
     $form = $event->getForm(); 

     $this->addElements($form, $user->getOwner()); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Users', 
     )); 
    } 

    public function getName() 
    { 
     return 'user'; 
    } 
} 

我假設你知道如何在jQuery(我使用它)和ajax調用中創建onChange事件。

只是爲了提醒,在您看來:

{{ form_row(
     form.owner, 
     { 
      'attr': {    
       'data-owner-id': ""~form.owner.vars.id, 
       'class': "change-posts-per-owner", 
      } 
     } 
    ) }} 
    {{ form_row(form.post) }} 
    {{ form_row(form.firstname) }} 
    {{ form_row(form.surname) }} 
    {{ form_row(form.DOB) }} 

和你的Ajax腳本:

您還可以使用$.post()$.get(),而不是明確的方法$.ajax(); 我sugget你使用FOSJSRoutingBundle用Routing.generate()方法顯示你的網址。

+0

謝謝你這麼徹底的回答:)我可以在週末嘗試一下,回到你身邊! – Bendy

+0

我更新了我的帖子,以糾正一些錯誤 – Delphine

+0

這是非常友好的謝謝你:-)期待着試試....! – Bendy