<?php
namespace Plugin\NZCustomPlugin\Controller\Admin;
use Eccube\Controller\AbstractController;
use Plugin\NZCustomPlugin\Entity\FormField;
use Plugin\NZCustomPlugin\Form\Type\Admin\FormFieldType;
use Plugin\NZCustomPlugin\Repository\CustomFormRepository;
use Plugin\NZCustomPlugin\Repository\FormFieldRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class FormFieldController extends AbstractController
{
protected $formRepository;
protected $fieldRepository;
public function __construct(
CustomFormRepository $formRepository,
FormFieldRepository $fieldRepository
) {
$this->formRepository = $formRepository;
$this->fieldRepository = $fieldRepository;
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/field/new", name="nzcustomplugin_admin_field_new", requirements={"form_id" = "\d+"})
* @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/field/{field_id}/edit", name="nzcustomplugin_admin_field_edit", requirements={"form_id" = "\d+", "field_id" = "\d+"})
* @Template("@NZCustomPlugin/admin/field_edit.twig")
*/
public function edit(Request $request, $form_id, $field_id = null)
{
$customForm = $this->formRepository->find($form_id);
if (!$customForm) {
throw $this->createNotFoundException();
}
if ($field_id) {
$field = $this->fieldRepository->find($field_id);
if (!$field || $field->getCustomForm()->getId() !== $customForm->getId()) {
throw $this->createNotFoundException();
}
} else {
$field = new FormField();
$field->setCustomForm($customForm);
$maxSortNo = $this->fieldRepository->getMaxSortNo($form_id);
$field->setSortNo($maxSortNo + 1);
}
$builder = $this->formFactory->createBuilder(FormFieldType::class, $field);
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->entityManager->persist($field);
$this->entityManager->flush();
$this->addSuccess('フィールドを保存しました。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $customForm->getId()]);
}
return [
'form' => $form->createView(),
'customForm' => $customForm,
'field' => $field,
];
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/{form_id}/field/{field_id}/delete", name="nzcustomplugin_admin_field_delete", methods={"POST"}, requirements={"form_id" = "\d+", "field_id" = "\d+"})
*/
public function delete(Request $request, $form_id, $field_id)
{
$token = $request->request->get('_token');
if (!$this->isCsrfTokenValid('delete' . $field_id, $token)) {
$this->addError('不正なアクセスです。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $form_id]);
}
$field = $this->fieldRepository->find($field_id);
if (!$field || $field->getCustomForm()->getId() != $form_id) {
throw $this->createNotFoundException();
}
$this->entityManager->remove($field);
$this->entityManager->flush();
$this->addSuccess('フィールドを削除しました。', 'admin');
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $form_id]);
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/field/{id}/move-up", name="nzcustomplugin_admin_field_move_up", requirements={"id" = "\d+"})
*/
public function moveUp(Request $request, $id)
{
$field = $this->fieldRepository->find($id);
if (!$field) {
throw $this->createNotFoundException();
}
$customForm = $field->getCustomForm();
$currentSort = $field->getSortNo();
// 現在のフィールドより上にあるフィールドを取得
$qb = $this->entityManager->createQueryBuilder();
$targetField = $qb->select('f')
->from(FormField::class, 'f')
->where('f.customForm = :form')
->andWhere('f.sort_no < :sort')
->setParameter('form', $customForm)
->setParameter('sort', $currentSort)
->orderBy('f.sort_no', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
if ($targetField) {
$targetSort = $targetField->getSortNo();
$targetField->setSortNo($currentSort);
$field->setSortNo($targetSort);
$this->entityManager->flush();
$this->addSuccess('フィールドの順序を変更しました。', 'admin');
}
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $customForm->getId()]);
}
/**
* @Route("/%eccube_admin_route%/nzcustomplugin/field/{id}/move-down", name="nzcustomplugin_admin_field_move_down", requirements={"id" = "\d+"})
*/
public function moveDown(Request $request, $id)
{
$field = $this->fieldRepository->find($id);
if (!$field) {
throw $this->createNotFoundException();
}
$customForm = $field->getCustomForm();
$currentSort = $field->getSortNo();
// 現在のフィールドより下にあるフィールドを取得
$qb = $this->entityManager->createQueryBuilder();
$targetField = $qb->select('f')
->from(FormField::class, 'f')
->where('f.customForm = :form')
->andWhere('f.sort_no > :sort')
->setParameter('form', $customForm)
->setParameter('sort', $currentSort)
->orderBy('f.sort_no', 'ASC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
if ($targetField) {
$targetSort = $targetField->getSortNo();
$targetField->setSortNo($currentSort);
$field->setSortNo($targetSort);
$this->entityManager->flush();
$this->addSuccess('フィールドの順序を変更しました。', 'admin');
}
return $this->redirectToRoute('nzcustomplugin_admin_edit', ['id' => $customForm->getId()]);
}
}