<?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 Customize\Controller\Admin\Product;
use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Eccube\Common\EccubeConfig;
use Customize\Constant;
use Eccube\Event\EventArgs;
use Eccube\Event\EccubeEvents;
use Eccube\Repository\Master\PageMaxRepository;
use Eccube\Repository\CategoryRepository;
use Customize\Entity\Master\Disp;
use Customize\Form\Type\Admin\SearchProductPriorityType;
use Customize\Form\Type\Admin\ProductPriorityCategoryType;
use Customize\Repository\ProductPriorityRepository;
use Eccube\Repository\CustomerRepository;
use Knp\Component\Pager\PaginatorInterface;
use Eccube\Util\FormUtil;
use Customize\Entity\ProductPriority;
use Customize\Repository\SchoolRepository;
use Customize\Repository\ProductSchoolRepository;
use Eccube\Repository\ProductRepository;
class ProductPriorityController extends AbstractController
{
/**
* @var pageMaxRepository
*/
protected $pageMaxRepository;
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var productPriorityRepository
*/
protected $productPriorityRepository;
/**
* @var customerRepository
*/
protected $customerRepository;
/**
* @var categoryRepository
*/
protected $categoryRepository;
/**
* @var schoolRepository
*/
protected $schoolRepository;
/**
* @var productSchoolRepository
*/
protected $productSchoolRepository;
/**
* @var productRepository
*/
protected $productRepository;
public function __construct(
PageMaxRepository $pageMaxRepository,
EccubeConfig $eccubeConfig,
ProductPriorityRepository $productPriorityRepository,
CustomerRepository $customerRepository,
CategoryRepository $categoryRepository,
SchoolRepository $schoolRepository,
ProductSchoolRepository $productSchoolRepository,
ProductRepository $productRepository
) {
$this->pageMaxRepository = $pageMaxRepository;
$this->eccubeConfig = $eccubeConfig;
$this->productPriorityRepository = $productPriorityRepository;
$this->customerRepository = $customerRepository;
$this->categoryRepository = $categoryRepository;
$this->schoolRepository = $schoolRepository;
$this->productSchoolRepository = $productSchoolRepository;
$this->productRepository = $productRepository;
}
/**
* 商品並び順の一覧表示.
*
* @param Request $request
* @param null $categoryId null: 全商品, 1~: カテゴリ表示
*
* @return array
*/
/**
* @Route("/%eccube_admin_route%/product/priority", name="admin_product_priority", methods={"GET", "POST"})
* @Route("/%eccube_admin_route%/product/priority/{schoolId}", name="admin_product_priority_edit", requirements={"schoolId" = "\d+"}, methods={"GET", "POST"})
* @Template("@admin/ProductPriority/index.twig")
*/
public function index(Request $request, $schoolId = null)
{
// カテゴリの取得
// $Category = is_null($categoryId)
// ? null
// : $this->categoryRepository->find($categoryId);
// 商品並び順の取得
// $Priorities = $this->productPriorityRepository
// ->getPrioritiesByCategoryAsArray($Category);
$School = is_null($schoolId) ? $this->schoolRepository->findAll()[0] : $this->schoolRepository->find($schoolId);
$Priorities = $this->productSchoolRepository->findProductRankBySchool($School);
// カテゴリ一覧プルダウンForm生成
$builder = $this->formFactory
->createBuilder(
ProductPriorityCategoryType::class
);
$form = $builder->getForm();
// モーダルの商品検索Form生成
// $builder = $this->formFactory
// ->createBuilder(
// SearchProductPriorityType::class,
// array(
// 'category_name' => is_null($Category) ? '全ての商品' : $Category->getName(),
// )
// );
// $searchProductModalForm = $builder->getForm();
return array(
'form' => $form->createView(),
// 'searchProductModalForm' => $searchProductModalForm->createView(),
'Priorities' => $Priorities,
'School' => $School
);
}
/**
* 商品並び順の並び替えを行う.
*
* @Route("/%eccube_admin_route%/product/priority/move/{schoolId}", name="admin_product_priority_move", requirements={"schoolId" = "\d+"}, methods={"POST"})
*
* @param Request $request
* @param $schoolId
*
* @return boolean
*/
public function move(Request $request, $schoolId)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
$ranks = $request->request->all();
foreach ($ranks as $productId => $rank) {
$Priority = $this->productSchoolRepository
->findOneBy(array('Product' => $this->productRepository->find($productId), 'School' => $this->schoolRepository->find($schoolId)));
if($Priority){
$Priority->setRank($rank);
$this->entityManager->persist($Priority);
}
}
$this->entityManager->flush();
return new Response();
}
/**
* 商品並び順の一括削除.
*
* @Route("/%eccube_admin_route%/product/priority/delete/{categoryId}", name="admin_product_priority_delete", requirements={"categoryId" = "\d+"}, methods={"POST"})
*
* @param Request $request
* @param $categoryId
*
* @return boolean
*/
public function delete(Request $request, $categoryId)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
$productIds = $request->request->all();
foreach ($productIds as $productId) {
$Priority = $this->productPriorityRepository
->find(array('product_id' => $productId, 'category_id' => $categoryId));
$this->entityManager->remove($Priority);
}
$this->entityManager->flush();
// 並び順の振り直しを行う.
$Priorities = $this->productPriorityRepository
->findBy(array('category_id' => $categoryId), array('priority' => 'ASC'));
$i = 1;
foreach ($Priorities as $Priority) {
$Priority->setPriority($i++);
$this->entityManager->persist($Priority);
}
$this->entityManager->flush();
$this->addSuccess('admin.delete.complete', 'admin');
return new Response();
}
/**
* モーダル:商品検索.
*
* @Route("/%eccube_admin_route%/product/priority/search", name="admin_product_priority_search", methods={"GET", "POST"})
* @Template("@admin/ProductPriority/search_product.twig")
*
* @param Request $request
*
* @return Response
*/
public function search(Request $request, $page_no = null, PaginatorInterface $paginator)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
$search = $request->get('search');
$Category = null;
if ($categoryId = $request->get('category_id')) {
$Category = $this->categoryRepository->find($categoryId);
}
// 表示件数は順番で取得する、1.SESSION 2.設定ファイル
$page_count = $this->session->get('eccube.admin.product_priority.search.page_count', $this->eccubeConfig['eccube_default_page_count']);
$qb = $this->productPriorityRepository
->getProductQueryBuilder($search, $Category);
$pagination = $paginator->paginate(
$qb,
$page_no ? $page_no : 1,
$page_count,
array('wrap-queries' => true)
);
return array(
'pagination' => $pagination,
);
}
/**
* モーダル:商品並び順の登録.
*
* @Route("/%eccube_admin_route%/product/priority/register/{categoryId}", name="admin_product_priority_register", requirements={"categoryId" = "\d+"}, methods={"POST"})
*
* @param Request $request
* @param $categoryId
*
* @return bool
*/
public function register(Request $request, $categoryId)
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException();
}
$productIds = $request->get('productIds');
foreach ($productIds as $productId) {
$count = $this->productPriorityRepository
->countProductCategory($productId, $categoryId);
// 別タブで商品やカテゴリが削除されているような場合は登録をスキップ.
if ($count < 0) {
continue;
}
$ProductPriority = new ProductPriority();
$ProductPriority->setProductId($productId);
$ProductPriority->setCategoryId($categoryId);
$max = $this->productPriorityRepository
->getMaxPriorityByCategoryId($categoryId);
$ProductPriority->setPriority($max + 1);
$this->entityManager->persist($ProductPriority);
$this->entityManager->flush();
}
$this->addSuccess('admin.register.complete', 'admin');
return new Response();
}
}