4

'EntityType'から拡張するカスタムフォームフィールドタイプを構築しています。渡されたオプションに基づいて要素のサブセットを常に返したいです。

私のタイプでは:

$builder->add('Categories','choice_category', array('code'=> 'CAT1', 'multiple'=> true))   ;

私はchoice_categoryをサービスとして宣言しました。うまくいきました!

  bt.form.type.category:
  class: My\MBundle\Form\Type\CategoryType
  tags:
      - { name: form.type, alias: choice_category }

CategoryChoiceType.phpで

public function setDefaultOptions(OptionsResolverInterface $resolver)
{

    $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,                
        )
    );
}


public function getParent()
{
    return 'entity';
}

query_builderオプションを使用することを考えていますが、コードオプションをsetDefaultOptionsメソッドに渡す方法がわかりません。ここでは、$options配列にアクセスしていません。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
        $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,
            'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($options['code']) {
               return $er->createQueryBuilder('c')
                    ->where('c.parent_code = :code')
                    ->orderBy('c.name', 'ASC')
                    ->setParameter('code', $options['code']);;
            }
        )
    );
);
4

2 に答える 2

12

ほぼ正解ですが、次の特別な構文を使用して、「query_builder」を他のオプション「code」に依存させる必要があります。

use Symfony\Component\OptionsResolver\Options;

$resolver->setDefaults(array(
    'query_builder' => function (Options $options) {
        // return default value of the "query_builder" option
        // you can access $options['code'] here
    },
));

したがって、特定の例では:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'class' => 'CmComunBundle:Comun\Nomenclador',
        'code' => null,
        'query_builder' => function (Options $options) {
            return function(EntityRepository $er) use ($options) {
                return $er->createQueryBuilder('c')
                    ->where('c.parent_code = :code')
                    ->orderBy('c.name', 'ASC')
                    ->setParameter('code', $options['code']);;
            };
        },
    ));
}

これはOptionsResolver READMEにも記載されています。

于 2012-12-09T15:40:43.573 に答える
2

code依存性注入を介して値を渡し、後でメソッド__construct内で使用するために保存できます。setDefaultOptions

class CategoryType{
    ...
    private $code;
    ...
    public function __construct($code){
        $this->code = $code
    }
    ...
    public function setDefaultOptions(OptionsResolverInterface $resolver){
        $code = $this->code;
        $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,
            'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($code) {
                return $er->createQueryBuilder('c')
                                ->where('c.parent_code = :code')
                                ->orderBy('c.name', 'ASC')
                                ->setParameter('code', $code);
            })
        );
    );
}

そしてあなたの設定で:

bt.form.type.category:
    class: My\MBundle\Form\Type\CategoryType
    tags:
        arguments:
                - some_code_value
        - { name: form.type, alias: choice_category }

今、私はこれを試していませんが、このように動作するはずです;)

お役に立てれば!

于 2012-12-06T17:37:48.813 に答える