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