Closed FabRiviere closed 1 year ago
symfony console make:form CommentType Comment
$builder
->add('author', TextType::class, [
'label' => 'Your name',
])
->add('text', TextareaType::class, [
'placeholder' => 'Write your comment here',
])
->add('email', EmailType::class, [
'placeholder' => 'Email address',
])
->add('photo', FileType::class, [
'label' => 'Photo',
'required' => false,
'mapped' => false,
'constraints' => [
new Image(['maxSize' => '1024k'])
],
])
->add('submit', SubmitType::class)
;
Notez que nous avons ajouté un bouton submit (qui nous permet de continuer à utiliser simplement {{ form(comment_form) }} dans le template).
Certains champs ne peuvent pas être auto-configurés, comme par exemple photoFilename. L'entité Comment n'a besoin d'enregistrer que le nom du fichier photo, mais le formulaire doit s'occuper de l'upload du fichier lui-même. Pour traiter ce cas, nous avons ajouté un champ appelé photo qui est un champ non mapped : il ne sera associé à aucune propriété de Comment. Nous le gérerons manuellement pour implémenter une logique spécifique (comme l'upload de la photo sur le disque).
#[Route('/conference/{slug}', name: 'conference')]
public function show(Request $request, Conference $conference, CommentRepository $commentRepository): Response
{
-> $comment = new Comment();
-> $formComment = $this->createForm(CommentType::class, $comment);
$offset = max(0, $request->query->getInt('offset', 0));
$paginator = $commentRepository->getCommentPaginator($conference, $offset);
return $this->render('conference/show.html.twig', [
'conference' => $conference,
'comments' => $paginator,
'previous' => $offset - CommentRepository::PAGINATOR_PER_PAGE,
'next' => min(count($paginator), $offset + CommentRepository::PAGINATOR_PER_PAGE),
-> 'comment_form' => $formComment,
]);
}
<h2>Add your own feedback</h2>
{{ form(comment_form) }}
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Column(length: 255)]
#[Assert\NotBlank]
private ?string $author = null;
#[ORM\Column(type: Types::TEXT)]
#[Assert\NotBlank]
private ?string $text = null;
#[ORM\Column(length: 255)]
#[Assert\NotBlank]
#[Assert\Email]
private ?string $email = null;
#[Route('/conference/{slug}', name: 'conference')]
public function show(Request $request, Conference $conference, CommentRepository $commentRepository): Response
{
$comment = new Comment();
$formComment = $this->createForm(CommentType::class, $comment);
$formComment->handleRequest($request);
if ($formComment->isSubmitted() && $formComment->isValid()) {
$comment->setConference($conference);
$this->entityManager->persist($comment);
$this->entityManager->flush();
return $this->redirectToRoute('conference', ['slug' => $conference->getSlug()]);
}
$offset = max(0, $request->query->getInt('offset', 0));
$paginator = $commentRepository->getCommentPaginator($conference, $offset);
return $this->render('conference/show.html.twig', [
'conference' => $conference,
'comments' => $paginator,
'previous' => $offset - CommentRepository::PAGINATOR_PER_PAGE,
'next' => min(count($paginator), $offset + CommentRepository::PAGINATOR_PER_PAGE),
'comment_form' => $formComment,
]);
}
A ce stade, notre formulaire fonctionne et nous persistons bien les données dans notre base de données. Cependant les photos ne fonctionnent pas puisque nous devons implémenter cette fonctionnalité avant de pouvoir les uploader .
Le sujet est traité dans l'issue suivante #25. Nous reviendrons modifier ce contrôleur après l'implémentation de notre service d'upload ainsi que les paramètres de configuration.