エンティティフィールド内に選択した値を設定しようとしています。このトピックについて私が見た多くの議論に従って、私は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();
}
}
私は今少し立ち往生しています、アイデアを持っている人はいますか?
フィールドのデータを設定するだけで済みます。
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()
));
}
}
オプションをフォームで選択して表示するには、対応する値をエンティティ自体に設定する必要があります。
$place = $repository->find(2);
$entity->setPlace($place);
$form = $this->createForm(new SomeFormType(), $entity);
....
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;
}
))
//...
;
}
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インスタンスになります。したがって、前のものの「フィルタリングされた」バージョン。