次の方法でフォームを作成しています。
$form = $this->createFormBuilder($breed)
->add('species', 'entity', array(
'class' => 'BFPEduBundle:Item',
'property' => 'name',
'query_builder' => function(ItemRepository $er){
return $er->createQueryBuilder('i')
->where("i.type = 'species'")
->orderBy('i.name', 'ASC');
}))
->add('breed', 'text', array('required'=>true))
->add('size', 'textarea', array('required' => false))
->getForm()
種リストボックスのデフォルト値を設定するにはどうすればよいですか?
ご回答いただきありがとうございます、申し訳ありませんが、質問を言い換えるべきだと思います。モデルから値を取得したら、種選択リストの対応する値にその値をSELECTED = "yes"として設定するにはどうすればよいですか?
したがって、TWIGビューからの選択オプションの出力は次のようになります。
<option value="174" selected="yes">Dog</option>
Cristian's ソリューションを使用する場合は、FormTypeクラスにEntityManager
を挿入する必要があります。簡単な例を次に示します。
class EntityType extends AbstractType{
public function __construct($em) {
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options){
$builder
->add('MyEntity', 'entity', array(
'class' => 'AcmeDemoBundle:Entity',
'property' => 'name',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('e')
->orderBy('e.name', 'ASC');
},
'data' => $this->em->getReference("AcmeDemoBundle:Entity", 3)
));
}
}
そしてコントローラー:
// ...
$form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity);
// ...
Doctrine Docs から:
メソッドEntityManager#getReference($ entityName、$ identifier)を使用すると、データベースからそのエンティティをロードすることなく、識別子が既知のエンティティへの参照を取得できます。これは、たとえば、識別子を持っているエンティティへの関連付けを確立する場合のパフォーマンスの向上として役立ちます。
'data'属性からデフォルト値を定義できます。これは、抽象「フィールド」タイプの一部です( http://symfony.com/doc/2.0/reference/forms/types/field.html )
$form = $this->createFormBuilder()
->add('status', 'choice', array(
'choices' => array(
0 => 'Published',
1 => 'Draft'
),
'data' => 1
))
->getForm();
この例では、「ドラフト」がデフォルトの選択値として設定されます。
解決策:タイプエンティティの場合、オプション「data」を使用しますが、値はオブジェクトです。すなわち:
$em = $this->getDoctrine()->getEntityManager();
->add('sucursal', 'entity', array
(
'class' => 'TestGeneralBundle:Sucursal',
'property'=>'descripcion',
'label' => 'Sucursal',
'required' => false,
'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)
))
たとえば、私が持っている私のフォームでは、単に$breed->setSpecies($species)
を使用する必要があると思います。
$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);
これにより、デフォルトの選択が現在の日付に設定されます。外部エンティティに対しても同じように機能するはずです...
Doctrineエンティティの配列を渡したい場合は、次のようなものを試してください(Symfony 3.0以降):
protected $entities;
protected $selectedEntities;
public function __construct($entities = null, $selectedEntities = null)
{
$this->entities = $entities;
$this->selectedEntities = $selectedEntities;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('entities', 'entity', [
'class' => 'MyBundle:MyEntity',
'choices' => $this->entities,
'property' => 'id',
'multiple' => true,
'expanded' => true,
'data' => $this->selectedEntities,
]);
}
data
オプションを使用する必要はないと思います。これは、デフォルト値を設定するだけではないためです。また、作成中にフォームに渡されるデータをオーバーライドします。したがって、基本的には、その機能のサポートを中断しています。 -ユーザーにデータを作成させる場合は重要ではありませんが、データを更新するために(いつか)フォームを使用する場合は重要です。
http://symfony.com/doc/current/reference/forms/types/choice.html#data を参照してください
フォーム作成中にデフォルトのデータを渡す方が良いと思います。コントローラー内。
たとえば、クラスを渡して、クラス自体でデフォルト値を定義できます。 (デフォルトのSymfony\Bundle\FrameworkBundle\Controller\Controller
を使用する場合)
$form = $this->createForm(AnimalType::class, [
'species' => 174 // this id might be substituted by an entity
]);
またはオブジェクトを使用する場合:
$dog = new Dog();
$dog->setSpecies(174); // this id might be substituted by an entity
$form = $this->createForm(AnimalType::class, $dog);
工場を使用する場合はさらに良い:(おそらく犬は動物から伸びる)
$form = $this->createForm(AnimalType::class, DogFactory::create());
これにより、フォームの構造とコンテンツを互いに分離し、より多くの状況でフォームを再利用できるようになります。
または、preferred_choices
オプションを使用しますが、これにはデフォルトオプションをフォームの最上部に移動するという副作用があります。
参照: http://symfony.com/doc/current/reference/forms/types/choice.html#preferred-choices
$builder->add(
'species',
'entity',
[
'class' => 'BFPEduBundle:Item',
'property' => 'name',
'query_builder' => ...,
'preferred_choices' => [174] // this id might be substituted by an entity
]
);
フォームクラスを使用してフォームを作成するときに、Symfonyがリスト内の正しいオプションを選択するのを面倒見て、ここで何が間違っているのかわかりません。動作する私のフォームの1つの例を次に示します。
編集アクションのコントローラーで:
$entity = $em->getRepository('FooBarBundle:CampaignEntity')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find CampaignEntity entity.');
}
$editForm = $this->createForm(new CampaignEntityType(), $entity);
$deleteForm = $this->createDeleteForm($id);
return $this->render('FooBarBundle:CampaignEntity:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
キャンペーンエンティティタイプクラス(src:Foo\BarBundle\Form\CampaignEntityType.php):
namespace Foo\BarBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;
class CampaignEntityType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('store', 'entity', array('class'=>'FooBarBundle:Store', 'property'=>'name', 'em'=>'my_non_default_em','required' => true, 'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('s')->orderBy('s.name', 'ASC');}))
->add('reward');
}
public function getName()
{
return 'foo_barbundle_campaignentitytype';
}
}
Symfony2ラジオボタンのデフォルトの選択肢を設定する
$builder->add('range_options', 'choice', array(
'choices' => array('day'=>'Day', 'week'=>'Week', 'month'=>'Month'),
'data'=>'day', //set default value
'required'=>true,
'empty_data'=>null,
'multiple'=>false,
'expanded'=> true
))
ドキュメントから:
public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())
mixed $ data = nullはデフォルトのオプションです。たとえば、statusというフィールドがあり、そのように実装しました。
$default = array('Status' => 'pending');
$filter_form = $this->get('form.factory')->createNamedBuilder('filter', 'form', $default)
->add('Status', 'choice', array(
'choices' => array(
'' => 'Please Select...',
'rejected' => 'Rejected',
'incomplete' => 'Incomplete',
'pending' => 'Pending',
'approved' => 'Approved',
'validated' => 'Validated',
'processed' => 'Processed'
)
))->getForm();
フォームは、選択したエンティティ選択フィールドにspecies-> id値を自動的にマッピングする必要があります。たとえば、「breed_species」という名前の結合テーブル内のSpeciesエンティティとOnetoOne関係を持つBreedエンティティがある場合:
class Breed{
private $species;
/**
* @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed")
*/
private $breedSpecies;
public function getSpecies(){
return $breedSpecies->getSpecies();
}
private function getBreedSpecies(){
return $this->$breedSpecies;
}
}
フォームクラスのフィールド「species」は、フォームに渡されるBreedクラスの「species」属性オブジェクトから、species-> idの値を取得する必要があります。
または、SetData()を使用して種エンティティを明示的にフォームに渡すことで、値を明示的に設定できます。
$breedForm = $this->createForm( new BreedForm(), $breed );
$species = $breed->getBreedSpecies()->getSpecies();
$breedForm->get('species')->setData( $species );
return $this->render( 'AcmeBundle:Computer:edit.html.twig'
, array( 'breed' => $breed
, 'breedForm' => $breedForm->createView()
)
);
このフォームで編集するモデルに正しいデフォルト値を定義するか、コードが次のようになるようにempty_dataオプションを指定できます。
$form = $this
->createFormBuilder($breed)
->add(
'species',
'entity',
array(
'class' => 'BFPEduBundle:Item',
'property' => 'name',
'empty_data' => 123,
'query_builder' => function(ItemRepository $er) {
return $er
->createQueryBuilder('i')
->where("i.type = 'species'")
->orderBy('i.name', 'ASC')
;
}
)
)
->add('breed', 'text', array('required'=>true))
->add('size', 'textarea', array('required' => false))
->getForm()
;