7

プロジェクトでさまざまなフォームを作成するためにフォームクラスを使用しています。

エンティティタイプファイルのbuildForm関数には、「array $ options」のセカンダリパラメータがあります(これは公式のSymfony 2ドキュメントに示されていますが、言及されていません!)

コントローラのcreateForm関数に配列を入力しましたが、保存されている値を取得する方法に完全に困惑していますか?

$form = $this->createForm(new ProductType(array(), array('id' => '2')), $product);

オプションの取得について私が見つけた唯一のことはgetOption()関数を使用することですが、それはSymfony 2には存在しません(私が見つけた投稿は2010年のものです)。

私は使ってみました:

$id = $options['id'];

しかし、どこかで$ idを使おうとすると、次のエラーが発生します。

注意:未定義のインデックス:id

何が得られますか?

$ options配列から値を取得するにはどうすればよいですか?そもそも正しく設定しているのでしょうか?

編集-より多くのコード:

フォームクラス

<?php

namespace DEMO\DemoBundle\Form\Product;

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ProductType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('slug')
            ->add('reference')
            ->add('description')
            ->add('active_from')
            ->add('active_till')
            ->add('is_active')
            ->add('category', 'entity', array(
                'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->where('u.section = :id')
                        ->setParameter('id', ***ID VARIABLE NEEDS TO GO HERE***)
                        ->orderBy('u.root', 'ASC')
                        ->addOrderBy('u.lft', 'ASC');
                },
                'empty_value' => 'Choose an option',
                'property' => 'indentedName',
            ));
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'DEMO\DemoBundle\Entity\Product\Product'
        );
    }

    public function getName()
    {
        return 'demo_demobundle_product_type';
    }
}
4

6 に答える 6

17

そもそもきちんと設定していないと思います。あなたはそれらを3番目の議論として与えることになっていますcreateForm()

編集:フォームクラスは次のようになります。

<?php
namespace DEMO\DemoBundle\Form\Product;

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ProductType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('slug')
            ->add('reference')
            ->add('description')
            ->add('active_from')
            ->add('active_till')
            ->add('is_active')
            ->add('category', 'entity', array(
                'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory',
                'query_builder' => function(EntityRepository $er) use($options) {
                    return $er->createQueryBuilder('u')
                        ->where('u.section = :id')
                        ->setParameter('id', $options['id'])
                        ->orderBy('u.root', 'ASC')
                        ->addOrderBy('u.lft', 'ASC');
                },
                'empty_value' => 'Choose an option',
                'property' => 'indentedName',
            ));
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'DEMO\DemoBundle\Entity\Product\Product',
            'id'         => null
        );
    }

    public function getName()
    {
        return 'demo_demobundle_product_type';
    }
}
于 2012-04-30T14:32:20.477 に答える
9

私のために働いたことをお見せしましょう

コントローラの場合:

$form = $this->createForm(new UsersType(), $entity, array(
    'attr' => array('locationId' => $currentLocationId)));

FormTypeの場合:

->add('location', 'entity', array(
        'class' => 'Ro\RoinventBundle\Entity\Locations',
         'query_builder' => function (\Doctrine\ORM\EntityRepository $er) use ($options)
        {
            if (isset($options['attr']['locationId']) && ($options['attr']['locationId'] != NULL))
            {
                return $er->createQueryBuilder('Locations')
                    ->where('Locations.id = :param')
                    ->setParameter('param', $options['attr']['locationId']);
            }
            //else do what you want
},
));
于 2012-12-10T18:58:24.190 に答える
8

どうやらそれはgetDefaultOptions()もうではなく、setDefaultOptions()

そうでなければそれは言う

オプション「my_custom_option」は存在しません。既知のオプションは次のとおりです: "action"、 "attr"、 "auto_initialize"、..。

したがって、私にとっては、次のようにsetDefaultOptionsを更新する必要がありました。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array('my_custom_option' => false));
    // Others if needed, like in the documentation for : 'data_class' => 'VENDOR\Bundle\Entity\MyEntity', 'csrf_protection' => true
}

そして、あなたはそれをbuildFormメソッドで取得することができます

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $myCustomOption = $options['my_custom_option'];
}
于 2013-11-26T10:31:38.257 に答える
5

このGoogleグループによると

「greg0ire」は正しかった、実際私はそれを試し、完璧に動作する!!!。「コア構造を「ハッキング」したくない」とおっしゃっていましたが、最終的には最善のアプローチを使用しなくなりました。実際、私の観点からすると、やらなかったことを実行することになります。やってみたいです。

したがって、最後にこれを行う必要があります。

formTypeで

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('name')
        ->add('slug')
        ->add('reference')
        ->add('description')
        ->add('active_from')
        ->add('active_till')
        ->add('is_active')
        ->add('category', 'entity', array(
            'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('u')
                    ->where('u.section = :id')
                    ->setParameter('id', $options['id'])
                    ->orderBy('u.root', 'ASC')
                    ->addOrderBy('u.lft', 'ASC');
            },
            'empty_value' => 'Choose an option',
            'property' => 'indentedName',
        ));
}

public function getDefaultOptions()
{
    return array(
        'data_class' => 'DEMO\DemoBundle\Entity\Product\Product'
        'id' => null
    );
}

そしてコントローラーで

$form = $this->createForm(new ProductType(), $product, array('id' => $id ));
于 2012-08-02T02:45:49.697 に答える
1

次のように、フォームクラス__constructメソッドを介してオプションを渡します。

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ProductType extends AbstractType
{

    private $options = array();
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('slug')
            ->add('reference')
            ->add('description')
            ->add('active_from')
            ->add('active_till')
            ->add('is_active')
            ->add('category', 'entity', array(
                'class' => 'DEMO\DemoBundle\Entity\Product\ProductCategory',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->where('u.section = :id')
                        ->setParameter('id', $this->options['id'])
                        ->orderBy('u.root', 'ASC')
                        ->addOrderBy('u.lft', 'ASC');
                },
                'empty_value' => 'Choose an option',
                'property' => 'indentedName',
            ));
    }

    public function getDefaultOptions()
    {
        return array(
            'data_class' => 'DEMO\DemoBundle\Entity\Product\Product'
        );
    }

    public function getName()
    {
        return 'demo_demobundle_product_type';
    }

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

そして、あなたは次のことができます:

new ProductType(array('id'=>1));
于 2012-04-30T15:28:13.833 に答える
1

実は、Gregoiresの回答は非常に近いものでしたが、実際に変数をcreateQueryBuilder関数に入れようとすると、「Undefinedvariable」エラーが発生しました。

私はその理由を理解しようとしばらく時間を費やし、問題を見つけました。次のように、「query_builder」オプションの関数にパラメータを追加する必要があります。

'query_builder' => function(EntityRepository $er) use ($options) {
                    return $er->createQueryBuilder('u')
                        ->where('u.section = :id')
                        ->setParameter('id', $options['id'])
                        ->orderBy('u.root', 'ASC')
                        ->addOrderBy('u.lft', 'ASC');
                },

魔法の設定は「use($ options)」です。これにより、クエリビルダーで$options['id']を正常に使用できます。

于 2012-05-01T13:06:16.587 に答える