時間、日付、選択、およびエンティティタイプのフィールドを持つ大きなフォームがあります。フォームはエンティティにリンクされていませんが、他のエンティティのフィールドを含んでいます。言い換えれば、私はdata_class
がFormTypeのOptionsResolverにありません。ここでSymfonyフォームの状態をデータベースにバックアップしてリストアする/または:データベースからフォームを事前入力する方法
私にformTypeです:私は、バックアップの形式のデータをすることができ、コントローラで(簡単にするためにただ一つのフィールドを示す)
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('company', EntityType::class, array(
'placeholder' => 'Companies',
'class' => 'AppBundle:Company',
'choice_label' => 'name',
'multiple' => true,
'query_builder' => function (EntityRepository $repository) {
return $repository->createQueryBuilder('c')->orderBy('c.name', 'ASC');
},
'required' => false
))
//... much more fields
}
public function configureOptions(OptionsResolver $resolver)
{
// This form is not linked to an Entity
// Therefore no `data_class`
}
。 FormStateが呼び出されました。 FormStateを次のようにデータベースに保存します。
namespace AppBundle\Controller;
class ReportController extends Controller
{
/** // ... */
public function listAction(Request $request)
{
$form = $this->createForm(ReportType::class);
$form->handleRequest($request);
// Save the form to a FormState
if ($form->isSubmitted() && $form->getClickedButton()->getName() == 'saveFormState') {
$formStateManager = $this->get('app.manager.form_state');
// Get form data that we want to save
$data = $form->getData();
$name = 'Stackoverflow example'; // give it a name
$formState = $formStateManager->createNewFormState(); // Create new FormState Entity object
$formState->setName($name);
$formState->setData($data);
$formStateManager->save($formState);
}
// ...
}
}
これはすべて上記の作業に最適です。しかし、今は面倒な部分ですが、バックアップデータをフォームに戻す必要があります。ユーザーはFormStatesのリストから以前のフォーム状態を選択できます。そして、ロードボタンを押してください。
フォームにロードしようとするFormStateオブジェクトのdata
属性は、$form->getData()
の結果に過ぎません。つまり、オブジェクトのない通常の配列です。たぶんそれは問題ですが、私はそれを何とかすることはできません。
そのdata
配列は、フォームにロードしようとしているので、値を取ります。私は$form->setData()
経由で試してみましたか、$this->createForm(ReportType::class, $data)
で新しいフォームを作成してみました。どちらも同じエラーメッセージ:Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
で失敗します。コントローラには、
最初の試み:
は、私がデータを追加する2つの方法を試してみました
namespace AppBundle\Controller;
class ReportController extends Controller
{
/** // ... */
public function listAction(Request $request)
{
if ($form->isSubmitted() && $form->getClickedButton()->getName() == 'loadFormState') {
// ...
$form = $this->createForm(ReportType::class, $formState->getData()); // <-- throws the error
$form->submit($formState->getData());
}
}
}
2回目の試行を、FormEvent加入者経由: 私はそれを行うとFormEventサブスクライバを介して、私は同じエラーが発生します。ここに私のコードは次のとおりです。
namespace AppBundle\Form\EventListener;
class ReportFieldsSubscriber implements EventSubscriberInterface
{
// ...
public static function getSubscribedEvents()
{
return array(
FormEvents::PRE_SUBMIT => array(
array('loadFormState'),
),
);
}
/**
* Load selected FormState in form
* @param FormEvent $event
*/
public function loadFormState(FormEvent $event)
{
$form = $event->getForm();
//...
// Choosen FormState
$formState = $formStateManager->findOneById($formStateId);
$formStateData = $formState->getData();
$form->setData($formStateData); // <-- Set data, trows error
// ...
}
}
私は両方のソリューションがエラーを投げて言ったように:Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
この場合、好ましい解決策は何ですか?ダミーのエンティティを作成してこの問題を修正することはできますが、少し醜いと感じられます。