代码之家  ›  专栏  ›  技术社区  ›  G. Vaurs

如何在Symfony中创建动态级联表单?

  •  1
  • G. Vaurs  · 技术社区  · 7 年前

    我使用Symfony 3已经有一段时间了,直到现在我只生成简单的表单。现在,我想生成一个更复杂、动态的表单,如果您能提供一些帮助,我将不胜感激。

    我的网站引用了与类别相关的产品。因此,我创建了一个 产品类别

    这种结构的一个例子是:

    Food
          Fruits
               Apple
               Pear
          Vegetables
               Pepper
               Zucchini
     Vehicle
          Car
          Bike
    

    在这个例子中,产品是苹果、梨、胡椒、西葫芦、汽车和自行车。

    我想生成一个用于选择产品的表单。预期行为如下:

    • 当用户选择一个类别时,上一个类别下方会出现一个新的下拉列表,其中填充了与先前选择的类别相对应的子类别(例如,如果选择了食品,则为水果和蔬菜)

    为了使表单有效,用户必须选择产品(leaf)。

    目前,我已经能够使用下拉列表生成初始表单,其中列出了根类别。以下是用于执行此操作的代码。

    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use AppBundle\Entity\ProductCategory;
    use AppBundle\Repository\ProductCategoryRepository;
     
    class ProductType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
                $builder->add('productCategory',EntityType::class,array(
                    'class'         => 'AppBundle:ProductCategory',
                    'query_builder' => function(ProductCategoryRepository $repository){
                            return $repository->getRootNodesQueryBuilder();
                    },
                    'label'         => 'product category',
                    'choice_label'  => 'name',
                    'choice_value'  => 'name',
                    'multiple'      => false,
                    'expanded'      => false,
                    'required'      => true
                ));
        }
     
     
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => Product::class,
                'method' => 'POST',
            ));
        }
    }
    

    • 使用下拉菜单上的“更改”事件将(当前)选定类别发送到服务器
    • 在上一个下拉列表的下方生成并显示新的下拉列表,并具有足够的

    但是,我不知道如何修改 类以生成新的 实体类型 字段,然后将更新后的表单发回,以便通过jQuery显示。

    1 回复  |  直到 7 年前
        1
  •  1
  •   hanish singla    3 年前

    如果我正确理解了你的问题,那么你需要获得给定类别的子类别。您可以将其作为选项传递给 ProductType

    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use AppBundle\Entity\ProductCategory;
    use AppBundle\Repository\ProductCategoryRepository;
     
    class ProductType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
                $category = $options['category'];
    
                $builder->add('productCategory',EntityType::class,array(
                    'class'         => 'AppBundle:ProductCategory',
                    'query_builder' => function(ProductCategoryRepository $repository) use ($category){
                            return $repository->getRootNodesQueryBuilder($category);
                    },
                    'label'         => 'product category',
                    'choice_label'  => 'name',
                    'choice_value'  => 'name',
                    'multiple'      => false,
                    'expanded'      => false,
                    'required'      => true
                ));
        }
     
     
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => Product::class,
                'method' => 'POST',
                'category' => null
            ));
        }
    }
    

    在里面 GetRootNodeQueryBuilder() 您可以根据传递的类别分析子类别。在controller(您接收AJAX请求的地方)中,您可以像这样使用它

    $form = $this->createForm(ProductType::class, $product, [
            'category' => $request->get('category')
    ]);