2016-09-27 20 views
0

select(jQueryオートコンプリートなどの入力)とは異なるsymfonyフォームで、多対1の関連付けを「管理」する方法があるかどうかを知りたいと思います。Doctrine SymfonyフォームのMany To One関連

私はそう、私は

// src/AppBundle/Form/ZipcodeSelectorType.php 
namespace AppBundle\Form; 

use AppBundle\Form\DataTransformer\ZipcodesTransformer; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 

class ZipcodeType extends AbstractType 
{ 
    private $manager; 

    public function __construct(ObjectManager $manager) 
    { 
     $this->manager = $manager; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new ZipcodesTransformer($this->manager); 
     $builder->addModelTransformer($transformer); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'invalid_message' => 'The selected ZIPCODE does not exist', 
     )); 
    } 

    public function getParent() 
    { 
     return TextType::class; 
    } 
} 

ドキュメントに関する DataTransformers

ここでは私のトランスクラス

// src/AppBundle/Form/DataTransformer/ZipcodesTransformer.php 
namespace AppBundle\Form\DataTransformer; 

use AppBundle\Entity\Issue; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class ZipcodesTransformer implements DataTransformerInterface { 
    private $manager; 
    public function __construct(ObjectManager $manager) { 
     $this->manager = $manager; 
    } 

    public function transform($zipcode) { 
     if (null === $zipcode) { 
      return ''; 
     } 
     return $zipcode->getId(); 
    } 

    public function reverseTransform($zipcodeId) { 
     if (!$zipcodeId) { 
      return; 
     } 

     $zipcode = ->this->manager->getRepository('AppBundle:Zipcodes')->find($zipcodeId) 
     ; 

     if (null === $zipcode) { 
      throw new TransformationFailedException(sprintf(
       'An zipcode with number "%s" does not exist!', 
       $zipcodeId 
      )); 
     } 

     return $zipcode; 
    } 
} 

に続いて、セレクタ型クラスを読み込み、オブジェクト形式のためのクラスが

ある this questionを見つけました
namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\BirthdayType; 
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; 
use AppBundle\Form\DataTransformer\ZipcodesTransformer; 

class CustomerType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class ,array('label'=>'Customer Name')) 
      ... 
      ->add('email', EmailType::class) 
      ->add('flag', CheckboxType::class, array('required' => false)) 
      ->add('zipcode', ZipcodeType::class) 
     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults(array('data_class' => 'AppBundle\Entity\Customer')); 
    } 
} 

Kernのおかげで、コードは正しく機能しています。今 jQueryのオートコンプリートは、すでに私はZipcodeSelectorType.phpを変更し、

public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(
     array (
      'invalid_message' => 'The selected ZIPCODE does not exist', 
      'attr' => array('class'=>'zipcodeac'),//ADDED THIS LINE 
      'placeholder'=>'Type to select a zipcode'//ADDED THIS LINE 
     ) 
     ); 
    } 

この機能を追加しテストしたが、フォームをrenderigとき入力は=このクラス

クラスを持っている「活性化」するために、 "zipcodeacフォームコントロールUI-オートコンプリート入力"

属性

オートコンプリート= "オ​​フ"

とAjaxを解雇されていません。

+0

私はエンティティのフィールドタイプを探していると思う:)! ドキュメント:http://symfony.com/doc/current/reference/forms/types/entity.html – Kern

+0

@Kern - あなたは完全に正しいです。 OneToManyまたはManyToOneの関連付けを管理するために、EntityTypeおよびCollectionTypeを使用しました。選択可能なオプションの数が何千も増えると、何か違うものが必要になります。ありがとう。 – AlexMI

答えて

0

getParent()メソッドで呼び出すZipcodeTypeクラスのuseステートメントが欠落しました。

現在のエラーを解決するを追加します。

あなたのコメントに記載されているように「何千もの」オプションがある場合は、あなたの弁別者フィールドに基づいて自動補完Webサービスを作成する方が良いでしょう:)!

+0

私には恥があります。 – AlexMI