<?php
namespace Customize\Controller\Mypage;
use Eccube\Controller\Mypage\MypageController as BaseMypageController;
use Eccube\Controller\AbstractController;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Entity\OrderItem;
use Eccube\Entity\Product;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Exception\CartException;
use Eccube\Form\Type\Front\CustomerLoginType;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\CustomerFavoriteProductRepository;
use Eccube\Repository\OrderRepository;
use Eccube\Repository\OrderItemRepository;
use Eccube\Repository\ProductRepository;
use Eccube\Service\CartService;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
// use Symfony\Component\HttpFoundation\RequestStack;
class MypageController extends BaseMypageController
{
/**
* @var OrderItemRepository
*/
protected $orderItemRepository;
// /**
// * @var RequestStack
// */
// protected $requestStack;
/**
* MypageController constructor.
*
* @param OrderRepository $orderRepository
* @param CustomerFavoriteProductRepository $customerFavoriteProductRepository
* @param CartService $cartService
* @param BaseInfoRepository $baseInfoRepository
* @param PurchaseFlow $purchaseFlow
* @param OrderItemRepository $orderItemRepository
*/
// * @param RequestStack $requestStack
public function __construct(
OrderRepository $orderRepository,
CustomerFavoriteProductRepository $customerFavoriteProductRepository,
CartService $cartService,
BaseInfoRepository $baseInfoRepository,
PurchaseFlow $purchaseFlow,
OrderItemRepository $orderItemRepository
// RequestStack $requestStack
) {
parent::__construct(
$orderRepository,
$customerFavoriteProductRepository,
$cartService,
$baseInfoRepository,
$purchaseFlow
);
$this->orderItemRepository = $orderItemRepository;
// $this->requestStack = $requestStack;
}
/**
* ログイン画面(override).
*
* @Route("/mypage/login", name="mypage_login", methods={"GET", "POST"})
* @Template("Mypage/login.twig")
*/
public function login(Request $request, AuthenticationUtils $utils)
{
if ($this->isGranted('IS_AUTHENTICATED_FULLY')) {
log_info('認証済のためログイン処理をスキップ');
return $this->redirectToRoute('mypage');
}
/* @var $form \Symfony\Component\Form\FormInterface */
$builder = $this->formFactory
->createNamedBuilder('', CustomerLoginType::class);
$builder->get('login_memory')->setData((bool) $request->getSession()->get('_security.login_memory'));
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
$Customer = $this->getUser();
if ($Customer instanceof Customer) {
$builder->get('login_email')
->setData($Customer->getEmail());
}
}
$event = new EventArgs(
[
'builder' => $builder,
],
$request
);
$this->eventDispatcher->dispatch($event, EccubeEvents::FRONT_MYPAGE_MYPAGE_LOGIN_INITIALIZE);
$form = $builder->getForm();
$error = $utils->getLastAuthenticationError();
// ログイン前に指定したURLへ遷移(override範囲) ▼▼▼
// url: https://amidaike.hatenablog.com/entry/2019/01/29/202133
// ログイン前の画面へ戻す
/*
if (!$error) {
// ログインエラーがなければ戻り先をセット
$referer = $request->headers->get('referer');
if ($referer) {
// refererチェック
$referers = parse_url($referer);
if ($referers['host'] == $request->getHost()) {
// ホストが同一であればrefererをセット
$requestStackUri = $this->requestStack->getMasterRequest()->getUri();
if ($request->getUri() == $requestStackUri) {
// ログイン画面遷移直前のuriをセット
$this->setLoginTargetPath($referer);
} else {
// ログイン必須画面のuriをセット
$this->setLoginTargetPath($requestStackUri);
}
}
}
}
*/
// ログイン前に指定したURLへ遷移 ▲▲▲
return [
'error' => $error,
'form' => $form->createView(),
];
}
/**
* 受取確認を行う.
*
* @Route("/mypage/uketori/{order_no}/{order_item_id}", name="mypage_uketori", methods={"PUT"})
*/
public function uketori(Request $request, $order_no, $order_item_id)
{
$this->isTokenValid();
log_info('受取確認開始', [$order_no, $order_item_id]);
$OrderItem = $this->orderItemRepository->find($order_item_id);
if (!$OrderItem) {
log_info('対象の注文が見つかりません', [$order_no, $order_item_id]);
if (!$request->isXmlHttpRequest()) {
//注文詳細からの場合は例外
throw new NotFoundHttpException();
} else {
//注文履歴一覧からajaxでの場合は500エラーで
return $this->json(['result' => false, 'message' => '対象の注文が見つかりません'], 500);
}
}
$this->entityManager->persist($OrderItem);
$OrderItem->setUketoriDate(new \DateTime());
$OrderItem->setUketoriKbn("0"); // 0:ユーザ本人/1:管理
$this->entityManager->flush();
log_info('受取確認完了', [$order_no, $order_item_id]);
if (!$request->isXmlHttpRequest()) {
//注文詳細からの場合はredirect
return $this->redirect($this->generateUrl('mypage_history', ['order_no' => $order_no]));
} else {
//注文履歴一覧からajaxで
return $this->json(['result' => true]);
}
}
}