Я использую CollectionType для встроенной формы. Когда я отправляю формы, все данные сохраняются, и у меня нет проблем.
Но ... Я не могу редактировать существующие данные, потому что родительская форма не предоставлена. Обычно у меня есть 1 форма для 1 строки в моей базе данных, но в этом случае у меня есть 3 строки и 0 editform в моем представлении.
<?php
namespace App\Form;
use App\Entity\BlockImage;
use App\Entity\ParentBlockImage;
use App\Repository\BlockImageRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ParentBlockImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('id_category', HiddenType::class, [
'empty_data' => 1
])
->add('block_image', CollectionType::class, [
'entry_type' => BlockImageType::class,
'entry_options' => [
'attr' => ['class' => 'block_image'],
],
'prototype' => true,
'allow_add' => true,
'allow_delete' => true,
'delete_empty' => true,
'allow_file_upload' => true,
'label' => false,
'required' => false,
])
->add('save', SubmitType::class, ['label' => 'Enregister'])
;
}
}
<?php
namespace App\Form;
use App\Entity\BlockImage;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class BlockImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('titre', TextType::class, ['label' => '', 'attr' => ['placeholder'=> 'Titre']])
->add('subtitle', TextType::class, ['label' => '', 'attr' => ['placeholder'=> 'Sous-titre']] )
->add('imageFile', FileType::class, [
'label' => '',
'data_class' => null,
'mapped' => true,
])
->add('orders', HiddenType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => BlockImage::class,
]);
}
}
/**
* @Route("/admin/index", name="admin_block_image_index", methods={"GET", "POST"})
*/
public function adminIndex(Request $request, BlockImageRepository $blockImageRepository): Response
{
$form = $this->createForm(ParentBlockImageType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$entityManager = $this->getDoctrine()->getManager();
$data = $form->getData();
foreach($data['block_image'] as $blockImage){
$blockImage->setUpdatedAt(new \DateTime());
$entityManager->persist($blockImage);
$entityManager->flush();
}
return $this->redirectToRoute('admin_block_image_index');
}
return $this->render('block_image/admin_index.html.twig', [
'form' => $form->createView(),
]);
}
<section class="col-10">
<h1 class="text-center">Blocs images de la page d'accueil</h1>
{{ form_start(form) }}
<div class="tags row active-with-click container mt-5" id="all-blocks"
data-prototype="{{ form_widget(form.block_image.vars.prototype)|e }}"
data-widget-tags="{{ '<div class="block_image col-md-4 col-sm-6 col-xs-12"></div>'|e }}"
data-widget-counter="{{ form.children|length }}">
{% for block_image in form.block_image %}
{{ form_row(block_image) }}
{% endfor %}
</div>
{{ form_end(form) }}
</section>
Я даю вам, родительский класс формы, класс формы, контроллер, используя родительский Форма и вид