<?php
namespace Plugin\NZCustomPlugin\Controller\Admin;
use Eccube\Controller\AbstractController;
use Plugin\NZCustomPlugin\Repository\CustomFormRepository;
use Plugin\NZCustomPlugin\Repository\FormSubmissionRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
class SubmissionController extends AbstractController
{
protected $formRepository;
protected $submissionRepository;
public function __construct(
CustomFormRepository $formRepository,
FormSubmissionRepository $submissionRepository
) {
$this->formRepository = $formRepository;
$this->submissionRepository = $submissionRepository;
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/submissions", name="nzcustomplugin_admin_submissions", requirements={"form_id" = "\d+"})
* @Template("@NZCustomPlugin/admin/submission_list.twig")
*/
public function index(Request $request, $form_id)
{
$customForm = $this->formRepository->find($form_id);
if (!$customForm) {
throw $this->createNotFoundException();
}
$page = $request->query->getInt('page', 1);
$limit = 20;
$qb = $this->submissionRepository->createQueryBuilder('s')
->where('s.customForm = :form')
->setParameter('form', $customForm)
->orderBy('s.submit_date', 'DESC')
->setFirstResult(($page - 1) * $limit)
->setMaxResults($limit);
$submissions = $qb->getQuery()->getResult();
$countQb = $this->submissionRepository->createQueryBuilder('s')
->select('COUNT(s.id)')
->where('s.customForm = :form')
->setParameter('form', $customForm);
$total = $countQb->getQuery()->getSingleScalarResult();
return [
'customForm' => $customForm,
'submissions' => $submissions,
'total' => $total,
'page' => $page,
'limit' => $limit,
'totalPages' => ceil($total / $limit),
];
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/submissions/{id}", name="nzcustomplugin_admin_submission_detail", requirements={"form_id" = "\d+", "id" = "\d+"})
* @Template("@NZCustomPlugin/admin/submission_detail.twig")
*/
public function detail(Request $request, $form_id, $id)
{
$customForm = $this->formRepository->find($form_id);
if (!$customForm) {
throw $this->createNotFoundException();
}
$submission = $this->submissionRepository->find($id);
if (!$submission || $submission->getCustomForm()->getId() != $form_id) {
throw $this->createNotFoundException();
}
$data = json_decode($submission->getData(), true);
return [
'customForm' => $customForm,
'submission' => $submission,
'data' => $data,
];
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/submissions/csv", name="nzcustomplugin_admin_submissions_csv", requirements={"form_id" = "\d+"})
*/
public function exportCsv(Request $request, $form_id)
{
$customForm = $this->formRepository->find($form_id);
if (!$customForm) {
throw $this->createNotFoundException();
}
$submissions = $this->submissionRepository->createQueryBuilder('s')
->where('s.customForm = :form')
->setParameter('form', $customForm)
->orderBy('s.submit_date', 'DESC')
->getQuery()
->getResult();
$response = new StreamedResponse();
$response->setCallback(function() use ($customForm, $submissions) {
$handle = fopen('php://output', 'w');
fprintf($handle, chr(0xEF).chr(0xBB).chr(0xBF));
$headers = ['ID', '投稿日時', '顧客ID', '顧客メール', 'IPアドレス'];
foreach ($customForm->getFormFields() as $field) {
$headers[] = $field->getLabel();
}
fputcsv($handle, $headers);
foreach ($submissions as $submission) {
$data = json_decode($submission->getData(), true);
$row = [
$submission->getId(),
$submission->getSubmitDate()->format('Y-m-d H:i:s'),
$submission->getCustomerId() ?: '',
$submission->getCustomerEmail() ?: '',
$submission->getIpAddress(),
];
foreach ($customForm->getFormFields() as $field) {
$row[] = isset($data[$field->getFieldName()]) ? $data[$field->getFieldName()] : '';
}
fputcsv($handle, $row);
}
fclose($handle);
});
$filename = sprintf('form_%s_%s.csv', $customForm->getFormKey(), date('YmdHis'));
$response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
$response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
return $response;
}
}