9

「カテゴリ」という名前のフィールドを含むフォームを作成しています。これを行うには選択リストが必要ですが、データベースに保存されている複数のカテゴリをこの選択リストに入力する方法がわかりません。

public function buildForm(FormBuilder $builder, array $options) {
    $builder -> add('item', 'text', array('label' => 'Item'));
    $builder -> add('category', 'choice', array(
        'choices'   => ???,
        'label' => 'Category'
    ));
}

ここのデータベースからカテゴリを取得し、それらを使用してフォームを作成するにはどうすればよいですか? (このクラス内で $this->getDoctrine->... にアクセスできないようです)。

4

2 に答える 2

15

entityの代わりにタイプを使用choice

$builder
  ->add('entity_property', 'entity', array(
    'class' => 'Namespace\\To\\Entity',
    'query_builder' => function(EntityRepository $repository) {
       return $repository->createQueryBuilder('q')
          ->where('q.a_field = yourvalue');
     }
));

編集:

クエリでカスタム パラメータを使用する 2 つの方法。どちらの状況でも、パラメータは外部から注入されるため、FormType はセッションまたはリクエスト オブジェクトなどへの参照を必要としません。

1-必要なパラメーターをコンストラクターに渡します

class TaskType extends AbstractType
{
    private $custom_value;

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

    // ...
}

buildForm()値をローカル変数にコピーして、query_builder コールバックで使用できるようにする必要があります。

public function buildForm(/*...*/) {
   $my_custom_value = $this->custom_value;

   // ...
       'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
           return $repository->createQueryBuilder('q') 
               ->where('q.a_field = :my_custom_value')
               ->setParameter('my_custom_value', $my_custom_value);
       }

   // ...
}

2-メソッドの$optionsパラメーターを使用しますbuildForm

まず、オーバーライドしてデフォルト値を定義する必要がありますgetDefaultOptions:

public function getDefaultOptions(array $options)
{
    return array(
        'my_custom_value' => 'defaultvalue'
    );
}

次に、メソッドの 3 番目の引数でコントローラーから渡すことができますcreateForm

$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));

$optionsこれで、 youru buildForm メソッドのパラメーターを介して値を使用できるようになります。上記のようにコールバックに渡します。

于 2011-12-10T15:13:26.583 に答える
2

Symfony 2.1 では

setDefaultOptionsメソッド内でOptionsResolverInterfaceを使用する必要があります。オプションを取得する場合に使用する必要があるコードは次のとおりです(受け入れられた回答と同じ例を使用)


use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

public function buildForm(FormBuilderInterface $builder, array $options){

    parent::buildForm($builder, $options);

   $my_custom_value = $options[custom_value];

   // ...
       'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
           return $repository->createQueryBuilder('q') 
               ->where('q.a_field = :my_custom_value')
               ->setParameter('my_custom_value', $my_custom_value);
       }

   // ...

}
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'my_custom_value' => 'defaultvalue'
        ));
    }

同じ方法でオプションを渡します。

$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));
于 2012-07-20T01:45:47.673 に答える