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を解雇されていません。
私はエンティティのフィールドタイプを探していると思う:)! ドキュメント:http://symfony.com/doc/current/reference/forms/types/entity.html – Kern
@Kern - あなたは完全に正しいです。 OneToManyまたはManyToOneの関連付けを管理するために、EntityTypeおよびCollectionTypeを使用しました。選択可能なオプションの数が何千も増えると、何か違うものが必要になります。ありがとう。 – AlexMI