<?php
/*
* This file is part of Refine
*
* Copyright(c) 2024 Refine Co.,Ltd. All Rights Reserved.
*
* https://www.re-fine.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\RefineProductListFavorite42\Controller;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Product;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Repository\CustomerFavoriteProductRepository;
use Eccube\Repository\ProductRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Class ProductListFavoriteController.
*/
class ProductListFavoriteController extends AbstractController
{
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var CustomerFavoriteProductRepository
*
* @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
*/
protected $customerFavoriteProductRepository;
/**
* ProductListFavoriteController constructor.
*
* @param ProductRepository $productRepository
* @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
*/
public function __construct(
ProductRepository $productRepository,
CustomerFavoriteProductRepository $customerFavoriteProductRepository
) {
$this->productRepository = $productRepository;
$this->customerFavoriteProductRepository = $customerFavoriteProductRepository;
}
/**
* お気に入り追加
*
* @Route("/product_list_add_favorite", name="product_list_add_favorite")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function addFavorite(Request $request)
{
/** @var \Eccube\Entity\Product $Product */
$Product = $this->productRepository->find($request->get('id'));
if ($this->isGranted('ROLE_USER')) {
$Customer = $this->getUser();
$this->customerFavoriteProductRepository->addFavorite($Customer, $Product);
$this->session->getFlashBag()->set('product_detail.just_added_favorite', $Product->getId());
return $this->redirectToRoute('product_list', [
'mode' => $request->get('mode'),
'category_id' => $request->get('category_id'),
'name' => $request->get('name'),
'pageno' => $request->get('pageno'),
'disp_number' => $request->get('disp_number'),
'orderby' => $request->get('orderby'),
]);
} else {
// 非会員の場合、ログイン画面を表示
// ログイン後の画面遷移先を設定
$this->setLoginTargetPath($this->generateUrl('product_list_add_favorite', ['id' => $Product->getId()], UrlGeneratorInterface::ABSOLUTE_URL));
$this->session->getFlashBag()->set('eccube.add.favorite', true);
$event = new EventArgs(
[
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_PRODUCT_FAVORITE_ADD_COMPLETE);
return $this->redirectToRoute('mypage_login');
}
}
/**
* お気に入り削除
*
* @Route("/product_list_delete_favorite", name="product_list_delete_favorite")
* @param Request $request
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function deleteFavorite(Request $request)
{
/** @var \Eccube\Entity\Product $Product */
$Product = $this->productRepository->find($request->get('id'));
if ($Product && $this->isGranted('ROLE_USER')) {
/** @var \Eccube\Entity\Customer $Customer */
$Customer = $this->getUser();
/** @var \Eccube\Entity\CustomerFavoriteProduct $CustomerFavoriteProduct */
$CustomerFavoriteProduct =
$this->customerFavoriteProductRepository->findOneBy(['Customer' => $Customer, 'Product' => $Product]);
if ($CustomerFavoriteProduct) {
$this->customerFavoriteProductRepository->delete($CustomerFavoriteProduct);
$this->session->getFlashBag()->set('favorite_delete_button.deleted', $Product->getId());
} else {
$this->session->getFlashBag()->set('favorite_delete_button.already_deleted', $Product->getId());
}
} else {
$this->session->getFlashBag()->set('favorite_delete_button.none_product', $Product->getId());
}
return $this->redirectToRoute('product_list', [
'mode' => $request->get('mode'),
'category_id' => $request->get('category_id'),
'name' => $request->get('name'),
'pageno' => $request->get('pageno'),
'disp_number' => $request->get('disp_number'),
'orderby' => $request->get('orderby'),
]);
}
}