36

フォームでエンティティ選択リストを使用しています。特定のエンティティのみを使用したい (例: ユーザーが所属するグループのみ) そのため、コントローラーでこれらのグループを取得し、それらを に渡そうとしてい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 は現在ログインしているユーザーを表します)

4

6 に答える 6

28

__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);
    },
));
于 2011-07-29T08:43:34.427 に答える
2

Bacteries のソリューションは本当に優れたソリューションです。私のような他の人に頭痛を救うためのメモ:)

この部分では、その部分を指摘でき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);
      },
    )
);
于 2011-10-07T14:24:11.320 に答える
2

カスタム クエリを使用する場合は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 マニュアルにあり、オプションに関する情報entitySymfony2 マニュアルにあります。

于 2011-07-16T16:48:38.610 に答える