如何在 Symfony 中创建动态级联表单?
How to create dynamic cascade form in Symfony?
我使用 Symfony 3 有一段时间了,直到现在我只生成了简单的表单。现在,我想生成一个更复杂的动态表单,希望能提供一些帮助。
我的网站引用了与类别相关联的产品。因此,我创建了一个 ProductCategory 实体,它依赖于 Doctrine 扩展 Tree。因此,实际产品是树结构的叶子,其他节点(即至少有一个 child 的节点)只是产品类别。
这种结构的一个例子是:
Food
Fruits
Apple
Pear
Vegetables
Pepper
Zucchini
Vehicle
Car
Bike
在此示例中,产品为苹果、梨、胡椒、西葫芦、汽车和自行车。
我想生成一个用于选择产品的表格。预期的行为是这样的:
- 最初,用户会看到一个包含根类别(此处为食品和车辆)的下拉列表
- 当用户选择一个类别时,前一个类别下方会出现一个新的下拉列表,其中填充了与先前选择的类别对应的子类别(例如,如果选择了食物,则为水果和蔬菜)
- 这个过程应该是递归的,直到用户选择了一个产品,即树结构的叶子。
为了使表格有效,用户必须选择产品(叶子)。
目前,我已经能够生成带有列出根类别的下拉列表的初始表单。这是用于执行此操作的代码。
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',
));
}
}
据此,我们的想法是使用 AJAX 和 jQuery 来:
- 使用下拉列表中的 "change" 事件将(当前)选定的类别发送到服务器
- 在前一个下拉列表下方生成并显示新的下拉列表,并具有足够的
但是,我不知道如何修改 ProductType class 以生成新的 EntityType 字段在当前选定的类别上,然后发回更新后的表格,以便按 jQuery.
显示
因此,我们非常欢迎任何帮助或建议,以便在构建此动态表单方面取得进展!
如果我正确理解你的问题,那么你需要获取给定类别的子类别。您可以将其作为选项传递给 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
));
}
}
在 getRootNodesQueryBuilder() 中,您可以根据传递的类别解析子类别。在控制器中(您收到 AJAX 请求的地方),您可以像
一样使用它
$form = $this->createForm(ProductType::class, $product, [
'category' => $request->get('category')
]);
我使用 Symfony 3 有一段时间了,直到现在我只生成了简单的表单。现在,我想生成一个更复杂的动态表单,希望能提供一些帮助。
我的网站引用了与类别相关联的产品。因此,我创建了一个 ProductCategory 实体,它依赖于 Doctrine 扩展 Tree。因此,实际产品是树结构的叶子,其他节点(即至少有一个 child 的节点)只是产品类别。
这种结构的一个例子是:
Food
Fruits
Apple
Pear
Vegetables
Pepper
Zucchini
Vehicle
Car
Bike
在此示例中,产品为苹果、梨、胡椒、西葫芦、汽车和自行车。
我想生成一个用于选择产品的表格。预期的行为是这样的:
- 最初,用户会看到一个包含根类别(此处为食品和车辆)的下拉列表
- 当用户选择一个类别时,前一个类别下方会出现一个新的下拉列表,其中填充了与先前选择的类别对应的子类别(例如,如果选择了食物,则为水果和蔬菜)
- 这个过程应该是递归的,直到用户选择了一个产品,即树结构的叶子。
为了使表格有效,用户必须选择产品(叶子)。
目前,我已经能够生成带有列出根类别的下拉列表的初始表单。这是用于执行此操作的代码。
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',
));
}
}
据此,我们的想法是使用 AJAX 和 jQuery 来:
- 使用下拉列表中的 "change" 事件将(当前)选定的类别发送到服务器
- 在前一个下拉列表下方生成并显示新的下拉列表,并具有足够的
但是,我不知道如何修改 ProductType class 以生成新的 EntityType 字段在当前选定的类别上,然后发回更新后的表格,以便按 jQuery.
显示因此,我们非常欢迎任何帮助或建议,以便在构建此动态表单方面取得进展!
如果我正确理解你的问题,那么你需要获取给定类别的子类别。您可以将其作为选项传递给 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
));
}
}
在 getRootNodesQueryBuilder() 中,您可以根据传递的类别解析子类别。在控制器中(您收到 AJAX 请求的地方),您可以像
一样使用它$form = $this->createForm(ProductType::class, $product, [
'category' => $request->get('category')
]);