<?php
namespace Plugin\tbsFeaturePage42\Controller;
use Eccube\Application;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Master\ProductStatus;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Form\Type\AddCartType;
use Eccube\Service\CartService;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\ProductRepository;
use Plugin\tbsFeaturePage42\Entity\FeatureStatus;
use Plugin\tbsFeaturePage42\Repository\FeatureProductRepository;
use Plugin\tbsFeaturePage42\Repository\FeatureRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Eccube\Exception\CartException;
class FeatureController extends AbstractController
{
/** @var FeatureRepository */
private $featureRepository;
/** @var FeatureProductRepository */
private $featureProductRepository;
/** @var ProductRepository */
private $productRepository;
/** @var CartService */
protected $cartService;
/**
* @var BaseInfo
*/
public $BaseInfo;
/**
* FeatureController constructor.
*
* @param FeatureRepository $featureRepository
* @param FeatureProductRepository $featureProductRepository
* @param ProductRepository $productRepository
* @param BaseInfoRepository $baseInfoRepository
* @param CartService $cartService
*/
public function __construct(
FeatureRepository $featureRepository,
FeatureProductRepository $featureProductRepository,
ProductRepository $productRepository,
BaseInfoRepository $baseInfoRepository,
CartService $cartService
) {
$this->featureRepository = $featureRepository;
$this->featureProductRepository = $featureProductRepository;
$this->productRepository = $productRepository;
$this->BaseInfo = $baseInfoRepository->get();
$this->BaseInfo = $baseInfoRepository->get();
$this->cartService = $cartService;
}
/**
* @Route("/feature_list", name="feature_list")
*
* @param Request $request
*
* @return RedirectResponse|Response
*/
public function index(Request $request)
{
$Features = $this->featureRepository->getList();
return $this->render('@tbsFeaturePage42/default/feature_list.twig', [
'Features' => $Features,
]);
}
/**
* @Route("/feature/{url}", name="feature_detail", requirements={"url"=".+"})
*
* @param Request $request
* @param string $url
*
* @return RedirectResponse|Response
*/
public function detail(Request $request, string $url)
{
$Feature = $this->featureRepository->findOneBy(array('url' => $url));
if (!$request->getSession()->has('_security_admin') && $Feature->getStatus()->getId() !== 1) {
throw new NotFoundHttpException();
}
$arrFeatureProducts = array('1' => null, '2' => null, '3' => null, '4' => null, '5' => null);
$FeatureProducts = $this->featureProductRepository->findBy(array('Feature' => $Feature->getId()), array('sort_no' => 'DESC'));
$ids = [];
foreach ($FeatureProducts as $FeatureProduct) {
if (!in_array($FeatureProduct->getProduct()->getId(), $ids)) {
$ids[] = $FeatureProduct->getProduct()->getId();
}
}
$ProductsAndClassCategories = $this->productRepository->findProductsWithSortedClassCategories($ids, 'p.id');
$forms = array();
foreach ($FeatureProducts as $FeatureProduct) {
$Product = $FeatureProduct->getProduct();
// addCart form
if ($Feature->getDisplayCart()) {
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $this->formFactory->createNamedBuilder(
'',
AddCartType::class,
null,
[
'product' => $ProductsAndClassCategories[$Product->getId()],
'allow_extra_fields' => true,
]
);
$addCartForm = $builder->getForm();
if ($request->getMethod() === 'POST' && (string)$Product->getId() === $request->get('product_id')) {
$addCartForm->handleRequest($request);
if ($addCartForm->isValid()) {
$addCartData = $addCartForm->getData();
try {
// $this->cartService->addProduct($addCartData['product_class_id'], $addCartData['quantity'])->save();
$this->cartService->addProduct($addCartData['product_class_id'], $addCartData['quantity']);
} catch (CartException $e) {
$this->addRequestError($e->getMessage());
}
$event = new EventArgs(
[
'form' => $addCartForm,
'Product' => $Product,
],
$request
);
$this->eventDispatcher->dispatch($event,EccubeEvents::FRONT_PRODUCT_CART_ADD_COMPLETE);
if ($event->getResponse() !== null) {
return $event->getResponse();
}
return $this->redirectToRoute('cart');
}
}
$forms[$FeatureProduct->getPosition()][$Product->getId()] = $addCartForm->createView();
}
// 位置指定
if ($Product->getStatus()->getId() != ProductStatus::DISPLAY_SHOW) {
continue;
}
$arrFeatureProducts[$FeatureProduct->getPosition()][] = $FeatureProduct;
}
$response = $this->render('@tbsFeaturePage42/default/feature_detail.twig', [
'Feature' => $Feature,
'FeatureProducts' => $arrFeatureProducts,
'Products' => $ProductsAndClassCategories,
'forms' => $forms,
]);
$response->setContent($this->getCustomHtml($Feature, $response->getContent()));
return $response;
}
/**
* カスタマイズしたHTMLを取得する.
*/
protected function getCustomHtml($Feature, $content)
{
$crawler = new Crawler($content);
$html = $this->getHtml($crawler);
// 情報を取得
$title = $Feature->getTitle();
$description = $Feature->getMetaDescription();
$keyword = $Feature->getMetaKeyword();
// タイトルを置換
$replace = '<title>' . $this->BaseInfo->getShopName() . ' / ' . $title . '</title>';
$html = mb_ereg_replace('<title>(.+?)<\/title>', $replace, $html);
// ヘッダーにメタタグを挿入
$snipet = '';
$snipet .= ( $description ) ? '<meta name="description" content="' . $description . '" />' : '';
$snipet .= ( $keyword ) ? '<meta name="keyword" content="' . $keyword . '" />' : '';
if ($snipet) {
$search = '<meta name="viewport"';
$snipet = trim($snipet);
$snipet = str_replace(array("\r", "\n"), '', $snipet);
$replace = $snipet.$search;
$html = str_replace($search, $replace, $html);
}
return $html;
}
/**
* 解析用HTMLを取得
*
* @param Crawler $crawler
* @return string
*/
private function getHtml(Crawler $crawler)
{
$html = '';
foreach ($crawler as $domElement) {
$domElement->ownerDocument->formatOutput = true;
$html .= $domElement->ownerDocument->saveHTML();
}
return html_entity_decode($html, ENT_NOQUOTES, 'UTF-8');
}
}