【问题标题】:Symfony2 - Set a selected value for the entity fieldSymfony2 - 为实体字段设置选定值
【发布时间】:2013-04-01 21:21:40
【问题描述】:

我正在尝试在实体字段中设置选定的值。根据我看到的有关此主题的许多讨论,我尝试设置 data 选项,但默认情况下不会选择任何值:

class EventType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('place', 'entity', array(
                'class' => 'RoyalMovePhotoBundle:Place',
                'property' => 'name',
                'empty_value' => "Choisissez un club",
                'mapped' => false,
                'property_path' => false,
                'data' => 2
            ))
            ->add('begin')
            ->add('end')
            ->add('title')
            ->add('description')
        ;
    }

    // ...
}

通过查找更多信息,我发现有些人不得不停用到实体的表单映射。这似乎合乎逻辑,所以我尝试将'mapped' => false 添加到选项中,但没有成功...

如果有帮助,这是我的控制器:

class EventController extends Controller
{
    // ...

    public function addAction()
    {
        $request = $this->getRequest();
        $em = $this->getDoctrine()->getManager();

        $event = new Event();
        $form = $this->createForm(new EventType(), $event);

        $formHandler = new EventHandler($form, $request, $em);

        if($formHandler->process()) {
            $this->get('session')->getFlashBag()->add('success', "L'évènement a bien été ajouté.");
            return $this->redirect($this->generateUrl('photo_event_list'));
        }

        return $this->render('RoyalMovePhotoBundle:Event:add.html.twig', array(
            'form' => $form->createView()
        ));
    }
}

还有EventHandler 类:

class EventHandler extends AbstractHandler
{
    public function process()
    {
        $form = $this->form;
        $request = $this->request;

        if($request->isMethod('POST')) {
            $form->bind($request);

            if($form->isValid()) {
                $this->onSuccess($form->getData());
                return true;
            }
        }

        return false;
    }

    public function onSuccess($entity)
    {
        $em = $this->em;

        $em->persist($entity);
        $em->flush();
    }
}

我现在有点卡住了,有没有人有想法?

【问题讨论】:

    标签: forms symfony entity selected


    【解决方案1】:

    你只需要设置你的字段的数据:

    class EventController extends Controller { // ... public function addAction() { $request = $this->getRequest(); $em = $this->getDoctrine()->getManager(); $event = new Event(); $form = $this->createForm(new EventType(), $event); // ------------------------------------------- // Suppose you have a place entity.. $form->get('place')->setData($place); // That's all.. // ------------------------------------------- $formHandler = new EventHandler($form, $request, $em); if($formHandler->process()) { $this->get('session')->getFlashBag()->add('success', "L'évènement a bien été ajouté."); return $this->redirect($this->generateUrl('photo_event_list')); } return $this->render('RoyalMovePhotoBundle:Event:add.html.twig', array( 'form' => $form->createView() )); } }

    【讨论】:

    • 我不记得了,但我想我之前已经尝试过,但没有成功。好吧,我会接受这个作为回应,因为我目前无法尝试您的解决方案(我不再从事这个项目了),这似乎是更合乎逻辑的方式。
    【解决方案2】:

    为了使选项出现在表单中,您应该为实体本身设置相应的值。

    $place = $repository->find(2);
    $entity->setPlace($place);
    $form = $this->createForm(new SomeFormType(), $entity);
    ....
    

    【讨论】:

    • 实际上,很抱歉第一次发表评论,它确实有效,这是我这边的一个错误!
    • 事实上,我已经这样做了,但忘了在问题中提及它。我已经编辑过了。感谢您的帮助。
    【解决方案3】:

    对于 non-mapped 实体选择字段,我发现最简单的方法是使用带有callablechoice_attr 选项。这将遍历选择的集合,并允许您根据自己的条件添加自定义属性,并使用扩展、多个和自定义属性选项。

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('place', 'entity', array(
                //...
                'choice_attr' => function($place) {
                    $attr = [];
                    if ($place->getId() === 2) {
                        $attr['selected'] = 'selected';
                        //for expanded use $attr['checked'] = 'checked';
                     }
                     return $attr;
                }
           ))
           //...
        ;
    }
    

    【讨论】:

      【解决方案4】:

      当您使用query_builder 选项,并且data 选项需要一个集合实例,并且您不想只希望通过为某些字段添加setDatas 来触摸您的控制器时,并且您已经在表单类型类中拥有查询构建器和重新填充选项的 ID,您可以按以下方式重新填充选择:

      // Querybuilder instance with filtered selectable options
      $entities = $qb_all; 
      // Querybuilder instance filtered by repopulating options (those that must be marked as selected)
      $entities_selected = $qb_filtered; 
      

      然后在你的 add() 方法中

      'data' => $entities_selected->getQuery()->getResult(), // Repopulation
      'query_builder' => $entities,
      

      编辑:真实用例示例

      您想重新填充使用以下元素呈现的复选框组:

      Label: What is your favourite meal?

      4 Checkboxes: Pasta, Pizza, Spaghetti, Steak

      并且您想重新填充 2 个复选框:

      Pizza, Steak

      $qb_all 将是一个具有所有 4 个可选复选框的 QueryBuilder 实例

      $qb_filtered 将是一个新的附加 QueryBuilder 实例,其中包含重新填充的复选框 Pizza, Steak。所以是前一个的“过滤”版本。

      【讨论】:

      • 请解释清楚。在实际用例中,$qb_all 是什么,$qb_filtered 是什么?
      • @bought777 我在帖子中添加了一个编辑。现在更清楚了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多