<?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;
use Customize\Event\EccubeEvents;
use Customize\Form\Type\SearchProductType;
use Customize\Repository\BitHistoryRepository;
use Customize\Repository\ProductRepository;
use Customize\Repository\PreviewTenderRepository;
use Customize\Repository\OrderRepository;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Product;
use Eccube\Event\EventArgs;
use Eccube\Repository\CustomerFavoriteProductRepository;
use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class TenderListController extends AbstractController
{
/**
* @var BitHistoryRepository
*/
protected $bitHistoryRepository;
/**
* @var CustomerFavoriteProductRepository
*/
protected $customerFavoriteProductRepository;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var PreviewTenderRepository
*/
protected $previewTenderRepository;
/**
* @var OrderRepository
*/
protected $orderRepository;
/**
* SuccessfulBidController constructor.
*/
public function __construct(
ProductRepository $productRepository,
PreviewTenderRepository $previewTenderRepository,
BitHistoryRepository $bitHistoryRepository,
CustomerFavoriteProductRepository $customerFavoriteProductRepository,
OrderRepository $orderRepository,
) {
$this->productRepository = $productRepository;
$this->previewTenderRepository = $previewTenderRepository;
$this->bitHistoryRepository = $bitHistoryRepository;
$this->customerFavoriteProductRepository = $customerFavoriteProductRepository;
$this->orderRepository = $orderRepository;
}
/**
* 入札中一覧画面.
*
* @Route("/tenders/list", name="tender_list", methods={"GET"})
*
* @Template("Product/tender_list.twig")
*/
public function index(Request $request, PaginatorInterface $paginator)
{
if ($this->isGranted('ROLE_USER')) {
// handleRequestは空のqueryの場合は無視するため
if ($request->getMethod() === 'GET') {
$request->query->set('pageno', $request->query->get('pageno', ''));
$request->query->set('orderby', $request->query->get('orderby', 3));
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder('', SearchProductType::class);
$Customer = $this->getUser();
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_PRODUCT_INDEX_INITIALIZE);
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
// paginator
$searchData = $searchForm->getData();
$searchData['Customer'] = $Customer;
$qb = $this->productRepository->getQueryBuilderByTenderSearchData($searchData);
$event = new EventArgs(
[
'searchData' => $searchData,
'qb' => $qb,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_PRODUCT_INDEX_SEARCH);
$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'] : 20
);
$isPreviews = [];
$isCloseds = [];
foreach ($pagination as $Product) {
$Auction = $Product->getAuction();
$isPreviews[$Product->getId()] = $Auction->isPreview();
$isCloseds[$Product->getId()] = $Auction->isClosed();
}
$isPreviewIds = [];
$isClosedIds = [];
foreach ($isPreviews as $productId => $isPreview) {
if ($isPreview) {
$isPreviewIds[] = $productId;
} else {
$isClosedIds[] = $productId;
}
}
$biddingCompaniesCounts = [];
if (!empty($isPreviewIds)) {
$trueBiddingCompaniesResults = $this->productRepository->countBiddingCompaniesForProducts($isPreviewIds);
foreach ($trueBiddingCompaniesResults as $result) {
$biddingCompaniesCounts[$result['productId']] = $result['count'];
}
}
if (!empty($isClosedIds)) {
$falseBiddingCompaniesResults = $this->bitHistoryRepository->countBiddingCompaniesForProducts($isClosedIds);
foreach ($falseBiddingCompaniesResults as $result) {
$biddingCompaniesCounts[$result['productId']] = $result['count'];
}
}
$totalPrice = $this->productRepository->getTotalTenderPrice($Customer, $searchData["auction"]);
$totalCount = count($pagination);
$productIds = [];
foreach ($pagination as $Product) {
$productIds[] = $Product->getId();
}
$displayMetrics = $this->productRepository->getListDisplayMetrics($productIds, $Customer);
$isUnpaid = !empty($this->orderRepository->getNotPaidOrder($Customer)) ? true : false;
return [
'subtitle' => '入札中一覧',
'pagination' => $pagination,
'search_form' => $searchForm->createView(),
'Customer' => $Customer,
'isPreviews' => $isPreviews,
'isCloseds' => $isCloseds,
'biddingCompaniesCounts' => $biddingCompaniesCounts,
'totalPrice' => $totalPrice,
'totalCount' => $totalCount,
'isUnpaid' => $isUnpaid,
'favoriteCounts' => $displayMetrics['favoriteCounts'],
'accessCounts' => $displayMetrics['accessCounts'],
'totalBidCounts' => $displayMetrics['totalBidCounts'],
'productMemos' => $displayMetrics['memos'],
'isFavoriteProducts' => $displayMetrics['isFavoriteProducts'],
];
} else {
// 非会員の場合、ログイン画面を表示
return $this->redirectToRoute('mypage_login');
}
}
protected function getPageTitle($searchData)
{
if (isset($searchData['name']) && ! empty($searchData['name'])) {
return trans('front.auction.search_result');
} elseif (isset($searchData['category_id']) && $searchData['category_id']) {
return $searchData['category_id']->getName();
} else {
return trans('front.auction.all_auctions');
}
}
}