<?php
namespace Customize\Controller\Block;
use Customize\Entity\ProductReviewReference;
use Customize\Repository\ProductReviewReferenceRepository;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Product;
use Symfony\Component\HttpFoundation\Request;
use Plugin\ProductReview42Plus\Entity\ProductReview;
use Plugin\ProductReview42Plus\Entity\ProductReviewStatus;
use Plugin\ProductReview42Plus\Repository\ProductReviewRepository;
use Plugin\ProductReview42Plus\Repository\ProductReviewConfigRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Annotation\Route;
class ProductReviewController extends AbstractController
{
/**
* @var ProductReviewConfigRepository
*/
protected $productReviewConfigRepository;
/**
* @var ProductReviewRepository
*/
protected $productReviewRepository;
/**
* @var ProductReviewReferenceRepository
*/
private $productReviewReferenceRepository;
/**
* ProductReview constructor.
*
* @param ProductReviewConfigRepository $productReviewConfigRepository
* @param ProductReviewRepository $productReviewRepository
*/
public function __construct(
ProductReviewConfigRepository $productReviewConfigRepository,
ProductReviewRepository $productReviewRepository,
ProductReviewReferenceRepository $productReviewReferenceRepository
) {
$this->productReviewConfigRepository = $productReviewConfigRepository;
$this->productReviewRepository = $productReviewRepository;
$this->productReviewReferenceRepository = $productReviewReferenceRepository;
}
/**
* @Route("/block/{id}/product_reviews", name="block_product_reviews", requirements={"id" = "\d+"}, methods={"GET"})
* @Template("Block/product_reviews.twig")
* @param Product $Product
* @return array
*/
public function index(Product $Product): array
{
$Config = $this->productReviewConfigRepository->get();
// review_max:5件
if($Config){
$limit = $Config->getReviewMax();
} else{
$limit = 5;
}
$ProductReviews = $this->productReviewRepository->findDetailReview($Product, $limit);
$rate = $this->productReviewRepository->getAvgAll($Product);
$avg = round($rate['recommend_avg']);
$count = intval($rate['review_count']);
return [
'ProductReviews' => $ProductReviews,
'ProductReviewAvg' => $avg,
'ProductReviewCount' => $count,
];
}
/**
* @Route("/review/reference", name="review_reference", requirements={"id" = "\d+"}, methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function reference(Request $request): JsonResponse
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException(); //API通信のみ受け付ける
}
$Customer = $this->getUser();
if (empty($Customer)) {
return $this->json(['result' => false, 'message' => '申し訳ございません。会員のみレビュー参考機能が利用できます。']);
}
$this->entityManager->beginTransaction();
try {
$product_review_id = $request->request->get('product_review_id');
$Review = $this->productReviewRepository->findOneBy(['id' => $product_review_id]);
$Reference = $this->productReviewReferenceRepository->findOneby(
['customer_id' => $Customer->getId(), 'product_review_id' => $product_review_id]);
if (empty($Reference)) {
$Reference = new ProductReviewReference;
$Reference->setProductReviewId($product_review_id);
$Reference->setCustomerId($Customer->getId());
$this->entityManager->persist($Reference);
$Review->setReferenceCount($Review->getReferenceCount() + 1);
} else {
$this->entityManager->remove($Reference);
$Review->setReferenceCount($Review->getReferenceCount() - 1);
}
$this->entityManager->persist($Review);
$this->entityManager->flush();
$this->entityManager->commit();
return $this->json(['result' => true, 'message' => '参考になりました。ありがとうございます!']);
} catch (\Exception $e) {
$this->entityManager->rollback();
log_info($e->getMessage());
return $this->json(['result' => false, 'message' => '申し訳ありません。問題が発生しました']);
}
}
/**
* @Route("/review/report", name="review_report", requirements={"id" = "\d+"}, methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function report(Request $request): JsonResponse
{
if (!$request->isXmlHttpRequest()) {
throw new BadRequestHttpException(); //API通信のみ受け付ける
}
$this->entityManager->beginTransaction();
try {
$product_review_id = $request->request->get('product_review_id');
$Review = $this->productReviewRepository->findOneBy(['id' => $product_review_id]);
$Review->setReportFlg(true);
$this->entityManager->persist($Review);
$this->entityManager->flush();
$this->entityManager->commit();
return $this->json(['result' => true, 'message' => 'レポートになりました。ありがとうございます!']);
} catch (\Exception $e) {
$this->entityManager->rollback();
log_info($e->getMessage());
return $this->json(['result' => false, 'message' => '申し訳ありません。問題が発生しました']);
}
}
}