如何在Symfony中创建动态级联形式?



我已经使用Symfony 3一段时间了,直到现在我只生成了简单的表单。现在,我想生成一个更复杂的动态表单,并请提供一些帮助。

我的网站引用与类别关联的产品。因此,我创建了一个依赖于原则扩展的产品类别实体。因此,实际产品是树结构的叶子,其他节点(即至少有一个子节点的节点(只是产品类别。

这种结构的一个例子是这样的:

Food
Fruits
Apple
Pear
Vegetables
Pepper
Zucchini
Vehicle
Car
Bike

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

我想生成一个旨在选择产品的表格。预期的行为将是这样的:

  • 最初,用户会看到一个包含根类别的下拉列表(此处为食品和车辆(
  • 当用户选择一个类别时,一个新的下拉列表会出现在前一个类别的下方,其中填充了与先前选择的类别相对应的子类别(例如,如果选择了"食物",则为"水果和蔬菜"(
  • 这个过程应该是回避的,直到用户选择一个产品,即树结构的叶子。

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

现在,我已经能够使用列出根类别的下拉列表生成初始表单。这是用于执行此操作的代码。

use SymfonyBridgeDoctrineFormTypeEntityType;
use AppBundleEntityProductCategory;
use AppBundleRepositoryProductCategoryRepository;
 
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 来:

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

但是,我不知道如何修改ProductType类以便根据当前选定的类别生成新的EntityType字段,然后发回更新的表单以允许 jQuery 显示。

因此,非常欢迎任何帮助或建议,以便在构建这种动态形式方面取得进展!

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

use SymfonyBridgeDoctrineFormTypeEntityType;
use AppBundleEntityProductCategory;
use AppBundleRepositoryProductCategoryRepository;
 
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')
]);

相关内容

  • 没有找到相关文章

最新更新