Symfony2 - 实体表单类型query_builder

时间:2013-04-13 07:50:16

标签: symfony

我将在InscritSeminaireType中恢复seminaire实体:

class InscritSeminType extends AbstractType {

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

        $builder
            //->add('dateInscrit')
            ->add('seminaire','entity', array(
                'class' => 'EspritSeminaireBundle:Seminaire',
                'query_builder' => function($repository)use ($id) {
                    return $repository->getSeminaireLibre('id')
                        ->setParameter('id', $id)
                    ;
                },                          
                'required' => false,            
             ))
        //->add('etudiant')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Esprit\SeminaireBundle\Entity\InscritSemin',

        ));
    }

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

但它返回错误:

  

注意:未定义的变量:C:\ wamp \ www \ PFE \ EOL \ src \ Esprit \ SeminaireBundle \ Form \ InscritSeminType.php第22行中的id

所以有人能告诉我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果我理解你想要从表单构建器中的id恢复精确的“Seminaire”,你必须先将id传递给该类。

以下是如何操作的示例。您必须在两个地方进行更改。

首先在控制器类中:

// NOTICE THE $id, you have to pass it to the constructor.
$form = $this->createForm(new InscritSeminType($id), $entity);

然后在表单类型中:

class InscritSeminType extends AbstractType {

    private $id;

    public function __construct($id){
        $this->id = $id // Keep the id of the item.
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $id = $this->id; // Retrieve the id

        $builder
            ->add('seminaire','entity', array(
                'class' => 'EspritSeminaireBundle:Seminaire',
                'property' => 'id', // To tell the mapping is on the id.
                'query_builder' => function($repository) use ($id) {
                    return $repository->getSeminaireLibre($id)
                },      
                'required' => false,
               ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Esprit\SeminaireBundle\Entity\InscritSemin',

        ));
    }

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

您在构造函数中传递id,然后在buildForm函数中检索它。

相关问题