【发布时间】:2016-02-28 06:34:16
【问题描述】:
在我的示例中,我有四个实体要用于博客平台:Owner Post User Location
- 一个所有者可以有多个帖子
- 一个帖子可以有多个用户和位置
我正在尝试创建一个管理表单,我可以在其中从下拉菜单中选择 Owner,这将刷新表单 onChange 以填充 Posts的下拉菜单>。
当一个 Post 被选中时,表单再次刷新,表单字段 Users 和 Locations 与该帖子相关联。然后我可以:
- 使用更多信息(例如用户的出生日期或位置的 GPS 坐标)更新现有实体
- 创建任一实体的新实例以附加到 Post
我没有包含 Location 实体,也没有包含命名空间/包含语句,因为它们会影响我的主要问题,即如何在控制器/表单类型中编码这样的管理页面(我的尝试如下):
控制器:
/**
* @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(),
));
}
用户表单类型:
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';
}
}
【问题讨论】:
-
我建议你使用Ajax,你试过了吗?
-
感谢@Delphine,在开始使用 Symfony 之前我曾尝试过 Ajax - 老实说,我不确定如何在 Symfony 中使用 OO 框架和 twig 模板来实现 Ajax。你能指出我正确的方向吗?
标签: forms symfony doctrine-orm entity