<?php
/*
* Plugin Name: JoolenCheckedItemBlock4
*
* Copyright(c) joolen inc. All Rights Reserved.
*
* https://www.joolen.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\JoolenCheckedItemBlock4\Controller\Block;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Controller\AbstractController;
use Eccube\Entity\BaseInfo;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\PluginRepository;
use Plugin\JoolenCheckedItemBlock4\Entity\Config;
use Plugin\JoolenCheckedItemBlock4\Event;
use Plugin\JoolenCheckedItemBlock4\Repository\ConfigRepository;
use Plugin\JoolenCheckedItemBlock4\Repository\ProductRepository;
use Plugin\ProductReview4\Entity\ProductReview;
use Plugin\ProductReview4\Entity\ProductReviewConfig;
use Plugin\ProductReview4\Entity\ProductReviewStatus;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Annotation\Route;
class CheckedItemController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
protected $entityManager;
/**
* @var ProductRepository
*/
protected $productRepository;
/**
* @var PluginRepository
*/
protected $pluginRepository;
/**
* @var BaseInfo
*/
protected $BaseInfo;
/**
* @var Config
*/
protected $Config;
/**
* @var RequestStack
*/
protected $requestStack;
public function __construct(
EntityManagerInterface $entityManager,
ProductRepository $productRepository,
PluginRepository $pluginRepository,
BaseInfoRepository $baseInfoRepository,
ConfigRepository $configRepository,
RequestStack $requestStack
)
{
$this->entityManager = $entityManager;
$this->productRepository = $productRepository;
$this->pluginRepository = $pluginRepository;
$this->BaseInfo = $baseInfoRepository->get();
$this->Config = $configRepository->getOneOrDefault();
$this->requestStack = $requestStack;
}
/**
* @Route("/block/joolen_checked_item", name="block_joolen_checked_item")
* @Template("Block/joolen_checked_item.twig")
*/
public function index(Request $request): array
{
// 削除時のリダイレクト用のURLを保存
$redirectUrl = $this->requestStack->getMasterRequest()->getUri();
$this->session->getFlashBag()->set('joolen.checked_item.redirect.url', $redirectUrl);
// クッキーから閲覧した商品情報を取得
$checkedItems = json_decode($request->cookies->get(Event::COOKIE_NAME), true);
$ProductReviewPlugin = $this->pluginRepository->findOneBy(['code' => 'ProductReview4', 'enabled' => 1]);
// Doctrine SQLFilter
if ($this->BaseInfo->isOptionNostockHidden()) {
$this->entityManager->getFilters()->enable('option_nostock_hidden');
}
// MEMO: 閲覧した商品がある場合のみクエリを実行
if (!empty($checkedItems)) {
$Products = $this->productRepository->findByCheckedItem($checkedItems)->getQuery()->getResult();
}
$datum = [];
// MEMO: 結果がある場合、閲覧した順番に並び替える
if (!empty($Products)) {
// 最後に閲覧したものを最初に表示するため反転させる
$checkedItems = array_reverse($checkedItems);
foreach ($checkedItems as $checkedItem) {
foreach ($Products as $Product) {
if ($Product->getId() !== $checkedItem) {
continue;
}
$rate = [
"recommend_avg" => 0,
"review_count" => 0
];
// MEMO: 商品レビュー管理プラグインが有効な場合、レビュー情報を追加する
if ($ProductReviewPlugin) {
$ProductReviewConfig = $this->entityManager->getRepository(ProductReviewConfig::class)->get();
$productReviewRepository = $this->entityManager->getRepository(ProductReview::class);
$ProductReviews = $productReviewRepository->findBy([
'Status' => ProductReviewStatus::SHOW,
'Product' => $Product
],
[
'id' => 'DESC'
],
$ProductReviewConfig->getReviewMax());
$rate = $productReviewRepository->getAvgAll($Product);
$avg = round($rate['recommend_avg']);
}
$datum[] = [
'Product' => $Product,
'ProductReviews' => $ProductReviews ?? null,
'Avg' => $avg ?? null,
'Count' => intval($rate['review_count']) ?? null
];
}
}
}
return [
'datum' => $datum,
'ProductReviewPlugin' => $ProductReviewPlugin
];
}
/**
* 履歴の削除
*
* @Route("/block/joolen_checked_item/remove", name="block_joolen_checked_item_remove")
* @param Request $request
* @return RedirectResponse
*/
public function remove(Request $request): RedirectResponse
{
$redirectUrl = $this->session->getFlashBag()->get('joolen.checked_item.redirect.url');
$redirectUrl = array_shift($redirectUrl);
// MEMO: cookieの削除
// ※Event.phpに移動
// 何も指定されていない場合はTopページへリダイレクト
if (!$redirectUrl) {
return $this->redirectToRoute('homepage');
}
return $this->redirect($redirectUrl);
}
}