<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Controller;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\Master\ProductStatus;
use Eccube\Entity\Product;
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\Entity\ProductClass;
use Eccube\Entity\Category;
use Eccube\Entity\ClassCategory;
use Eccube\Entity\ClassName;
use Eccube\Repository\ProductClassRepository;
use Eccube\Repository\CustomerFavoriteProductRepository;
use Eccube\Repository\CategoryRepository;
use Eccube\Repository\Master\ProductListMaxRepository;
use Customize\Repository\ProductImageAngleRepository;
use Customize\Repository\ProductImageAngleSpRepository;
use Customize\Repository\ProductImageColorRepository;
use Customize\Repository\ProductImageColorSpRepository;
use Eccube\Repository\ProductRepository;
use Customize\Entity\ProductImageAngle;
use Customize\Entity\ProductImageAngleSp;
use Customize\Entity\ProductImageColor;
use Customize\Entity\ProductImageColorSp;
use Customize\Entity\ProductCategory;
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 Eccube\Repository\ClassNameRepository;
use Eccube\Repository\ClassCategoryRepository;
use Eccube\Repository\ProductCategoryRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class ProductController extends AbstractController
{
/**
* @var PurchaseFlow
*/
protected $purchaseFlow;
/**
* @var CustomerFavoriteProductRepository
*/
protected $customerFavoriteProductRepository;
/**
* @var ProductClassRepository
*/
protected $productClassRepository;
/**
* @var CartService
*/
protected $cartService;
/**
* @var CategoryRepository
*/
protected $categoryRepository;
/**
* @var ClassCategoryRepository
*/
protected $classCategoryRepository;
/**
* @var ClassNameRepository
*/
protected $classNameRepository;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var ProductImageAngleRepository
*/
protected $productImageAngleRepository;
/**
* @var ProductImageAngleSpRepository
*/
protected $productImageAngleSpRepository;
/**
* @var ProductImageColorRepository
*/
protected $productImageColorRepository;
/**
* @var ProductImageColorSpRepository
*/
protected $productImageColorSpRepository;
/**
* @var ProductCategoryRepository
*/
protected $productCategoryaRepository;
/**
* @var BaseInfo
*/
protected $BaseInfo;
/**
* @var AuthenticationUtils
*/
protected $helper;
/**
* @var ProductListMaxRepository
*/
protected $productListMaxRepository;
private $title = '';
/**
* ProductController constructor.
*
* @param PurchaseFlow $cartPurchaseFlow
* @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
* @param CartService $cartService
* @param ProductRepository $productRepository
* @param ProductImageAngleRepository $productImageAngleRepository
* @param ProductImageAngleSpRepository $productImageAngleSpRepository
* @param ProductImageColorRepository $productImageColorRepository
* @param ProductImageColorSpRepository $productImageColorspRepository
* @param ProductCategoryRepository $productCategoryRepository
* @param BaseInfoRepository $baseInfoRepository
* @param CategoryRepository $categoryRepository
* @param AuthenticationUtils $helper
* @param ClassCategoryRepository $classCategoryRepository
* @param ClassNameRepository $classNameRepository
* @param ProductListMaxRepository $productListMaxRepository
* @param ProductClassRepository $productClassRepository
*/
public function __construct(
PurchaseFlow $cartPurchaseFlow,
CustomerFavoriteProductRepository $customerFavoriteProductRepository,
CartService $cartService,
ProductRepository $productRepository,
BaseInfoRepository $baseInfoRepository,
ProductImageAngleRepository $productImageAngleRepository,
ProductImageAngleSpRepository $productImageAngleSpRepository,
ClassCategoryRepository $classCategoryRepository,
CategoryRepository $categoryRepository,
ClassNameRepository $classNameRepository,
ProductClassRepository $productClassRepository,
ProductImageColorRepository $productImageColorRepository,
ProductImageColorSpRepository $productImageColorSpRepository,
ProductCategoryRepository $productCategoryRepository,
AuthenticationUtils $helper,
ProductListMaxRepository $productListMaxRepository
) {
$this->purchaseFlow = $cartPurchaseFlow;
$this->customerFavoriteProductRepository = $customerFavoriteProductRepository;
$this->productClassRepository = $productClassRepository;
$this->classCategoryRepository = $classCategoryRepository;
$this->classNameRepository = $classNameRepository;
$this->categoryRepository = $categoryRepository;
$this->cartService = $cartService;
$this->productRepository = $productRepository;
$this->productImageAngleRepository = $productImageAngleRepository;
$this->productImageAngleSpRepository = $productImageAngleSpRepository;
$this->productImageColorRepository = $productImageColorRepository;
$this->productImageColorSpRepository = $productImageColorSpRepository;
$this->productCategoryRepository = $productCategoryRepository;
$this->BaseInfo = $baseInfoRepository->get();
$this->helper = $helper;
$this->productListMaxRepository = $productListMaxRepository;
}
/**
* 商品一覧画面.
*
* @Route("/products/list", name="products_all")
* @Template("Product/index.twig")
*/
public function index(Request $request, Paginator $paginator)
{
$all_items = $this->productRepository->findBy(array());
// Dump($all_items);
// foreach ($all_items as $product){
// $colors_product = $this->productClassRepository->findBy(['Product' => $Product]);
// foreach ($colors_product as $one_class){
// $one_class->getClassCategory1
// }
// }
$categories = $this->categoryRepository->findBy(array());
$category_array = array();
$parents_all_dic = array();
foreach ($categories as $category){
$parent = $category->getParent();
// Dump($parent);
// exit;
// $parent = $parent->getId();
if ($parent != null){
$parent = $parent->getId();
$child = $category->getId();
array_push($category_array[$parent], $child);
}else{
$category_array[$category->getId()] = array();
}
$parents_all_dic[$category->getId()] = $category;
}
$all_class_array = array();
foreach ($all_items as $Product){
$key = $Product->getId();
// if (!array_key_exists($key, $all_class_array)){
// $all_class_array[$key] = array();
// }
$class_array = array();
$diffrent_products = $this->productClassRepository->findBy(array('Product' => $Product, 'visible' => 1));
$class_name = $this->classNameRepository->findOneBy(array('name' => 'color'));
$class_cates = $this->classCategoryRepository->findBy(array('ClassName' => $class_name));
$product_class_1 = $this->productClassRepository->findBy(array('ClassCategory1' => $class_cates, 'Product' => $Product, 'visible' => 1));
$product_class_2 = $this->productClassRepository->findBy(array('ClassCategory2' => $class_cates, 'Product' => $Product, 'visible' => 1));
// Dump($product_class_1);
// Dump($product_class_2);
foreach ($product_class_1 as $product_class){
$class_cate1 = $product_class->getClassCategory1();
if (!in_array($class_cate1, $class_array)){
Dump($class_cate1);
// exit;
array_push($class_array, $class_cate1);
}
}
foreach ($product_class_2 as $product_class){
$class_cate2 = $product_class->getClassCategory2();
if (!in_array($class_cate2, $class_array)){
array_push($class_array, $class_cate2);
}
}
$all_class_array[$key] = $class_array;
}
return [
'Products' => $all_items,
'Category_relation' => $category_array,
'Categories' => $parents_all_dic,
'Colors' => $all_class_array
];
}
/**
* 商品一覧画面.
*
* @Route("/products", name="product_list")
* @Template("Product/index.twig")
*/
public function list(Request $request, Paginator $paginator)
{
// Doctrine SQLFilter
if ($this->BaseInfo->isOptionNostockHidden()) {
$this->entityManager->getFilters()->enable('option_nostock_hidden');
}
// handleRequestは空のqueryの場合は無視するため
if ($request->getMethod() === 'GET') {
$request->query->set('pageno', $request->query->get('pageno', ''));
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder('', SearchProductType::class);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_INITIALIZE, $event);
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
// paginator
$searchData = $searchForm->getData();
$qb = $this->productRepository->getQueryBuilderBySearchData($searchData);
$event = new EventArgs(
[
'searchData' => $searchData,
'qb' => $qb,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_SEARCH, $event);
$searchData = $event->getArgument('searchData');
$query = $qb->getQuery()
->useResultCache(true, $this->eccubeConfig['eccube_result_cache_lifetime_short']);
//$ProductsAndClassCategories = $this->productRepository->findProductsBySearchData(null, 'p.id');
$categories = $this->categoryRepository->findBy(array());
$category_array = array();
$parents_all_dic = array();
foreach ($categories as $category){
$parent = $category->getParent();
if ($parent != null){
$parent = $parent->getId();
$child = $category->getId();
array_push($category_array[$parent], $child);
}else{
$category_array[$category->getId()] = array();
}
$parents_all_dic[$category->getId()] = $category;
}
$all_class_array = array();
$list_image_array = array();
// foreach ($ProductsAndClassCategories as $Product){
// $key = $Product->getId();
//
// $class_array = array();
// $diffrent_products = $this->productClassRepository->findBy(array('Product' => $Product, 'visible' => 1));
// $class_name = $this->classNameRepository->findOneBy(array('name' => 'color'));
//
// $class_cates = $this->classCategoryRepository->findBy(array('ClassName' => $class_name));
// $product_class_1 = $this->productClassRepository->findBy(array('ClassCategory1' => $class_cates, 'Product' => $Product, 'visible' => 1));
// $product_class_2 = $this->productClassRepository->findBy(array('ClassCategory2' => $class_cates, 'Product' => $Product, 'visible' => 1));
//
// foreach ($product_class_1 as $product_class){
// $class_cate1 = $product_class->getClassCategory1();
// if (!in_array($class_cate1, $class_array)){
// array_push($class_array, $class_cate1);
// }
// }
//
//
// foreach ($product_class_2 as $product_class){
// $class_cate2 = $product_class->getClassCategory2();
// if (!in_array($class_cate2, $class_array)){
// array_push($class_array, $class_cate2);
// }
// }
//
// $all_class_array[$key] = $class_array;
//
// $list_image = $this->productImageAngleRepository->findOneBy(['Product' => $Product, 'angle' => 'list']);
// $list_image_array[$key] = $list_image;
//
// }
$rootCategory = $this->getRootCategory();
$all_colors = $this->getAllClassCategories('color');
$all_sizes = $this->getAllClassCategories('size');
// Dump($ProductsAndClassCategories[134]);
// exit;
return [
'Category_relation' => $category_array,
'rootCategories' => $rootCategory,
'all_colors' => $all_colors,
'all_sizes' => $all_sizes,
'Categories' => $parents_all_dic,
];
}
public function getAllClassCategories($class)
{
$class_name = $this->classNameRepository->findOneBy(array('name' => $class));
$all_class_categories = $this->classCategoryRepository->findBy(array('ClassName' => $class_name));
return $all_class_categories;
}
/**
* 商品一覧画面.
*
* @Route("/products/list_api", name="product_list_api")
* @Template("Product/Product_items.twig")
*/
public function list_api(Request $request, Paginator $paginator)
{
//?category_id=23とかで絞れる
//?detail_flg=1 or 0
//if: detail_flg ==1, then it means it came from products/detail
// $detail_flg = $request->query->get('detail_flg');
//
// //special_flg is 1 if it receive ajax from /special
// $special_flg = $request->query->get('special_flg');
// Doctrine SQLFilter
if ($this->BaseInfo->isOptionNostockHidden()) {
$this->entityManager->getFilters()->enable('option_nostock_hidden');
}
// handleRequestは空のqueryの場合は無視するため
if ($request->getMethod() === 'GET') {
$request->query->set('pageno', $request->query->get('pageno', ''));
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder('', SearchProductType::class);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_INITIALIZE, $event);
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
// paginator
$searchData = $searchForm->getData();
$qb = $this->productRepository->getQueryBuilderBySearchData($searchData);
$event = new EventArgs(
[
'searchData' => $searchData,
'qb' => $qb,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_SEARCH, $event);
$searchData = $event->getArgument('searchData');
$query = $qb->getQuery()
->useResultCache(true, $this->eccubeConfig['eccube_result_cache_lifetime_short']);
$price = $request->query->get('price');
$category = $request->query->get('category');
$color = $request->query->get('color');
$searchData = array();
if ($category !== 'all'){
$searchData['category'] = $category;
}
if ($price !== null){
$searchData['price'] = $price;
}
if ($color !== null){
$searchData['color'] = $color;
}
$ProductsAndClassCategories = $this->productRepository->findProductsBySearchData($searchData);
$categories = $this->categoryRepository->findBy(array());
$category_array = array();
$parents_all_dic = array();
foreach ($categories as $category){
$parent = $category->getParent();
// Dump($parent);
// exit;
// $parent = $parent->getId();
if ($parent != null){
$parent = $parent->getId();
$child = $category->getId();
array_push($category_array[$parent], $child);
}else{
$category_array[$category->getId()] = array();
}
$parents_all_dic[$category->getId()] = $category;
}
//Dump($ProductsAndClassCategories);
//exit;
$all_class_array = array();
foreach ($ProductsAndClassCategories as $Product){
$key = $Product->getId();
$class_array = array();
$diffrent_products = $this->productClassRepository->findBy(array('Product' => $Product, 'visible' => 1));
$class_name = $this->classNameRepository->findOneBy(array('name' => 'color'));
$class_cates = $this->classCategoryRepository->findBy(array('ClassName' => $class_name));
$product_class_1 = $this->productClassRepository->findBy(array('ClassCategory1' => $class_cates, 'Product' => $Product, 'visible' => 1));
$product_class_2 = $this->productClassRepository->findBy(array('ClassCategory2' => $class_cates, 'Product' => $Product, 'visible' => 1));
// Dump($product_class_1);
// Dump($product_class_2);
foreach ($product_class_1 as $product_class){
$class_cate1 = $product_class->getClassCategory1();
if (!in_array($class_cate1, $class_array)){
//Dump($class_cate1);
// exit;
array_push($class_array, $class_cate1);
}
}
foreach ($product_class_2 as $product_class){
$class_cate2 = $product_class->getClassCategory2();
if (!in_array($class_cate2, $class_array)){
array_push($class_array, $class_cate2);
}
}
$all_class_array[$key] = $class_array;
}
$new_products = array();
foreach ($ProductsAndClassCategories as $product){
$default_item = $this->productImageColorRepository->findOneBy(['Product' => $product, 'default' => 1]);
$list_image = $this->productImageAngleRepository->findOneBy(['Product' => $product, 'angle' => 'list']);
$filename = '';
$default_color = '';
if ($default_item != null){
$filename = $default_item->getFileName();
$default_color = $default_item->getColor();
}
$default_color_name = '';
if ($default_color !== null){
$default_color_name = $this->classCategoryRepository->find($default_color);
}
$new_product = array(
'id' => $product->getId(),
'name' => $product->getName(),
'product_name_en' => $product->getProductNameEn(),
'styleno' => $product->getStyleNo(),
'photo_path' => $filename,
'default_color' => $default_color,
'default_color_name' => $default_color_name,
'list_image' => $list_image,
'tags' => $product->getTags(),
'is_sale' => $product->getIsSale()
);
array_push($new_products, $new_product);
}
$source = $request->query->get('source'); //どこのurlから飛んできたか
// Dump($detail_flg);
//exit;
if ($source == 'products_list'){
return [
'Products' => $new_products,
'Colors' => $all_class_array,
'source' => $source
];
}else if ($source == 'product_detail'){
$new_products = array_slice($new_products,0, 7);
return [
'Products' => $new_products,
'source' => $source
];
}else if ($source == 'special'){
return [
'Products' => $new_products,
'source' => $source
];
}
}
//ルートカテゴリを取得する関数
public function getRootCategory(){
$rootCategory = $this->categoryRepository->findBy(array('Parent' => null));
return $rootCategory;
}
/**
* 子カテゴリを取得するapi
*
* @Route("/products/getCategoryChildren", name="get_ategory_children")
* @Template("Product/categoryChildren.twig")
*/
public function getCategoryChildren(Request $request)
{
$category_id = $request->query->get('parent_id');
$category = $this->categoryRepository->findOneBy(array('id' => $category_id));
$children = $category->getChildren();
return [
'children' => $children
];
}
/**
* 商品一覧画面.
*
* @Route("/products/___list", name="product_li")
* @Template("Product/list.twig")
*/
public function aaa(Request $request, Paginator $paginator)
{
// Doctrine SQLFilter
if ($this->BaseInfo->isOptionNostockHidden()) {
$this->entityManager->getFilters()->enable('option_nostock_hidden');
}
// handleRequestは空のqueryの場合は無視するため
if ($request->getMethod() === 'GET') {
$request->query->set('pageno', $request->query->get('pageno', ''));
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder('', SearchProductType::class);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_INITIALIZE, $event);
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
// paginator
$searchData = $searchForm->getData();
$qb = $this->productRepository->getQueryBuilderBySearchData($searchData);
$event = new EventArgs(
[
'searchData' => $searchData,
'qb' => $qb,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_SEARCH, $event);
$searchData = $event->getArgument('searchData');
$query = $qb->getQuery()
->useResultCache(true, $this->eccubeConfig['eccube_result_cache_lifetime_short']);
/** @var SlidingPagination $pagination */
$pagination = $paginator->paginate(
$query,
!empty($searchData['pageno']) ? $searchData['pageno'] : 1,
!empty($searchData['disp_number']) ? $searchData['disp_number']->getId() : $this->productListMaxRepository->findOneBy([], ['sort_no' => 'ASC'])->getId()
);
$ids = [];
foreach ($pagination as $Product) {
$ids[] = $Product->getId();
}
$ProductsAndClassCategories = $this->productRepository->findProductsWithSortedClassCategories($ids, 'p.id');
Dump($ProductsAndClassCategories);
exit;
// addCart form
$forms = [];
foreach ($pagination as $Product) {
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder(
'',
AddCartType::class,
null,
[
'product' => $ProductsAndClassCategories[$Product->getId()],
'allow_extra_fields' => true,
]
);
$addCartForm = $builder->getForm();
$forms[$Product->getId()] = $addCartForm->createView();
}
// 表示件数
$builder = $this->formFactory->createNamedBuilder(
'disp_number',
ProductListMaxType::class,
null,
[
'required' => false,
'allow_extra_fields' => true,
]
);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_DISP, $event);
$dispNumberForm = $builder->getForm();
$dispNumberForm->handleRequest($request);
// ソート順
$builder = $this->formFactory->createNamedBuilder(
'orderby',
ProductListOrderByType::class,
null,
[
'required' => false,
'allow_extra_fields' => true,
]
);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_ORDER, $event);
$orderByForm = $builder->getForm();
$orderByForm->handleRequest($request);
$Category = $searchForm->get('category_id')->getData();
return [
'subtitle' => $this->getPageTitle($searchData),
'pagination' => $pagination,
'search_form' => $searchForm->createView(),
'disp_number_form' => $dispNumberForm->createView(),
'order_by_form' => $orderByForm->createView(),
'forms' => $forms,
'Category' => $Category,
];
}
/**
* 商品詳細画面.
*
* @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)
{
if (!$this->checkVisibility($Product)) {
throw new NotFoundHttpException();
}
//tag確認
// Dump($Product->getTags()[0]->getName());
// exit;
$builder = $this->formFactory->createNamedBuilder(
'',
AddCartType::class,
null,
[
'product' => $Product,
'id_add_product_id' => false,
]
);
$event = new EventArgs(
[
'builder' => $builder,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_DETAIL_INITIALIZE, $event);
$is_favorite = false;
if ($this->isGranted('ROLE_USER')) {
$Customer = $this->getUser();
$is_favorite = $this->customerFavoriteProductRepository->isFavorite($Customer, $Product);
}
//Dump($Product);
// $color = $this->productImageColorRepository->findBy(['Product' => $Product]);
// Dump($color);
// exit;
$class_array = array();
//どんな色があるか調べる
$diffrent_products = $this->productClassRepository->findBy(array('Product' => $Product, 'visible' => 1));
$class_name = $this->classNameRepository->findOneBy(array('name' => 'color'));
$class_cates = $this->classCategoryRepository->findBy(array('ClassName' => $class_name));
$product_class_1 = $this->productClassRepository->findBy(array('ClassCategory1' => $class_cates, 'Product' => $Product, 'visible' => 1));
$product_class_2 = $this->productClassRepository->findBy(array('ClassCategory2' => $class_cates, 'Product' => $Product, 'visible' => 1));
foreach ($product_class_1 as $product_class){
$class_cate1 = $product_class->getClassCategory1();
if (!in_array($class_cate1, $class_array)){
array_push($class_array, $class_cate1);
}
}
foreach ($product_class_2 as $product_class){
$class_cate2 = $product_class->getClassCategory2();
if (!in_array($class_cate2, $class_array)){
array_push($class_array, $class_cate2);
}
}
//Dump($class_array);
$colors = '';
$colors_imgs = array(
'default'=> array(),
'all' => array()
);
//スマホならば true
function is_mobile()
{
$user_agent = $_SERVER['HTTP_USER_AGENT']; // HTTP ヘッダからユーザー エージェントの文字列を取り出す
return preg_match('/iphone|ipod|ipad|android/ui', $user_agent) != 0; // 既知の判定用文字列を検索
}
//管理画面で、「色画像の順番」
if ($Product->getNote() !== null){
$color_orders = explode(":", $Product->getNote());
foreach ($color_orders as $color){
$upper_color = strtoupper($color);
$color = $this->classCategoryRepository->findOneBy(['name' => $upper_color]);
$color_id = $color->getId();
$filename = '';
if ($color_id !== 0){
if (is_mobile() == true){
$colorimage = $this->productImageColorSpRepository->findOneBy(['Product' => $Product, 'color' => $color_id]);
}else{
$colorimage = $this->productImageColorRepository->findOneBy(['Product' => $Product, 'color' => $color_id]);
}
if ($colorimage !== null){
$filename = $colorimage->getFileName();
}
}
array_push($colors_imgs['all'],
array(
'class' => $color,
'filename' => $filename
)
);
}
}
$default_item = $this->productImageColorRepository->findOneBy(['Product' => $Product, 'default' => 1]);
if ($default_item != null){
$colors_imgs['default']['class'] = 1;
$colors_imgs['default']['filename'] = $default_item->getFileName();
}
if (count($class_array) !== 0){
$color_first = $class_array[0];
$colors .= $color_first->getName();
$class_array = array_slice($class_array, 1);
foreach ($class_array as $color){
$name = $color->getName();
$colors .= ', '.$name;
}
}
$all_images_filename = '';
$all_images = $this->productImageColorRepository->findOneBy(['Product' => $Product, 'color' => 0]);
if ($all_images !== null){
$all_images_filename = $all_images->getFileName();
}
//angle 画像ファイルを取ってくる
$angle_imgs = array(
'front' => '',
'side' => '',
'top' => '',
'back' => '',
'detail1' => '',
'detail2' => '',
'model' => '',
'list' => ''
);
$image_angles = $this->productImageAngleRepository->findBy(['Product' => $Product]);
foreach($image_angles as $img){
$angle = $img->getAngle();
$filename = $img->getFileName();
$angle_imgs[$angle] = $filename;
}
//angle sp 画像ファイルを取ってくる
$angleSp_imgs = array(
'front' => '',
'side' => '',
'top' => '',
'back' => '',
'detail1' => '',
'detail2' => '',
'model' => '',
);
$image_anglesSp = $this->productImageAngleSpRepository->findBy(['Product' => $Product]);
foreach($image_anglesSp as $img){
$angle = $img->getAngle();
$filename = $img->getFileName();
$angleSp_imgs[$angle] = $filename;
}
//関連するカテゴリ
$categories = $this->productCategoryRepository->findBy(['Product' => $Product]);
//Dump($aaa);
$close_cat = '';
foreach($categories as $cat){
//Dump($key->getCategory()->getChildren());
$parent_cat = $cat->getCategory()->getParents();
if (count($parent_cat) != 0){
$close_cat = $cat->getCategory();
}
}
//これでサーバーと通信して商品一覧を取ってくる
return [
'title' => $this->title,
'subtitle' => $Product->getName(),
'form' => $builder->getForm()->createView(),
'Product' => $Product,
'is_favorite' => $is_favorite,
'colors' => $colors,
'angles' => $angle_imgs,
'anglesSp' => $angleSp_imgs,
'all_images' => $all_images_filename,
'colors_imgs' => $colors_imgs,
'close_cat' => $close_cat
];
}
/**
* お気に入り追加.
*
* @Route("/products/add_favorite/{id}", name="product_add_favorite", requirements={"id" = "\d+"})
*/
public function addFavorite(Request $request, Product $Product)
{
$this->checkVisibility($Product);
$event = new EventArgs(
[
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_FAVORITE_ADD_INITIALIZE, $event);
if ($this->isGranted('ROLE_USER')) {
$Customer = $this->getUser();
$this->customerFavoriteProductRepository->addFavorite($Customer, $Product);
$this->session->getFlashBag()->set('product_detail.just_added_favorite', $Product->getId());
$event = new EventArgs(
[
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_FAVORITE_ADD_COMPLETE, $event);
return $this->redirectToRoute('product_detail', ['id' => $Product->getId()]);
} else {
// 非会員の場合、ログイン画面を表示
// ログイン後の画面遷移先を設定
$this->setLoginTargetPath($this->generateUrl('product_add_favorite', ['id' => $Product->getId()]));
$this->session->getFlashBag()->set('eccube.add.favorite', true);
$event = new EventArgs(
[
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_FAVORITE_ADD_COMPLETE, $event);
return $this->redirectToRoute('mypage_login');
}
}
/**
* カートに追加.
*
* @Route("/products/add_cart/{id}", name="product_add_cart", methods={"POST"}, requirements={"id" = "\d+"})
*/
public function addCart(Request $request, Product $Product)
{
// エラーメッセージの配列
$errorMessages = [];
if (!$this->checkVisibility($Product)) {
throw new NotFoundHttpException();
}
$builder = $this->formFactory->createNamedBuilder(
'',
AddCartType::class,
null,
[
'product' => $Product,
'id_add_product_id' => false,
]
);
$event = new EventArgs(
[
'builder' => $builder,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_CART_ADD_INITIALIZE, $event);
/* @var $form \Symfony\Component\Form\FormInterface */
$form = $builder->getForm();
$form->handleRequest($request);
if (!$form->isValid()) {
throw new NotFoundHttpException();
}
$addCartData = $form->getData();
log_info(
'カート追加処理開始',
[
'product_id' => $Product->getId(),
'product_class_id' => $addCartData['product_class_id'],
'quantity' => $addCartData['quantity'],
]
);
// カートへ追加
$this->cartService->addProduct($addCartData['product_class_id'], $addCartData['quantity']);
// 明細の正規化
$Carts = $this->cartService->getCarts();
foreach ($Carts as $Cart) {
$result = $this->purchaseFlow->validate($Cart, new PurchaseContext($Cart, $this->getUser()));
// 復旧不可のエラーが発生した場合は追加した明細を削除.
if ($result->hasError()) {
$this->cartService->removeProduct($addCartData['product_class_id']);
foreach ($result->getErrors() as $error) {
$errorMessages[] = $error->getMessage();
}
}
foreach ($result->getWarning() as $warning) {
$errorMessages[] = $warning->getMessage();
}
}
$this->cartService->save();
log_info(
'カート追加処理完了',
[
'product_id' => $Product->getId(),
'product_class_id' => $addCartData['product_class_id'],
'quantity' => $addCartData['quantity'],
]
);
$event = new EventArgs(
[
'form' => $form,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE, $event);
if ($event->getResponse() !== null) {
return $event->getResponse();
}
if ($request->isXmlHttpRequest()) {
// ajaxでのリクエストの場合は結果をjson形式で返す。
// 初期化
$done = null;
$messages = [];
if (empty($errorMessages)) {
// エラーが発生していない場合
$done = true;
array_push($messages, trans('front.product.add_cart_complete'));
} else {
// エラーが発生している場合
$done = false;
$messages = $errorMessages;
}
return $this->json(['done' => $done, 'messages' => $messages]);
} else {
// ajax以外でのリクエストの場合はカート画面へリダイレクト
foreach ($errorMessages as $errorMessage) {
$this->addRequestError($errorMessage);
}
return $this->redirectToRoute('cart');
}
}
public function defaultColorFromProduct($Product)
{
$default_item = $this->productImageColorRepository->findOneBy(['Product' => $Product, 'default' => 1]);
if ($default_item == null){
}else{
$default_color = $default_item->getColor();
$default_color_photo_url = $default_item->getFileName();
}
}
/**
* ページタイトルの設定
*
* @param null|array $searchData
*
* @return str
*/
protected function getPageTitle($searchData)
{
if (isset($searchData['name']) && !empty($searchData['name'])) {
return trans('front.product.search_result');
} elseif (isset($searchData['category_id']) && $searchData['category_id']) {
return $searchData['category_id']->getName();
} else {
return trans('front.product.all_products');
}
}
/**
* 閲覧可能な商品かどうかを判定
*
* @param Product $Product
*
* @return boolean 閲覧可能な場合はtrue
*/
protected function checkVisibility(Product $Product)
{
$is_admin = $this->session->has('_security_admin');
// Dump($is_admin);
// 管理ユーザの場合はステータスやオプションにかかわらず閲覧可能.
// if (!$is_admin) {
// // 在庫なし商品の非表示オプションが有効な場合.
// // if ($this->BaseInfo->isOptionNostockHidden()) {
// // if (!$Product->getStockFind()) {
// // return false;
// // }
// // }
// // 公開ステータスでない商品は表示しない.
//
// if ($Product->getStatus()->getId() !== ProductStatus::DISPLAY_SHOW) {
// return false;
// }
// }
if ($Product->getStatus()->getId() !== ProductStatus::DISPLAY_SHOW) {
return false;
}
return true;
}
}