私はSymfony2フレームワーク(特にSymfony 2.7)を使用しています。私の質問はフォーム構築に関連しています。Symfony2フォーム:フォームの値に応じてデフォルトのオプションを設定します
私はという場所というエンティティを持っています。これは私のプロジェクトの他の多くのエンティティに関連付けることができます。そこで、私はアプリケーションの多くの部分で再利用できるカスタムフォームタイプを作成しました。
class PlacesType extends AbstractType
{
private $security_context;
public function __construct(SecurityContext $security_context)
{
$this->security_context = $security_context;
}
public function configureOptions(OptionsResolver $resolver)
{
$user = $this->security_context->getToken()->getUser();
parent::configureOptions($resolver);
$resolver->setDefaults(array(
'class' => 'AppBundle\Entity\Places',
'query_builder' => function (EntityRepository $repository) use ($user)
{
return $repository->queryPlacesForUser($user);
},
));
}
public function getParent()
{
return 'entity' ;
}
public function getName()
{
return 'places';
}
}
事実が場所はソフトに除去することが可能である(私はクラス内部フラグを削除設定しました)。したがって、新しいエンティティはアクティブな場所にのみ関連付けることができますが、古いエンティティは現在削除された場所との関連付けを維持できます。
このため、私は場所がすでに親のフォームデータに関連付けられた場合を除きqueryPlacesForUser機能は、唯一アクティブ場所を返すことにしたいです。このような
何か:残念ながら
public function configureOptions(OptionsResolver $resolver)
{
// ...
$currdata = $this->getForm()->getData(); // pseudo-code, this does not work
$resolver->setDefaults(array(
'class' => 'AppBundle\Entity\Places',
'query_builder' => function (EntityRepository $repository) use ($user)
{
return $repository->queryPlacesForUser($user, $currdata);
},
));
}
、私はオプションリゾルバから現在のデータを取得する方法を見当もつかない。フォームのbuildForm関数内の現在のデータを取得することは可能ですが、内部でフォームオプションを設定することはできません。
フォームに渡されたデータを使用してフォームのデフォルトオプションを設定できる方法はありますか?
あなたは*あなたがしているあなたのコード内のその時点で*必要な構成データを注入することをいとわないだろうこのカスタムフォームタイプを使用していますか? – Yoshi
いいえ、私はそれについて考えましたが、あなたは共有フォームタイプを持つ利点を失います。 – Alberto
正直なところ、それがあなたの唯一の選択だと思う。そして、それはフォームデータを注入するのとはまったく異なりますか?私が意味することを示す答えを追加します。 – Yoshi