我有一个带有子类型的表格。使用Java脚本,我可以通过通常的模式更改每行中输入的名称和ID,但是当我提交表单并转储$form->getData()
时,它只有一个添加到控制器中的元素。
这是我的控制器部分:
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()
]);
}
以及我的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,
]);
}
和我的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,
]);
}
和呈现后的表单HTML并使用Java脚本添加新行:
<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>
修改 Java脚本添加的div#snap_products_1和div#snap_products_2