<?php
namespace App\Controller\Mvc;
use App\Entity\Inquiry\Contact;
use App\Form\Inquiry\ContactType;
use App\Repository\Inquiry\ContactRepository;
use App\Service\InquiryControllerService;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/contact")
*/
class ContactController extends AbstractController
{
use InquiryMockTrait;
private const SESSION_NAME = "contact_resume";
/**
* @Route("/", name="contact_index", methods={"GET"})
*/
public function index(
Request $request,
InquiryControllerService $inquiryService
): Response {
$form = $inquiryService->prepareForm(
$request,
self::SESSION_NAME,
ContactType::class,
new Contact()
);
return $this->render("pages/contact/index.html.twig", [
"form" => $form->createView(),
"retry" => false
]);
}
/**
* @Route("/confirm", name="contact_confirm", methods={"POST"})
*/
public function confirm(
Request $request,
InquiryControllerService $inquiryService
): Response {
$Contact = new Contact();
$form = $inquiryService->getSubmittedForm(
$request,
ContactType::class,
$Contact
);
if(false === $inquiryService->formValidation($request, $form, $Contact, false)) {
return $this->render("pages/contact/index.html.twig", [
"form" => $form->createView(),
"retry" => true
]);
}
return $this->render('pages/contact/confirm.html.twig', [
"inquiry" => $Contact,
"form" => $form->createView(),
"confirmForm" => $inquiryService->saveSession($request, $form, self::SESSION_NAME)->createView()
]);
}
/**
* @Route("/send", name="contact_send", methods={"POST"})
*/
public function send(
Request $request,
InquiryControllerService $inquiryService
): Response {
// confirm csrf
if(!$inquiryService->handleConfirmForm($request)) {
return $this->redirectToRoute("contact_index");
}
// form data load from session
$Contact = new Contact();
if(!$form = $inquiryService->loadSessionAndGetForm(
$request,
$Contact,
ContactType::class,
self::SESSION_NAME
)) {
return $this->redirectToRoute('contact_index');
}
// validate again
if(!$inquiryService->formValidation($request, $form, $Contact)) {
return $this->render('pages/contact/index.html.twig', [
"form" => $form->createView(),
"retry" => true,
]);
}
// persist - sendmail
$inquiryService
->persistAndSessionRemove($request, $Contact, self::SESSION_NAME)
->sendmail($Contact, $form)
;
// perdotのような送信がある場合、HTMLをここでレンダリング
return $this->render('pages/contact/send.html.twig', [
"inquiry" => $Contact
]);
// goto complete
// return $this->redirectToRoute('contact_complete');
}
/**
* @Route("/complete", name="contact_complete", methods={"GET", "POST"})
*/
public function complete(): Response
{
return $this->render("pages/contact/complete.html.twig", []);
}
/**
* @Route("/error", name="contact_error", methods={"GET", "POST"})
*/
public function error(
Request $request,
ContactRepository $repository,
InquiryControllerService $service
): Response
{
$service->handlePardotError(
$request,
$repository,
ContactType::class,
self::SESSION_NAME
)->removeSession($request, self::SESSION_NAME)
;
return $this->redirectToRoute('contact_complete');
}
/**
* @Route("/pardot_mock", name="contact_pardot_mock", methods={"POST"})
*/
public function pardotMock(Request $request, LoggerInterface $logger) {
$logger->info('Contact pardot mock. send: '. print_r($request->request->all(), true));
return $this->redirectToRoute('contact_error');
}
/**
* @Route ("/mock", name="contact_mock")
*/
public function mock(Request $request, InquiryControllerService $service)
{
$Contact = new Contact();
$this->setCommonMock($Contact)->setMessage('テストメールです')->setSubject('注文住宅');
$form = $this->createForm(ContactType::class, $Contact);
$service->saveSession($request, $form, self::SESSION_NAME);
return $this->redirectToRoute('contact_index');
}
}