<?php
namespace Plugin\NZCustomPlugin\Controller\Admin;
use Eccube\Controller\AbstractController;
use Plugin\NZCustomPlugin\Entity\CustomForm;
use Plugin\NZCustomPlugin\Form\Type\Admin\FormType;
use Plugin\NZCustomPlugin\Repository\CustomFormRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* 管理画面用フォームコントローラー
*/
class AdminFormController extends AbstractController
{
protected $formRepository;
public function __construct(CustomFormRepository $formRepository)
{
$this->formRepository = $formRepository;
}
/**
* フォーム一覧
* @Route("/%eccube_admin_route%/nzcustomplugin", name="nzcustomplugin_admin_list")
* @Template("@NZCustomPlugin/admin/list.twig")
*/
public function list()
{
$forms = $this->formRepository->findAll();
return [
'forms' => $forms,
];
}
/**
* フォーム新規作成
* @Route("/%eccube_admin_route%/nzcustomplugin/new", name="nzcustomplugin_admin_new")
* @Template("@NZCustomPlugin/admin/form_edit.twig")
*/
public function create(Request $request)
{
$customForm = new CustomForm();
$customForm->setCreateDate(new \DateTime());
$customForm->setUpdateDate(new \DateTime());
$form = $this->createForm(FormType::class, $customForm);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->entityManager->persist($customForm);
$this->entityManager->flush();
$this->addSuccess('フォームを作成しました。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $customForm->getId()]);
}
return [
'form' => $form->createView(),
'customForm' => $customForm,
];
}
/**
* フォーム編集
* @Route("/%eccube_admin_route%/nzcustomplugin/{id}/edit", name="nzcustomplugin_admin_edit", requirements={"id" = "\d+"})
* @Template("@NZCustomPlugin/admin/form_edit.twig")
*/
public function edit(Request $request, $id)
{
$customForm = $this->formRepository->find($id);
if (!$customForm) {
throw $this->createNotFoundException();
}
$form = $this->createForm(FormType::class, $customForm);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$customForm->setUpdateDate(new \DateTime());
$this->entityManager->flush();
$this->addSuccess('フォームを更新しました。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $customForm->getId()]);
}
return [
'form' => $form->createView(),
'customForm' => $customForm,
];
}
/**
* フォーム削除
* @Route("/%eccube_admin_route%/nzcustomplugin/{id}/delete", name="nzcustomplugin_admin_delete", requirements={"id" = "\d+"}, methods={"POST"})
*/
public function delete(Request $request, $id)
{
// CSRFトークンの検証
$token = $request->request->get('_token');
if (!$this->isCsrfTokenValid('delete' . $id, $token)) {
$this->addError('不正なアクセスです。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_list');
}
$customForm = $this->formRepository->find($id);
if (!$customForm) {
throw $this->createNotFoundException();
}
$this->entityManager->remove($customForm);
$this->entityManager->flush();
$this->addSuccess('フォームを削除しました。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_list');
}
/**
* フォーム複製
* @Route("/%eccube_admin_route%/nzcustomplugin/{id}/duplicate", name="nzcustomplugin_admin_duplicate", requirements={"id" = "\d+"}, methods={"POST"})
*/
public function duplicate(Request $request, $id)
{
// CSRFトークンの検証
$token = $request->request->get('_token');
if (!$this->isCsrfTokenValid('duplicate' . $id, $token)) {
$this->addError('不正なアクセスです。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_list');
}
$originalForm = $this->formRepository->find($id);
if (!$originalForm) {
throw $this->createNotFoundException();
}
// 新しいフォームを作成
$duplicatedForm = new CustomForm();
$duplicatedForm->setName($originalForm->getName() . ' (コピー)');
// ユニークなフォームキーを生成
$baseKey = $originalForm->getFormKey() . '_copy';
$formKey = $baseKey;
$counter = 1;
while ($this->formRepository->findOneBy(['form_key' => $formKey])) {
$formKey = $baseKey . '_' . $counter;
$counter++;
}
$duplicatedForm->setFormKey($formKey);
// 基本情報をコピー
$duplicatedForm->setDescription($originalForm->getDescription());
$duplicatedForm->setIsActive(false); // 複製後は無効にしておく
$duplicatedForm->setLayout($originalForm->getLayout());
$duplicatedForm->setLayoutMobile($originalForm->getLayoutMobile());
$duplicatedForm->setPublishStartDate($originalForm->getPublishStartDate());
$duplicatedForm->setPublishEndDate($originalForm->getPublishEndDate());
$duplicatedForm->setRequireLogin($originalForm->getRequireLogin());
$duplicatedForm->setSendCustomerMail($originalForm->getSendCustomerMail());
$duplicatedForm->setSendAdminMail($originalForm->getSendAdminMail());
$duplicatedForm->setAdminMailAddress($originalForm->getAdminMailAddress());
$duplicatedForm->setMailSubject($originalForm->getMailSubject());
$duplicatedForm->setMailTemplate($originalForm->getMailTemplate());
$duplicatedForm->setCreateDate(new \DateTime());
$duplicatedForm->setUpdateDate(new \DateTime());
$this->entityManager->persist($duplicatedForm);
$this->entityManager->flush();
// フィールドを複製
foreach ($originalForm->getFormFields() as $originalField) {
$duplicatedField = new \Plugin\NZCustomPlugin\Entity\FormField();
$duplicatedField->setCustomForm($duplicatedForm);
$duplicatedField->setFieldName($originalField->getFieldName());
$duplicatedField->setLabel($originalField->getLabel());
$duplicatedField->setFieldType($originalField->getFieldType());
$duplicatedField->setRequired($originalField->getRequired());
$duplicatedField->setRequiredType($originalField->getRequiredType());
$duplicatedField->setPlaceholder($originalField->getPlaceholder());
$duplicatedField->setHelpText($originalField->getHelpText());
$duplicatedField->setOptions($originalField->getOptions());
$duplicatedField->setSortNo($originalField->getSortNo());
$duplicatedField->setMaxFileSize($originalField->getMaxFileSize());
$duplicatedField->setAllowedExtensions($originalField->getAllowedExtensions());
$this->entityManager->persist($duplicatedField);
}
$this->entityManager->flush();
$this->addSuccess('フォームを複製しました。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $duplicatedForm->getId()]);
}
/**
* フォームプレビュー
* @Route("/%eccube_admin_route%/nzcustomplugin/{id}/preview", name="nzcustomplugin_admin_preview", requirements={"id" = "\d+"})
*/
public function preview($id)
{
$customForm = $this->formRepository->find($id);
if (!$customForm) {
throw $this->createNotFoundException();
}
return $this->redirectToRoute('nzcustomplugin_form_display', ['key' => $customForm->getFormKey()]);
}
}