<?php
namespace Plugin\ShelvingOption4\Controller\Admin;
use Eccube\Controller\AbstractController;
use Eccube\Repository\ProductRepository;
use Eccube\Util\CacheUtil;
use Eccube\Event\EventArgs;
use Plugin\ShelvingOption4\Entity\ShelvingOptionConfig;
use Plugin\ShelvingOption4\Form\Type\Admin\ShelvingOptionConfigType;
use Plugin\ShelvingOption4\Repository\ShelvingOptionConfigRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
class ConfigController extends AbstractController
{
/**
* @var ShelvingOptionConfigRepository
*/
protected $configRepository;
/** @var ProductRepository */
protected $productRepository;
/**
* ConfigController constructor.
*
* @param ShelvingOptionConfigRepository $configRepository
*/
public function __construct(
ShelvingOptionConfigRepository $configRepository,
ProductRepository $productRepository
) {
$this->configRepository = $configRepository;
$this->productRepository = $productRepository;
}
/**
* @Route("/%eccube_admin_route%/shelving_option4/config", name="shelving_option4_admin_config")
* @Template("@ShelvingOption4/admin/config.twig")
*/
public function index(Request $request)
{
$Config = $this->configRepository->get();
$form = $this->createForm(ShelvingOptionConfigType::class, $Config);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$Config = $form->getData();
$this->entityManager->persist($Config);
$this->entityManager->flush($Config);
$this->addSuccess('登録しました。', 'admin');
return $this->redirectToRoute('shelving_option4_admin_config');
}
return [
'form' => $form->createView(),
];
}
/**
* @Route("/%eccube_admin_route%/shelving_option4/product/{id}", requirements={"id" = "\d+"}, name="shelving_option4_admin_product", methods={"GET"})
* @Template("@ShelvingOption4/admin/edit.twig")
*/
public function edit(Request $request, $id = null)
{
if (is_null($id)) {
$this->addError('商品が選択されていません。', 'admin');
return $this->redirectToRoute('admin_product_page');
}
/** @var \ECCube\Entity\Product */
$Product = $this->productRepository->find($id);
if (!$Product) {
throw new NotFoundHttpException();
}
$ShelvingOption = $Product->getShelvingOption();
$builder = $this->formFactory->createBuilder(ShelvingOptionConfigType::class, $ShelvingOption);
$form = $builder->getForm();
return [
'Product' => $Product,
'ShelvingOption' => $ShelvingOption ? $ShelvingOption->toJson() : 'null',
'form' => $form->createView(),
'id' => $id,
];
}
/**
* @Route("/%eccube_admin_route%/shelving_option4/product/{id}", requirements={"id" = "\d+"}, name="shelving_option4_admin_product_update", methods={"POST"})
*/
public function update(Request $request, $id = null, RouterInterface $router, CacheUtil $cacheUtil)
{
if (is_null($id)) {
$this->addError('商品が選択されていません。', 'admin');
return $this->redirectToRoute('admin_product_page');
}
/** @var \ECCube\Entity\Product */
$Product = $this->productRepository->find($id);
if (!$Product) {
throw new NotFoundHttpException();
}
$builder = $this->formFactory->createBuilder(ShelvingOptionConfigType::class);
/* @var $form \Symfony\Component\Form\FormInterface */
$form = $builder->getForm();
$form->handleRequest($request);
if (!$form->isValid()) {
throw new NotFoundHttpException();
}
$ShelvingOption = $Product->getShelvingOption() ?? new ShelvingOptionConfig();
/** @var ShelvingOptionConfig */
$UpdateShelvingOption = $form->getData();
if($UpdateShelvingOption != null && $UpdateShelvingOption->getFileName()) {
$filename = $UpdateShelvingOption->getFileName();
if(file_exists($this->eccubeConfig['eccube_temp_shelving_image_dir'] . '/' . $filename)) {
rename($this->eccubeConfig['eccube_temp_shelving_image_dir'] . '/' . $filename, $this->eccubeConfig['eccube_save_shelving_image_dir'] . '/' . $filename);
}
}
$ShelvingOption->setPattern($UpdateShelvingOption->getPattern());
$ShelvingOption->setWidthList($UpdateShelvingOption->getWidthList());
$ShelvingOption->setFullWidth($UpdateShelvingOption->getFullWidth());
$ShelvingOption->setHeightList($UpdateShelvingOption->getHeightList());
$ShelvingOption->setFullHeight($UpdateShelvingOption->getFullHeight());
$ShelvingOption->setItems($UpdateShelvingOption->getItems());
$ShelvingOption->setRowDoors($UpdateShelvingOption->getRowDoors());
$ShelvingOption->setRowDrawers($UpdateShelvingOption->getRowDrawers());
$ShelvingOption->setDepth($UpdateShelvingOption->getDepth());
$ShelvingOption->setTexture($UpdateShelvingOption->getTexture());
$ShelvingOption->setColorId($UpdateShelvingOption->getColorId());
$ShelvingOption->setBackPanel($UpdateShelvingOption->getBackPanel());
$ShelvingOption->setDoorSwing($UpdateShelvingOption->getDoorSwing());
$ShelvingOption->setFileName($UpdateShelvingOption->getFileName());
$ShelvingOption->setProduct($Product);
$this->entityManager->persist($ShelvingOption);
$this->entityManager->flush($ShelvingOption);
$this->addSuccess('登録しました。', 'admin');
return $this->redirectToRoute('shelving_option4_admin_product', ['id' => $id]);
}
/**
* @Route("/%eccube_admin_route%/shelving_option4/product/image/add", name="shelving_option4_admin_product_image_add", methods={"POST"})
*/
public function addImage(Request $request)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
$product_id = $request->get('id');
$image_base64 = $request->get('image');
$allowExtensions = ['gif', 'jpg', 'jpeg', 'png'];
$file = '';
if($product_id && $image_base64) {
$data_image_png_base64 = 'data:image/png;base64,';
if(substr($image_base64, 0, strlen($data_image_png_base64)) == $data_image_png_base64) {
$image = str_replace($data_image_png_base64, '', $image_base64);
$image = str_replace(' ', '+', $image);
$image = base64_decode($image);
$extension = 'png';
$filename = $product_id . '.' . $extension;
file_put_contents($this->eccubeConfig['eccube_temp_shelving_image_dir'] . '/' . $filename, $image);
$file = $filename;
}
}
$event = new EventArgs(
[
'file' => $file,
],
$request
);
$file = $event->getArgument('file');
return $this->json(['file' => $file], 200);
}
}