<?php
namespace Plugin\Synplgbase\Controller;
use Eccube\Controller\ProductController as ParentProductController;
use Eccube\Repository\PageRepository;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\Master\ProductStatus;
use Eccube\Entity\Product;
use Eccube\Entity\ProductClass;
use Eccube\Entity\ClassName;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Form\Type\AddCartType;
use Eccube\Form\Type\Master\ProductListMaxType;
use Eccube\Form\Type\Master\ProductListOrderByType;
use Eccube\Form\Type\SearchProductType;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\CustomerFavoriteProductRepository;
use Eccube\Repository\Master\ProductListMaxRepository;
use Eccube\Repository\ProductRepository;
use Eccube\Repository\ClassNameRepository;
use Eccube\Repository\ClassCategoryRepository;
use Eccube\Service\CartService;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination;
use Knp\Component\Pager\Paginator;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
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\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class ProductController extends ParentProductController
{
/**
* @var PurchaseFlow
*/
protected $purchaseFlow;
/**
* @var CustomerFavoriteProductRepository
*/
protected $customerFavoriteProductRepository;
/**
* @var CartService
*/
protected $cartService;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var BaseInfo
*/
protected $BaseInfo;
/**
* @var AuthenticationUtils
*/
protected $helper;
/**
* @var ProductListMaxRepository
*/
protected $productListMaxRepository;
/**
* @var PageRepository
*/
protected $pageRepository;
/**
* @var ClassNameRepository
*/
protected $classNameRepository;
/**
* @var ClassCategoryRepository
*/
protected $classCategoryRepository;
private $title = '';
/**
* ProductController constructor.
*
* @param PurchaseFlow $cartPurchaseFlow
* @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
* @param CartService $cartService
* @param ProductRepository $productRepository
* @param BaseInfoRepository $baseInfoRepository
* @param AuthenticationUtils $helper
* @param ProductListMaxRepository $productListMaxRepository
* @param PageRepository $pageRepository
*/
public function __construct(
PurchaseFlow $cartPurchaseFlow,
CustomerFavoriteProductRepository $customerFavoriteProductRepository,
CartService $cartService,
ProductRepository $productRepository,
BaseInfoRepository $baseInfoRepository,
AuthenticationUtils $helper,
ProductListMaxRepository $productListMaxRepository,
PageRepository $pageRepository,
ClassNameRepository $classNameRepository,
ClassCategoryRepository $classCategoryRepository
) {
$this->purchaseFlow = $cartPurchaseFlow;
$this->customerFavoriteProductRepository = $customerFavoriteProductRepository;
$this->cartService = $cartService;
$this->productRepository = $productRepository;
$this->BaseInfo = $baseInfoRepository->get();
$this->helper = $helper;
$this->productListMaxRepository = $productListMaxRepository;
$this->pageRepository = $pageRepository;
$this->classNameRepository = $classNameRepository;
$this->classCategoryRepository = $classCategoryRepository;
}
/**
* 商品一覧画面.
*
* @Route("/products/list", name="product_list")
* @Template("Product/list.twig")
*/
public function index(Request $request, Paginator $paginator)
{
$arrRet = parent::index($request, $paginator);
//タグの情報を作成
$search_form=$arrRet['search_form'];
$arrVars = $search_form->vars;
$arrValues = $arrVars['value'];
$arrRet['Tag'] = $arrValues['tag_id'];
return $arrRet;
}
/**
* 商品詳細画面.
*
* @Route("/products/detail/{id}", name="product_detail", methods={"GET"}, requirements={"id" = "\d+"})
* @Template("Product/detail.twig")
* @ParamConverter("Product", options={"repository_method" = "findWithSortedClassCategories"})
*
* @param Request $request
* @param Product $Product
*
* @return array
*/
public function detail(Request $request, Product $Product)
{
//親のdetailで作成される変数を用意する。titleとsub_titleは使わない
$arrRarent = parent::detail($request,$Product);
$form = $arrRarent['form'];
$Product = $arrRarent['Product'];
$is_favorite = $arrRarent['is_favorite'];
// 規格名1/2から組み合わせを生成し, DBから取得した商品規格とマージする.
// Synplgbase/Resource/template/sample_classcategory_table.twigのコードを商品詳細ページで使うための変数作成
if(isset($form['classcategory_id1'])){
$ClassName1 = $this->classNameRepository->findOneBy(['name'=>$Product->getClassName1()]);
$ClassName2 = $this->classNameRepository->findOneBy(['name'=>$Product->getClassName2()]);
$ProductClasses = $Product->getProductClasses();
$ProductClasses = $this->mergeProductClasses(
$this->createProductClasses($ClassName1, $ClassName2),
$ProductClasses);
}
//ページのタイトル変更用
$Page = $this->pageRepository
->findOneBy([
'id' => 3,
]);
if(!empty($Product->getAuthor())) $Page->setAuthor($Product->getAuthor());
if(!empty($Product->getDescription())) $Page->setDescription($Product->getDescription());
if(!empty($Product->getKeyword())) $Page->setKeyword($Product->getKeyword());
if(!empty($Product->getMetaRobots())) $Page->setMetaRobots($Product->getMetaRobots());
if(!empty($Product->getMetaTags())) $Page->setMetaTags($Product->getMetaTags());
if(!empty($Product->getTitle())){
$subtitle=$Product->getTitle();
}
else{
$subtitle=$Product->getName();
}
//「関連カテゴリ」表示で、親カテを重複して表示させない
$arrTemp=array();
foreach($Product->getProductCategories() as $ProductCategory){
if($ProductCategory->getCategory()->getParent()){
$arrTemp[]=$ProductCategory->getCategory()->getParent()->getId();
};
}
foreach($Product->getProductCategories() as $key=>$value){
if(in_array($value['category_id'],$arrTemp)){
unset($Product->getProductCategories()[$key]);
}
}
return [
'Page' => $Page,
'subtitle' => $subtitle,
'form' => $form,
'Product' => $Product,
'is_favorite' => $is_favorite,
'ProductClasses' => $ProductClasses??NULL
];// オリジナルはここで'title' => $this->titleで空の値をパスしてますが、そのラインを削除して、他ページと同様、ページ管理の値がtitleに入るようにしてます。
}
/**
* ページタイトルの設定
*
* @param null|array $searchData
*
* @return str
*/
protected function getPageTitle($searchData)
{
//タグの情報を追加して、検索結果のタイトルを変更
if (isset($searchData['name']) && !empty($searchData['name'])) {
return '「'.$searchData['name'].'」の'.trans('front.product.search_result');
} elseif (isset($searchData['category_id']) && $searchData['category_id']) {
return $searchData['category_id']->getName();
} elseif (isset($searchData['tag_id']) && $searchData['tag_id']) {
return $searchData['tag_id']->getName();
} else {
return trans('front.product.all_products');
}
}
/**
* 規格名1/2から, 商品規格の組み合わせを生成する. copied from src/Eccube/Controller/Admin/Product/ProductClassController.php
*
* @param ClassName $ClassName1
* @param ClassName|null $ClassName2
*
* @return array|ProductClass[]
*/
protected function createProductClasses(ClassName $ClassName1, ClassName $ClassName2 = null)
{
$ProductClasses = [];
$ClassCategories1 = $this->classCategoryRepository->findBy(['ClassName' => $ClassName1], ['sort_no' => 'DESC']);
$ClassCategories2 = [];
if ($ClassName2) {
$ClassCategories2 = $this->classCategoryRepository->findBy(['ClassName' => $ClassName2],['sort_no' => 'DESC']);
}
foreach ($ClassCategories1 as $ClassCategory1) {
// 規格1のみ
if (!$ClassName2) {
$ProductClass = new ProductClass();
$ProductClass->setClassCategory1($ClassCategory1);
$ProductClasses[] = $ProductClass;
continue;
}
// 規格1/2
foreach ($ClassCategories2 as $ClassCategory2) {
$ProductClass = new ProductClass();
$ProductClass->setClassCategory1($ClassCategory1);
$ProductClass->setClassCategory2($ClassCategory2);
$ProductClasses[] = $ProductClass;
}
}
return $ProductClasses;
}
/**
* 商品規格の配列をマージする. copied from src/Eccube/Controller/Admin/Product/ProductClassController.php
*
* @param $ProductClassesForMatrix
* @param $ProductClasses
*
* @return array|ProductClass[]
*/
protected function mergeProductClasses($ProductClassesForMatrix, $ProductClasses)
{
$mergedProductClasses = [];
foreach ($ProductClassesForMatrix as $pcfm) {
foreach ($ProductClasses as $pc) {
if ($pcfm->getClassCategory1()->getId() === $pc->getClassCategory1()->getId()) {
$cc2fm = $pcfm->getClassCategory2();
$cc2 = $pc->getClassCategory2();
if (null === $cc2fm && null === $cc2) {
$mergedProductClasses[] = $pc;
continue 2;
}
if ($cc2fm && $cc2 && $cc2fm->getId() === $cc2->getId()) {
$mergedProductClasses[] = $pc;
continue 2;
}
}
}
$mergedProductClasses[] = $pcfm;
}
return $mergedProductClasses;
}
}