<?php
namespace Postroyka\AppBundle\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Postroyka\AppBundle\Form\ReviewForm;
use Postroyka\AppBundle\Provider\CartProvider;
use Postroyka\AppBundle\Provider\EcommerceProvider;
use Postroyka\AppBundle\Service\OrderCalculator;
use Postroyka\BaseAbstractController;
use Postroyka\AppBundle\Service\CategoryGroupService;
use Submarine\CartBundle\Entity\Cart;
use Submarine\CartBundle\Entity\CartItem;
use Submarine\FilesBundle\Provider\FilesProvider;
use Submarine\OrdersBundle\Entity\OrderItem;
use Submarine\OrdersBundle\Provider\OrderProvider;
use Submarine\PagesBundle\Entity\Page;
use Submarine\PagesBundle\Provider\PagesProvider;
use Submarine\ReviewsBundle\Entity\Review;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class AjaxController extends AbstractController
{
const TAGS_MOBILE_INFORMATION = [
'payment',
'discount',
'page-7209',
'contacts',
'about',
'brands',
'articles',
'vacancy',
'charity',
'proposition',
'director',
];
/**
* Получаем продукты для E-commerce
*/
public function getProductsEcommerceAction(Request $request)
{
$productsData = [];
foreach ($request->request->get("products", []) as $id){
$product = $this->getPagesProvider()->get($id);
$productsData[] = $this->getEcommerceProvider()->getEcommerceProduct($product);
}
return $this->json(["productsData" => $productsData]);
}
/**
* Получаем корзину для E-commerce
*/
public function getCartEcommerceAction(Request $request)
{
/** @var CartProvider $cartProvider */
$cartProvider = $this->get('postroyka_app.cart_provider');
$cart = $cartProvider->getCart($this->getUser());
$productsData = [];
/** @var CartItem $item */
foreach ($cart->getItems() as $item){
$product = $this->getPagesProvider()->get($item->getEntityId());
$productData = $this->getEcommerceProvider()->getEcommerceProduct($product);
$productData["quantity"] = $item->getQuantity();
$productsData[] = $productData;
}
return $this->json([
"productsData" => $productsData
]);
}
/**
* Получаем заказ для E-commerce
*/
public function getOrderEcommerceAction(Request $request, $id)
{
/** @var OrderProvider $orderProvider */
$orderProvider = $this->get('postroyka_app.orders_provider');;
$order = $orderProvider->get($id);
$orderData = [
"id" => $order->getId(),
"price" => $order->getPayPrice(),
"option" => $order->getEcommerceOptionString(),
"shipping" => $order->getDeliveryMethodPrice() > 0 ? $order->getDeliveryMethodPrice() : "",
"products" => []
];
/** @var OrderItem $item */
foreach ($order->getItems() as $item){
$product = $this->getPagesProvider()->get($item->getEntityId());
$productData = $this->getEcommerceProvider()->getEcommerceProduct($product);
$productData["quantity"] = $item->getQuantity();
$orderData["products"][] = $productData;
}
return $this->json([
"orderData" => $orderData
]);
}
/**
* Получение мобильного меню
*/
public function getMobileMenuAction(Request $request)
{
/** @var CategoryGroupService $categoryGroupService */
$categoryGroupService = $this->get('postroyka_app.category_group_service');
$pageId = $request->request->get("page_id");
$page = $pageId ? $this->getDoctrine()->getRepository(Page::class)->find($pageId) : null;
if (false === ($leftMenu = $this->cache()->fetch(self::LEFT_MENU))) {
$leftMenu = $categoryGroupService->getCategoriesTreeWithProducts($this->getCatalogGroups(), 3);
// Кэшируем на час
$this->cache()->save(self::LEFT_MENU, $leftMenu, 60 * 60);
}
$data = [
"left_menu" => $leftMenu,
"page" => $page,
'additional_catalogs' => $categoryGroupService->getAdditionalCatalogsByLabel(),
];
return $this->render('Postroyka/AppBundle/Parts/mobile-menu.html.twig', $data);
}
/**
* Получение мобильной информации
*/
public function getMobileInformationAction(
Request $request,
EntityManagerInterface $em,
CategoryGroupService $categoryGroupService,
)
{
$pageId = $request->request->get("page_id");
$page = $pageId ? $em->getRepository(Page::class)->find($pageId) : null;
$mobileInformationPages = $this->cache()->fetch(self::MOBILE_INFORMATION);
// $mobileInformationPages = false;
if (false === $mobileInformationPages) {
$mobileInformationPages = $categoryGroupService->getMobileInformationPages();
// Кэшируем на час
$this->cache()->save(self::MOBILE_INFORMATION, $mobileInformationPages, 60 * 60);
}
return $this->render('Postroyka/AppBundle/Parts/mobile-information.html.twig', [
"page" => $page,
"mobileInformationPages" => $mobileInformationPages,
]);
}
/**
* Получение модальных окон для страницы продукта
*/
public function getProductPopupsAction(
Request $request,
ManagerRegistry $managerRegistry,
OrderCalculator $orderCalculator
)
{
$pageId = $request->request->get("page_id");
$page = $pageId ? $managerRegistry->getRepository(Page::class)->find($pageId) : null;
if(!$page){
return new Response("");
}
$zones = [];
$zonesNumber = OrderCalculator::DELIVERY_ZONES_NUMBER + OrderCalculator::START_NUMBER_ZONE - 1;
for ($i = OrderCalculator::START_NUMBER_ZONE; $i <= $zonesNumber; $i++) {
$zone = $orderCalculator->getZonePrice(new Cart(), constant('Postroyka\AppBundle\Service\OrderCalculator::DELIVERY_ZONE_' . $i));
$zones[] = $i . ';' . number_format($zone, 0, ',', ' ') . ' руб.';
}
return $this->render('Postroyka/AppBundle/Pages/blocks/_product_popups.html.twig', [
"page" => $page,
'map_zones' => implode('|', $zones),
]);
}
/**
* Получение формы для Review
*/
public function getReviewFormAction(Request $request)
{
$pageId = $request->request->get("page_id");
$page = $pageId ? $this->getDoctrine()->getRepository(Page::class)->find($pageId) : null;
$review = new Review($page);
$form = $this->createForm(ReviewForm::class, $review);
return $this->render('Postroyka/AppBundle/Pages/blocks/_review_form.html.twig', [
"form" => $form->createView()
]);
}
/** Получение модального окна для уценки */
public function showModalPageDefectedAction(
Request $request,
ManagerRegistry $managerRegistry,
FilesProvider $filesProvider,
?int $pageId
)
{
$page = $managerRegistry->getRepository(Page::class)->find($pageId);
if(!$page || !$page->hasActivePageDefected()){
return new Response("");
}
$page->setFilesProvider($filesProvider);
return $this->renderPage('Postroyka/AppBundle/Pages/blocks/_page_defected_popup.html.twig', [
"page" => $page,
"pageDefected" => $page->getPageDefected()
]);
}
/** Получение модального окна для наличия товара */
public function showModalPageAvailabilityProductAction(
Request $request,
ManagerRegistry $managerRegistry,
FilesProvider $filesProvider,
?int $pageId
)
{
$page = $managerRegistry->getRepository(Page::class)->find($pageId);
if(!$page){
return new Response("");
}
$page->setFilesProvider($filesProvider);
return $this->renderPage('Postroyka/AppBundle/Pages/blocks/_popup_availability_product_page.html.twig', [
"page" => $page,
]);
}
/** @return EcommerceProvider */
private function getEcommerceProvider()
{
return $this->get("postroyka_app.provider.ecommerce_provider");
}
/** @return PagesProvider */
private function getPagesProvider()
{
return $this->get("submarine.pages.pages_provider");
}
}