Symfony2 - Set a selected value for the entity field

前端 未结 4 659
忘了有多久
忘了有多久 2020-12-20 14:59

I\'m trying to set a selected value inside an entity field. In accordance with many discussions I\'ve seen about this topic, I tried to set the data option but

相关标签:
4条回答
  • 2020-12-20 15:19

    For non-mapped entity choice fields, the method I found easiest was using the choice_attr option with a callable. This will iterate over the collection of choices and allow you to add custom attributes based on your conditions and works with expanded, multiple, and custom attribute options.

    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;
                }
           ))
           //...
        ;
    }
    
    0 讨论(0)
  • 2020-12-20 15:26

    In order to option appear selected in the form, you should set corresponding value to entity itself.

    $place = $repository->find(2);
    $entity->setPlace($place);
    $form = $this->createForm(new SomeFormType(), $entity);
    ....
    
    0 讨论(0)
  • 2020-12-20 15:28

    You only need set the data of your field:

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

    0 讨论(0)
  • 2020-12-20 15:33

    When you use the query_builder option, and the data option expects an collection instance, and you don't want to touch your controller by adding setDatas for only certain fields, and you already have your querybuilder and the ids of the repopulating options in your form type class, you can repopulate a selection as following:

    // 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; 
    

    Then in your add() Method

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

    EDIT: Real use case example

    You want to repopulate a checkbox group rendered with following elements:

    Label: What is your favourite meal?

    4 Checkboxes: Pasta, Pizza, Spaghetti, Steak

    And you want to repopulate 2 Checkboxes:

    Pizza, Steak

    $qb_all would be a QueryBuilder instance with the all 4 selectable Checkboxes

    $qb_filtered would be a new additional QueryBuilder instance with the repopulating Checkboxes Pizza, Steak. So a "filtered" version of the previous one.

    0 讨论(0)
提交回复
热议问题