web-dev-qa-db-ja.com

Symfony 2-データをformBuilderに渡す方法は?

フォームでエンティティ選択リストを使用しています。特定のエンティティ(例:ユーザーが属するグループのみ)のみを使用したいので、コントローラーでこれらのグループを取得し、formBuiderに渡します。

コントローラ:

/.../
$groups = $em->getRepository('VendorMyBundle:Group')->getUserGroups($user);
$form = $this->createForm(new Message($groups), $message);
/.../

ならどうしよう? formBuilderでそれを使用する方法?渡されたグループの配列を使用するようにこの行を変更するには?

->add('group','entity',array('class' => 'Vendor\MyBundle\Entity\Group', 'label'=>'Group:'))

または他の方法で:

class MessageType
{
/.../
  public function buildForm(FormBuilder $builder, array $options)
  {
    $builder
      ->add('group','entity',
        array(
          'class' => 'Vendor\MyBundle\Entity\Group',
          'property' => 'name',
          'query_builder' => function ($repository) {
            $qb = $repository->createQueryBuilder('group');
            $qb->add('where', 'group.administrator = :user');
            $qb->setParameter('user', $user->getId());
            return $qb;
          },
          'label' => 'Group'
        )
      )
      // Continue adding fields
    ;
  }
/.../
}

フォームビルダーで使用するオブジェクト$ userを取得するにはどうすればよいですか? ($ userは現在ログインしているユーザーを表します)

36
jacobmaster

使用したいオブジェクトを__construct()メソッドで与えることができます。

例:

$form = $this
    ->get('form.factory')
    ->create(new ApplyStepOneFormType($this->company, $this->ad), $applicant);

あなたのフォームタイプで:

function __construct(\Your\Bundle\Entity\Company $company, \DYB\ConnectBundle\Entity\Ad $ad) {
    $this->company = $company;
    $this->ad = $ad;
}

そして、buildFormメソッドのフォームタイプで:

$company = $this->company;    
$builder->add('ad', 'entity', array(
    'class' => '\Your\Bundle\Entity\Ad',
    'query_builder' => function(\Your\Bundle\Repository\AdRepository $er) use ($company) {
        return $er->getActiveAdsQueryBuilder($company);
    },
));
28
Bacteries
//In controller pass the value which you want to use in builder form in array like

$object = new Question();
$form->create(new QuestionType() , $object , array('sqtname'=>2,'question_type'=>2));


//In Form type class
public function buildForm(FormBuilderInterface $builder , array $options)
    {  
     //for setting data field dynamically 
  if (array_key_exists('question_type', $options) && $options['question_type'] != '') {
    $data = $em->getReference("RecrutOnlineStandardBundle:StdQuestionType",$options['question_type']->getId());
  } else {
    $data = "";
  }


  $builder->add('StdQuestionType', 'entity', array(
        'class' => 'TestStandardBundle:StdQuestionType',
        'property' => 'name',
        'empty_value' => 'Sélectionner un question type',
        'required' => true,
        'data' => $data,
        'query_builder' => function(EntityRepository $er ) use ( $options ) {
            if (isset($options['sqtname']) && $options['sqtname'] != '') {
                return $er->createQueryBuilder('sqt')
                                ->where("sqt.name!= ".$options['sqtname']);
            } else{
               return $er->createQueryBuilder('sqt');
            }
        }
    ));
 }

 public function setDefaultOptions(OptionsResolverInterface $resolver)
     {
       $resolver->setDefaults(array(
         'data_class' => 'Test\QuestionBundle\Entity\Question',
         'required' => false,
         'sqtname' => '',
         'question_type' =>'' 
       ));
     }
11
user3335780

BacteriesのソリューションIS良いものではありません。たとえば、サービスとして型を宣言する場合、コンストラクターにオブジェクトを渡すことはできません。

完璧なソリューションはオプションです-データをオプションとしてフォームビルダーに渡すだけです。

4
Bohdan Yurov

カスタムクエリを使用する場合は、query_builderオプションは次のとおりです。

use Doctrine\ORM\EntityRepository;

...

$message = new Message();

$form = $this->createFormBuilder($message)
             ->add('group', 'entity', array(
                   'class' => 'Vendor\MyBundle\Entity\Group',
                   'label'=>'Group:',
                   'query_builder' => function(EntityRepository $er) {
                       return $er->createQueryBuilder('g')
                                 ->... // whatever you want to do
                       }
                    ))
             ->getForm();

Doctrineマニュアル でクエリビルダーに関する詳細情報を、および Symfony2マニュアルentityのオプションに関する詳細情報を見つけることができます。

2
Ondrej Slinták

バクテリアのソリューションは本当に良いものです。私のような他の人に頭痛を救うためのメモ:)

この部分では、use ($company)部分を指摘できます。フレームによって隠されていましたが、もちろんそれなしでは適切に動作しません。

$builder->add('ad', 'entity', array(
   'class' => 
      '\Your\Bundle\Entity\Ad',
   'query_builder' => 
      function(\Your\Bundle\Repository\AdRepository $er) use ($company) {
            return $er->getActiveAdsQueryBuilder($company);
      },
    )
);
2
FGREZE

最善の方法(私の意見)は、フォームentityManagerに渡して、必要なものをすべて選択することです。ただし、setDefaults()で空のキーを宣言することを忘れないでください。そうしないと、データがビルダーに渡されません。

このようなもの

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $options['em']->getRepository(''); // select all you need
    $builder->add('title', 'text')
            ->add('content', 'textarea');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Main\BlogBundle\Entity\Post',
        'validation_groups' => array('post'),
        'required' => false,
        'em' => null // this var is for your entityManager
        ));
}

シンプルなオプションとしてEMを適用...

0
user1954544