<?php
/**
* Copyright(c) 2024 SYSTEM FRIEND INC.
*/
namespace Plugin\CheckProduct42\Service;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Master\ProductStatus;
use Eccube\Entity\Product;
class CheckProductService
{
protected EntityManagerInterface $entityManager;
protected CookieHelper $cookieHelper;
protected \Plugin\CheckProduct42\Common\EccubeConfigEx $checkProductConfig;
public function __construct(
EntityManagerInterface $entityManager,
CookieHelper $cookieHelper,
\Plugin\CheckProduct42\Common\EccubeConfigEx $checkProductConfig
)
{
$this->entityManager = $entityManager;
$this->cookieHelper = $cookieHelper;
$this->checkProductConfig = $checkProductConfig;
}
public function getCheckProducts()
{
$product_ids = $this->cookieHelper->getProductIds() ? : [];
$CheckProducts = [];
$max_count = $this->checkProductConfig->number_of_items();
// メモリ削減のためクッキーをもとに商品IDを取得
$temp = $this->getProducts('p.id', $product_ids, true);
$show_product_ids = [];
foreach ($temp as $row) {
$id = $row['id'];
$show_product_ids[$id] = $id;
}
// 表示する件数に絞る
$target_ids = [];
$count = 0;
foreach ($product_ids as $id) {
if (isset($show_product_ids[$id])) {
$target_ids[] = $id;
$count++;
}
if ($count >= $max_count) {
break;
}
}
// 表示するものだけに絞ったうえで実際のEntityを取得
$temp = $this->getProducts('p', $target_ids, false);
$Products = [];
/** @var Product $product */
foreach ($temp as $product) {
$Products[$product->getId()] = $product;
}
// 閲覧順に並び替え
foreach ($target_ids as $id) {
if (isset($Products[$id])) {
$CheckProducts[] = $Products[$id];
}
}
return $CheckProducts;
}
/**
* @param $col
* @param $product_ids
* @param bool $isShow
* @return Product[]|array
*/
protected function getProducts($col, $product_ids, $isShow=true)
{
$qb = $this->entityManager->createQueryBuilder();
$qb
->select($col)
->from(Product::class, 'p')
->where($qb->expr()->in('p.id', ':product_ids'))
->setParameter('product_ids', $product_ids)
;
if ($isShow){
$qb
->andWhere('p.Status = :status')
->setParameter('status', ProductStatus::DISPLAY_SHOW)
;
}
return $qb->getQuery()->getResult();
}
}