Forms Symfony2-设置实体字段的选定值

Forms Symfony2-设置实体字段的选定值,forms,symfony,entity,selected,Forms,Symfony,Entity,Selected,我试图在实体字段中设置一个选定值。根据我所看到的关于此主题的许多讨论,我尝试设置数据选项,但默认情况下不会选择任何值: class EventType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('place', 'entity', array(

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

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();
    }
}

我现在有点卡住了,有人有什么想法吗?

为了在表单中显示选中的选项,您应该将相应的值设置为实体本身

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

您只需设置字段的数据:


    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()
            ));
        }
    }

类EventController扩展控制器
{
// ...
公共函数addAction()
{
$request=$this->getRequest();
$em=$this->getDoctrine()->getManager();
$event=新事件();
$form=$this->createForm(新的EventType(),$event);
// -------------------------------------------
//假设您有一个位置实体。。
$form->get('place')->setData($place);
//就这些。。
// -------------------------------------------
$formHandler=neweventhandler($form,$request,$em);
如果($formHandler->process()){
$this->get('session')->getFlashBag()->add('success',“L'vènement a bienétéajouté”);
返回$this->redirect($this->generateUrl('photo_event_list');
}
返回$this->render('RoyalMovePhotoBundle:Event:add.html.twig',数组(
'form'=>$form->createView()
));
}
}

当您使用
query\u builder
选项,并且
data
选项需要一个采集实例,并且您不想通过仅为某些字段添加
setdata
来触摸控制器时,并且您已经在表单类型类中拥有querybuilder和重新填充选项的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()方法中

编辑:真实用例示例

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

Label:你最喜欢的食物是什么?

4个复选框:意大利面、比萨饼、意大利面、牛排

您希望重新填充2个复选框:

比萨饼、牛排

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


$qb_filtered
将是一个新的附加QueryBuilder实例,带有重新填充的复选框
比萨饼、牛排
。所以是前一个的“过滤”版本。

对于
未映射的
实体选择字段,我发现最简单的方法是使用带有
可调用的
选项。这将迭代选择集合,并允许您根据条件添加自定义属性,并使用扩展、多个和自定义属性选项

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;
            }
       ))
       //...
    ;
}

事实上,很抱歉第一次评论,它确实有效,这是我的一个错误!事实上,我已经这样做了,但我忘了在问题中提到它。我已经编辑过了。谢谢你的帮助。我不记得了,但我想我以前已经试过了,但没有成功。好吧,我会接受这一回答,因为我现在不能尝试你的解决方案(我不再从事这个项目),这似乎是更符合逻辑的方式。请更好地解释这一点。什么是
$qb_all
,什么是
$qb_filtered
在一个真实的用例中?@bought777我在我的帖子中添加了一个编辑。现在更清楚了?
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;
            }
       ))
       //...
    ;
}