doulieyu0881 2018-08-26 22:46
浏览 14

为什么symfony 4集合表单类型只发送第一行?

I have a form with a collection type child. with java script I change name and id of inputs in each row by usual pattern, but when I submit form and dump $form->getData() it has just one element that i added in controller. here my controller section :

    public function add(Request $request)
{
    $snap = new Snap();
    $snapProduct = new SnapProduct();
    $snap->addProduct($snapProduct);

    $form = $this->createForm(SnapType::class, $snap);

    $form->handleRequest($request);

    if ($form->isSubmitted()) {
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();

            $em->persist($snap);
            $em->flush();

            $this->addFlash('success', 'succecc');

            return $this->redirectToRoute('app_panel_snap_details', ['id' => $snap->getId()]);
        }
    }

    return $this->render('panel/snap/new.html.twig', [
        'form' => $form->createView()
    ]);
}

and here my SnapType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('registered_at', JalaliDateTimeType::class)
        ->add('number', TextType::class)
        ->add('invoice', TextType::class)
        ->add('account')
        ->add('products', CollectionType::class, [
            'entry_type' => SnapProductType::class,
            'entry_options' => [ 'label' => false ],
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false
        ])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Snap::class,
    ]);
}

and my SnapProductType

        $builder
        ->add('count', TextType::class, [
            'label_format'=> ' '
        ])
        ->add('in_time_price', AmountType::class, [
            'label_format' => ' '
        ])
        ->add('product')
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => SnapProduct::class,
    ]);
}

and html of my form after render and add new row with java script:

<div class="form-group" id="snap-products">
<div class="row product-row" id="snap_products_0">
    <div class="col-md-2">
        <label class="pull-right" for="snap_products_0_product">product </label>
    </div>
    <div class="col-md-4">
        <select id="snap_products_0_product" name="snap[products][0][product]" data-toggle="product-select" class="form-control">[options]</select>
    </div>
    <div class="col-md-3">
        <div class="input-group">
            <span class="input-group-addon" data-toggle="count-plus"><i class="fa fa-plus"></i></span>
            <input id="snap_products_0_count" name="snap[products][0][count]" required="required" placeholder="count" data-holder="product-count" class="form-control" type="text">
            <span class="input-group-addon" data-toggle="count-minus"><i class="fa fa-minus"></i></span>
        </div>
    </div>
    <div class="col-md-2">
        <input id="snap_products_0_in_time_price" name="snap[products][0][in_time_price]" required="required" placeholder="price" data-holder="product-price" data-toggle="amount-formatted" class="form-control" value="0" type="text">
    </div>
    <div class="col-md-1">
        <button class="btn btn-sm btn-outline btn-circle btn-danger pull-left" type="button" data-toggle="remove-product">
            <i class="fa fa-trash"></i>
        </button>
    </div>
</div>
<div class="row product-row" id="snap_products_1">
    <div class="col-md-2">
        <label class="pull-right" for="snap_products_0_product">product </label>
    </div>
    <div class="col-md-4">
        <select id="snap_products_1_product" name="snap[products][1][product]" data-toggle="product-select" class="form-control">[options]</select>
    </div>
    <div class="col-md-3">
        <div class="input-group">
            <span style="cursor: pointer" class="input-group-addon" data-toggle="count-plus"><i class="fa fa-plus"></i></span>
            <input id="snap_products_1_count" name="snap[products][1][count]" required="required" placeholder="count" data-holder="product-count" class="form-control" type="text">
            <span style="cursor: pointer" class="input-group-addon" data-toggle="count-minus"><i class="fa fa-minus"></i></span>
        </div>
    </div>
    <div class="col-md-2">
        <input id="snap_products_1_in_time_price" name="snap[products][1][in_time_price]" required="required" placeholder="price" data-holder="product-price" data-toggle="amount-formatted" class="form-control" value="0" type="text">
    </div>
    <div class="col-md-1">
        <button class="btn btn-sm btn-outline btn-circle btn-danger pull-left" type="button" data-toggle="remove-product">
            <i class="fa fa-trash"></i>
        </button>
    </div>
</div>
<div class="row product-row" id="snap_products_2">
    <div class="col-md-2">
        <label class="pull-right" for="snap_products_0_product">product </label>
    </div>
    <div class="col-md-4">
        <select id="snap_products_2_product" name="snap[products][2][product]" data-toggle="product-select" class="form-control">[options]</select>
    </div>
    <div class="col-md-3">
        <div class="input-group">
            <span style="cursor: pointer" class="input-group-addon" data-toggle="count-plus"><i class="fa fa-plus"></i></span>
            <input id="snap_products_2_count" name="snap[products][2][count]" required="required" placeholder="count" data-holder="product-count" class="form-control" type="text">
            <span style="cursor: pointer" class="input-group-addon" data-toggle="count-minus"><i class="fa fa-minus"></i></span>
        </div>
    </div>
    <div class="col-md-2">
        <input id="snap_products_2_in_time_price" name="snap[products][2][in_time_price]" required="required" placeholder="price" data-holder="product-price" data-toggle="amount-formatted" class="form-control" value="0" type="text">
    </div>
    <div class="col-md-1">
        <button class="btn btn-sm btn-outline btn-circle btn-danger pull-left" type="button" data-toggle="remove-product">
            <i class="fa fa-trash"></i>
        </button>
    </div>
</div>

Edit div#snap_products_1 and div#snap_products_2 added by java script

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 多址通信方式的抗噪声性能和系统容量对比
    • ¥15 winform的chart曲线生成时有凸起
    • ¥15 msix packaging tool打包问题
    • ¥15 finalshell节点的搭建代码和那个端口代码教程
    • ¥15 Centos / PETSc / PETGEM
    • ¥15 centos7.9 IPv6端口telnet和端口监控问题
    • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
    • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
    • ¥20 海浪数据 南海地区海况数据,波浪数据
    • ¥20 软件测试决策法疑问求解答