2017-12-06 17 views
2

不明な理由があるため、列の名前が一致してデータが通過しても、EntityTypeフォームフィールドには選択されたオプションが表示されません。Symfony 3.3 Form - EntityTypeフィールドでオプションが選択されない

私は、製品のリストをフィルタリングするいくつかの値を選択するために使用しているフォームを作成しました。

<?php namespace AppBundle\Filter; 

use AppBundle\Entity\ProductCategory; 
use AppBundle\Repository\ProductCategoryRepository; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class ProductFilterType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('id', null, [ 
       'required' => false, 
       'label'  => 'SKU' 
      ]) 
      ->add('productCategory', EntityType::class, 
       array(
        'class' => ProductCategory::class, 
        'choice_label' => 'name', 
        'choice_value' => 'id', 
        'placeholder' => '', 
        'label_attr' => array('title' => 'Category for this product'), 
        'query_builder' => function (ProductCategoryRepository $v) { 
         return $v->createQueryBuilder('v') 
          ->orderBy('v.name',' ASC'); 
        } 
       )) 
      ->add('name', null, [ 
       'required' => false, 
      ]) 
      ->add('description', null, [ 
       'required' => false, 
      ]) 


     ; 
    } 


    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'app_bundle_product_filter_type'; 
    } } 
フォームは予想どおりにレンダリングされ、リクエストから受け取った値に基づいてフィルタリングする同じURLに投稿を送信します。

これは問題ありません。

ただし、フォームが再レンダリングされると、フォームフィルタの送信前に選択されたオプションは選択されなくなります。その他の入力はすべて再投入されます。

enter image description here

私はエンティティにバインドされた形で働いていることに気づきました(すなわち:製作中とエンティティを保存)し、データクラスを設定するConfigureOptionsメソッドを使用して、EntityTypeことをフォームフィールドは期待通りに機能します。しかし、全体のフォームがエンティティにバインドされていない場合には、このメソッドを使用する必要があります。

編集: これらの手順を実行することは私にとってはうまくいったのですが、ちょっと変わっているようです。

フォームコンストラクタに

注入エンティティマネージャ:

public $em; 

public function __construct(EntityManager $em) { 
    $this->em = $em; 
} 

そして、配列値に基づいてオブジェクトを取得するにはEntityTypeのフォームフィールドを更新:...

答えて

0

->add('productCategory', EntityType::class, 
      array(
       'class' => ProductCategory::class, 
       'choice_label' => 'name', 
       'choice_value' => 'id', 
       'placeholder' => '', 
       'label_attr' => array('title' => 'Category for this product'), 
       'data' => $this->em->getReference("AppBundle:ProductCategory", 
        isset($options['data']['productCategory']) ? $options['data']['productCategory'] : 0), 
       'query_builder' => function (ProductCategoryRepository $v) { 
        return $v->createQueryBuilder('v') 
         ->orderBy('v.name',' ASC'); 
       } 
      )) 

マイ回避策は次のようなものでした... formTypeにデータとエンティティマネージャを渡します。フォームタイプで

$form = $this->createForm(new xxxType($this->get('doctrine.orm.entity_manager')), xxxEntity, array(
     'method' => 'POST', 
     'action' => $this->generateUrl('xxxurl', array('id' => $id)), 
     'selectedId' => xxxId, 
    )); 

setDefaultOptionsがselectedId

$resolver->setDefaults(array(
     'data_class' => 'xxx', 
     'selectedId' => array() 
    )); 

のための空の配列として、より詳細ビルダー

->add('productCategory', EntityType::class, 
      array(
       'class' => ProductCategory::class, 
       'choice_label' => 'name', 
       'choice_value' => 'id', 
       'placeholder' => '', 
       'label_attr' => array('title' => 'Category for this product'), 
       'query_builder' => function (ProductCategoryRepository $v) { 
        return $v->createQueryBuilder('v') 
         ->orderBy('v.name',' ASC'); 
       }, 
       'data'=>$this->em->getReference("xxx",$options['selectedId']) 
      )) 

に初期化し、あなたはこの答えを見ることができますSymfony2 Setting a default choice field selection

+0

私はあなたがここで何をしているのかを見ています。このバージョンを実行すると、私のために働いています。 しかし、私はまだこの仕事をより簡単にする何かが欠けているように感じます。 –

1

別ソリューションはData Transformerを使用しています。

productCategoryタイプからdata属性を削除し、build方法の最後にデータトランスを追加します。

$builder->get('productCategory') 
     ->addModelTransformer(new CallbackTransformer(
      function ($id) { 
       if (!$id) { 
        return; 
       } 

       return $this->em->getRepository('AppBundle:ProductCategory')->find($id); 
      }, 
      function($category) { 
       return $category->getId(); 
      } 
     )); 

あなたが複数の場所で同じ変圧器を使用する場合は、独自のにそれを抽出することができますクラス。

関連する問題