我使用symfony4.1 nad和创建的表单类似的构建器:
->add('products', CollectionType::class, array(
'entry_type' => FrontProductsType::class,
'entry_options' => [
'label' => 'Produkt',
],
'label' => 'Dodaj produkty',
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'required' => false,
'attr' => [
'class' => 'products-select',
],
))
我的问题是如何将数据传递给集合类型内部的此Entity Class?
这是嵌入形式:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('product', EntityType::class, array(
'placeholder' => 'Wyszukiwarka',
'mapped' => false,
'multiple' => false,
'class' => Products::class,
'data' => $options['product'],
'attr' => [
'class' => 'chosen-select order_product',
'data-placeholder' => 'Wybierz produkt',
],
'choice_attr' => function($product) {
$cena = $product->getJson()["products"]["cena"];
$stock = $product->getJson()["products"]["stock"];
$vat = $product->getJson()["products"]["vat"];
return array(
'class' => 'single_option',
'single_price' => $cena,
'stock_available' => $stock,
'single_vat' => $vat,
);
},
'choice_label' => function ($product) {
return '' . $product->getJson()["products"]["name"] . ' | Stan Magazynowy: ' . $product->getJson()["products"]["stock"] . ' | Cena netto: ' . $product->getJson()["products"]["cena"] .'';
},
'label' => 'Wybierz produkty'
))
->add('quantity', IntegerType::class, [
'label_attr' => array('class' => 'bmd-label-floating'),
'label' => 'Ilość',
'mapped' => false,
'required' => true,
'data' => $options['quantity'],
'attr' => [
'class' => 'form-control single-quantity-field',
]])
->add('cena', TextType::class, [
'label_attr' => array('class' => 'bmd-label-floating'),
'label' => 'Koszt brutto',
'mapped' => false,
'required' => true,
'data' => $options['cena'],
'attr' => [
'read_only' => true,
'class' => 'form-control single-price-field'],
]);
$builder->get('product')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$json = $form->getData()->getJson();
$data = $form->getData();
foreach ($json as $prop) {
foreach ($prop as $key => $value) {
$$key = $value;
}
}
$cena = number_format($cena, 2);
$form->getParent()->add('cena',TextType::class, [
'label_attr' => array('class' => 'bmd-label-floating'),
'label' => 'Koszt brutto',
'mapped' => false,
'required' => true,
'data' => $cena,
'attr' => [
'read_only' => true,
'class' => 'form-control single-price-field', 'value' => $cena],
])
->add('quantity', IntegerType::class, [
'label_attr' => array('class' => 'bmd-label-floating'),
'label' => 'Ilość',
'mapped' => false,
'required' => true,
'attr' => [
'class' => 'form-control single-quantity-field',
'min' => 1,
'max' => $stock,
]]);
}
);
}
public function getBlockPrefix()
{
return 'product';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Products::class,
'product' => null,
'quantity' => null,
'cena' => null
]);
}
}
当我保存时,一切看起来都不错。当我传递某些产品时,会出现数组中的许多产品,但未传递以嵌入形式设置的值。知道如何传递数据以填充collectiontype的子表单吗?
答案 0 :(得分:0)
如果主表单(我们称其为YourFormType)没有data_class,则可以通过数组设置数据,并使用字段名称进行索引。
$form = $this->createForm(YourFormType::class, ["products" => $array_of_Products]);