app/Plugin/NZCustomPlugin/Controller/Admin/SubmissionController.php line 70

Open in your IDE?
  1. <?php
  2. namespace Plugin\NZCustomPlugin\Controller\Admin;
  3. use Eccube\Controller\AbstractController;
  4. use Plugin\NZCustomPlugin\Repository\CustomFormRepository;
  5. use Plugin\NZCustomPlugin\Repository\FormSubmissionRepository;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\StreamedResponse;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. class SubmissionController extends AbstractController
  11. {
  12.     protected $formRepository;
  13.     protected $submissionRepository;
  14.     
  15.     public function __construct(
  16.         CustomFormRepository $formRepository,
  17.         FormSubmissionRepository $submissionRepository
  18.     ) {
  19.         $this->formRepository $formRepository;
  20.         $this->submissionRepository $submissionRepository;
  21.     }
  22.     
  23.     /**
  24.      * @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/submissions", name="nzcustomplugin_admin_submissions", requirements={"form_id" = "\d+"})
  25.      * @Template("@NZCustomPlugin/admin/submission_list.twig")
  26.      */
  27.     public function index(Request $request$form_id)
  28.     {
  29.         $customForm $this->formRepository->find($form_id);
  30.         if (!$customForm) {
  31.             throw $this->createNotFoundException();
  32.         }
  33.         
  34.         $page $request->query->getInt('page'1);
  35.         $limit 20;
  36.         
  37.         $qb $this->submissionRepository->createQueryBuilder('s')
  38.             ->where('s.customForm = :form')
  39.             ->setParameter('form'$customForm)
  40.             ->orderBy('s.submit_date''DESC')
  41.             ->setFirstResult(($page 1) * $limit)
  42.             ->setMaxResults($limit);
  43.         
  44.         $submissions $qb->getQuery()->getResult();
  45.         
  46.         $countQb $this->submissionRepository->createQueryBuilder('s')
  47.             ->select('COUNT(s.id)')
  48.             ->where('s.customForm = :form')
  49.             ->setParameter('form'$customForm);
  50.         
  51.         $total $countQb->getQuery()->getSingleScalarResult();
  52.         
  53.         return [
  54.             'customForm' => $customForm,
  55.             'submissions' => $submissions,
  56.             'total' => $total,
  57.             'page' => $page,
  58.             'limit' => $limit,
  59.             'totalPages' => ceil($total $limit),
  60.         ];
  61.     }
  62.     
  63.     /**
  64.      * @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/submissions/{id}", name="nzcustomplugin_admin_submission_detail", requirements={"form_id" = "\d+", "id" = "\d+"})
  65.      * @Template("@NZCustomPlugin/admin/submission_detail.twig")
  66.      */
  67.     public function detail(Request $request$form_id$id)
  68.     {
  69.         $customForm $this->formRepository->find($form_id);
  70.         if (!$customForm) {
  71.             throw $this->createNotFoundException();
  72.         }
  73.         
  74.         $submission $this->submissionRepository->find($id);
  75.         if (!$submission || $submission->getCustomForm()->getId() != $form_id) {
  76.             throw $this->createNotFoundException();
  77.         }
  78.         
  79.         $data json_decode($submission->getData(), true);
  80.         
  81.         return [
  82.             'customForm' => $customForm,
  83.             'submission' => $submission,
  84.             'data' => $data,
  85.         ];
  86.     }
  87.     
  88.     /**
  89.      * @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/submissions/csv", name="nzcustomplugin_admin_submissions_csv", requirements={"form_id" = "\d+"})
  90.      */
  91.     public function exportCsv(Request $request$form_id)
  92.     {
  93.         $customForm $this->formRepository->find($form_id);
  94.         if (!$customForm) {
  95.             throw $this->createNotFoundException();
  96.         }
  97.         
  98.         $submissions $this->submissionRepository->createQueryBuilder('s')
  99.             ->where('s.customForm = :form')
  100.             ->setParameter('form'$customForm)
  101.             ->orderBy('s.submit_date''DESC')
  102.             ->getQuery()
  103.             ->getResult();
  104.         
  105.         $response = new StreamedResponse();
  106.         $response->setCallback(function() use ($customForm$submissions) {
  107.             $handle fopen('php://output''w');
  108.             
  109.             fprintf($handlechr(0xEF).chr(0xBB).chr(0xBF));
  110.             
  111.             $headers = ['ID''投稿日時''顧客ID''顧客メール''IPアドレス'];
  112.             foreach ($customForm->getFormFields() as $field) {
  113.                 $headers[] = $field->getLabel();
  114.             }
  115.             fputcsv($handle$headers);
  116.             
  117.             foreach ($submissions as $submission) {
  118.                 $data json_decode($submission->getData(), true);
  119.                 $row = [
  120.                     $submission->getId(),
  121.                     $submission->getSubmitDate()->format('Y-m-d H:i:s'),
  122.                     $submission->getCustomerId() ?: '',
  123.                     $submission->getCustomerEmail() ?: '',
  124.                     $submission->getIpAddress(),
  125.                 ];
  126.                 
  127.                 foreach ($customForm->getFormFields() as $field) {
  128.                     $row[] = isset($data[$field->getFieldName()]) ? $data[$field->getFieldName()] : '';
  129.                 }
  130.                 
  131.                 fputcsv($handle$row);
  132.             }
  133.             
  134.             fclose($handle);
  135.         });
  136.         
  137.         $filename sprintf('form_%s_%s.csv'$customForm->getFormKey(), date('YmdHis'));
  138.         $response->headers->set('Content-Type''text/csv; charset=UTF-8');
  139.         $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'$filename));
  140.         
  141.         return $response;
  142.     }
  143. }