【问题标题】:How can I get ID of entity in form type?如何获取表单类型的实体 ID?
【发布时间】:2014-02-23 13:42:51
【问题描述】:

我有用于构建类别的表单类型:

class CategoryType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('published', 'checkbox', array(
                    'required' => FALSE,
                ))
                ->add('parent', 'entity', array(
                    'class' => 'BWBlogBundle:Category',
                    'property' => 'name',
                    'query_builder' => function(EntityRepository $er) {
                        return $er->createQueryBuilder('c')
                                ->where('c.id != :id')
                                ->setParameter('id', ... /* I need to get category ID here */)
                            ;
                    },
                    'required' => FALSE,
                    'empty_value' => 'Корневая категория',
                ))
            // other my code

如何在buildForm 操作中获取query_builder 闭包中实体的类别ID?

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    symfony-2-how-to-pass-data-to-formbuilderpassing-data-from-controller-to-type-symfony2这两个问题中回答你的问题

    1) 将category 变量和__construct() 方法创建到CategoryType 类中:

    private category;
    public function __construct(yourBundle\Category $category){
    
       $this->category = $category ;
    
    }
    

    2) 将buildForm() 方法中的类别变量用于CategoryType 类:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    
        $category = $this->category;
    
        $builder
                ->add('published', 'checkbox', array(
                    'required' => FALSE,
                ))
                ->add('parent', 'entity', array(
                    'class' => 'BWBlogBundle:Category',
                    'property' => 'name',
                    'query_builder' => function(EntityRepository $er) use ($category){
                        return $er->createQueryBuilder('c')
                                ->where('c.id != :id')
                                ->setParameter('id', $category->getId())
                            ;
                    },
                    'required' => FALSE,
                    'empty_value' => 'Корневая категория',
                ))
    
        }
    

    最后当您在控制器中创建表单时:

    $category = new Category();
    
    $form = $this->createForm(new CategoryType($category),$category);
    

    【讨论】:

      【解决方案2】:

      我不知道这些答案现在是否有效。如果您有以下代码在控制器中创建表单:

      $fooEntity = $entityManager->find(FooEntity::class, 123);
      $form = $this->createForm(MyFormType::class, $fooEntity);
      

      ...然后MyFormType::buildForm() 方法将传递$options 参数,该参数将具有$options['data'],其中包含您传递给createForm() 的实体,即在本例中为$fooEntity。这是假设您没有用自己的值覆盖“数据”键选项。因此,您应该能够从中获取实体的 ID。

      【讨论】:

        【解决方案3】:
        class CategoryType extends AbstractType
        {
          private $category_id;
        
          public function __construct($category_id=null) 
          {
            $this->category_id = $category_id;
          }
        
          public function buildForm(FormBuilderInterface $builder, array $options)
          {
                $builder
                        ->add('published', 'checkbox', array(
                            'required' => FALSE,
                        ))
                        ->add('parent', 'entity', array(
                            'class' => 'BWBlogBundle:Category',
                            'property' => 'name',
                            'query_builder' => function(EntityRepository $er) {
                                return $er->createQueryBuilder('c')
                                        ->where('c.id != :id')
                                        ->setParameter('id', $this->category_id) /* I need to get category ID here */)
                                    ;
                            },
                            'required' => FALSE,
                            'empty_value' => 'Корневая категория',
                        ))
                    // other my code
           }
        

        当您创建表单时,请执行以下操作

        public myFooController() 
        {
          //retrieve %category_id here
          $form = $this->creteForm(new CategoryType($category_id));
          [...]
        }
        

        【讨论】:

          【解决方案4】:

          $options['data'] 包含为其构建类型的实体。

          【讨论】:

            猜你喜欢
            • 2015-09-26
            • 1970-01-01
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-22
            • 2018-05-28
            相关资源
            最近更新 更多