web-dev-qa-db-ja.com

Symfony2-エンティティフィールドに選択した値を設定します

エンティティフィールド内に選択した値を設定しようとしています。このトピックについて私が見た多くの議論に従って、私は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();
    }
}

私は今少し立ち往生しています、アイデアを持っている人はいますか?

9
Nesk

フィールドのデータを設定するだけで済みます。


    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()
            ));
        }
    }
    
24
Andy.Diaz

オプションをフォームで選択して表示するには、対応する値をエンティティ自体に設定する必要があります。

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

non-mappedエンティティ選択フィールドの場合、私が最も簡単に見つけた方法は、 choice_attr オプションを使用することでした。 callable。これにより、選択肢のコレクションが繰り返され、条件に基づいてカスタム属性を追加できるようになり、拡張、複数、およびカスタム属性オプションが機能します。

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

query_builderオプションを使用し、dataオプションがコレクションインスタンスを予期している場合、しない特定のフィールドにのみsetDatasを追加してコントローラーにアクセスしたいが、既に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()メソッドで

'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は、チェックボックスPizza, Steakを再設定する新しい追加のQueryBuilderインスタンスになります。したがって、前のものの「フィルタリングされた」バージョン。

0
Fabian Picone