src/Controller/Admin/AdminController.php line 60

Open in your IDE?
  1. <?php
  2. namespace Slivki\Controller\Admin;
  3. use Imagine\Gd\Imagine;
  4. use Imagine\Image\Box;
  5. use Imagine\Image\Point;
  6. use League\Period\Period;
  7. use Slivki\Dao\Statistic\VirtualWallet\VirtualWalletDaoInterface;
  8. use Slivki\Dbal\Category\CategoryDbalInterface;
  9. use Slivki\Entity\AbstractOrderBase;
  10. use Slivki\Entity\AdSlot;
  11. use Slivki\Entity\CategoryType;
  12. use Slivki\Entity\CityArea;
  13. use Slivki\Entity\MailingCampaign;
  14. use Slivki\Entity\Sale;
  15. use Slivki\Entity\SiteSettings;
  16. use Slivki\Entity\User;
  17. use Slivki\Entity\UserBalanceActivity;
  18. use Slivki\Entity\UserGroup;
  19. use Slivki\Repository\Category\Admin\CategoryChildRelationRepositoryInterface;
  20. use Slivki\Repository\GiftCertificate\GiftCertificateGroup\Admin\GiftCertificateGroupRepositoryInterface;
  21. use Slivki\Repository\GiftCertificateCategory\Admin\GiftCertificateCategoryRepositoryInterface;
  22. use Slivki\Repository\GiftCertificateGiftCategory\Admin\GiftCertificateGiftCategoryRepositoryInterface;
  23. use Slivki\Repository\UserRepository;
  24. use Slivki\Services\CategoryBoxCacheService;
  25. use Slivki\Services\StatService;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Slivki\Controller\SiteController;
  28. use Slivki\Entity\Banner;
  29. use Slivki\Entity\Category;
  30. use Slivki\Entity\City;
  31. use Slivki\Entity\Comment;
  32. use Slivki\Entity\HotFeed;
  33. use Slivki\Services\ImageService;
  34. use Slivki\Services\Mailer;
  35. use Symfony\Component\Filesystem\Filesystem;
  36. use Slivki\Entity\MainMenu;
  37. use Slivki\Entity\Media;
  38. use Slivki\Entity\MediaType;
  39. use Slivki\Entity\OperatorActionLog;
  40. use Slivki\Entity\Seo;
  41. use Slivki\Entity\Offer;
  42. use Slivki\Repository\SeoRepository;
  43. use Symfony\Component\HttpFoundation\JsonResponse;
  44. use Symfony\Component\HttpFoundation\Request;
  45. use Symfony\Component\HttpFoundation\Response;
  46. use Symfony\Component\DomCrawler\Crawler;
  47. use Symfony\Component\HttpKernel\KernelInterface;
  48. use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
  49. use Symfony\Component\Validator\Validator\ValidatorInterface;
  50. class AdminController extends SiteController
  51. {
  52.     private const DEFAULT_CATEGORY_SORT_ORDER 9999;
  53.     /**
  54.      * @Route("/admin/ajax_check_version")
  55.      */
  56.     public function ajaxCheckVersionAction() {
  57.         $twigGlobals $this->get('twig')->getGlobals();
  58.         return new Response($twigGlobals['version']);
  59.     }
  60.     /** @Route("/admin/dashboard") */
  61.     public function ajaxDashboardAction(
  62.         Request $request,
  63.         StatService $statService,
  64.         VirtualWalletDaoInterface $virtualWalletDao
  65.     ): Response {
  66.         if (!$request->isXmlHttpRequest()) {
  67.             return $this->redirect("/admin");
  68.         }
  69.         $entityManager $this->getEntityManager();
  70.         $connection $entityManager->getConnection();
  71.         $requestDateFrom $request->request->get('dashboardDateFrom');
  72.         $requestDateTo $request->request->get('dashboardDateTo');
  73.         $dateFrom $requestDateFrom ? (new \DateTime())->setTimestamp(strtotime($requestDateFrom)) : (new \DateTime())->setTime(000);
  74.         $dateTo $requestDateTo ? (new \DateTime())->setTimestamp(strtotime($requestDateTo)) : (new \DateTime())->setTime(000);
  75.         $dateTo->add(new \DateInterval('P1D'));
  76.         $from $dateFrom->format('Y-m-d 00:00:00');
  77.         $to $dateTo->format('Y-m-d 00:00:00');
  78.         $period = new \DatePeriod($dateFrom, \DateInterval::createFromDateString('+1 day'), $dateTo);
  79.         $sql "select date(created_on) as x, coalesce(sum(amount), 0) as y from offer_order where created_on between '$from' and '$to' and status = "
  80.             AbstractOrderBase::STATUS_BALANCE_CONFIRM ' group by 1';
  81.         $balanceReplenishmentChartData $this->getChartData($period$connection->executeQuery($sql)->fetchAll());
  82.         $dateTo->sub(new \DateInterval('P1D'));
  83.         $codesCountByDatesStat $statService->getCodesCountByDates($dateFrom$dateTo);
  84.         $codesChartData = [
  85.             'x' => [],
  86.             'total' => [],
  87.             'free' => [],
  88.             'online' => [],
  89.             'balance' => [],
  90.         ];
  91.         $appCodesChartData $codesChartData;
  92.         foreach ($codesCountByDatesStat as $key => $item) {
  93.             if ($key == 'aggregate') {
  94.                 continue;
  95.             }
  96.             $codesChartData['x'][] = $key;
  97.             $codesChartData['total'][] = $item['total']['total'];
  98.             $codesChartData['balance'][] = $item['total']['balance'];
  99.             $codesChartData['free'][] = $item['total']['free'];
  100.             $codesChartData['online'][] = $item['total']['online'];
  101.             $appCodesChartData['x'][] = $key;
  102.             $appCodesChartData['total'][] = $item['app']['total'];
  103.             $appCodesChartData['balance'][] = $item['app']['balance'];
  104.             $appCodesChartData['free'][] = $item['app']['free'];
  105.             $appCodesChartData['online'][] = $item['app']['online'];
  106.         }
  107.         return $this->render('Slivki/admin/dashboard/index.html.twig', [
  108.             'dateFrom' => $dateFrom,
  109.             'dateTo' => $dateTo,
  110.             'balanceReplenishmentChartData' => $balanceReplenishmentChartData,
  111.             'virtualWalletChartData' => $this->getChartData($period$virtualWalletDao->getChartData(
  112.                 Period::fromDatePeriod($period)
  113.             )),
  114.             'codesCountByDatesStat' => $codesCountByDatesStat,
  115.             'codesChartData' => $codesChartData,
  116.             'appCodesChartData' => $appCodesChartData,
  117.             'codesByDevicesChartData' => [
  118.                 $codesCountByDatesStat['aggregate']['desktop']['total'],
  119.                 $codesCountByDatesStat['aggregate']['mobile']['total'],
  120.                 $codesCountByDatesStat['aggregate']['app']['total']
  121.             ],
  122.             'codesByDevicesFreeChartData' => [
  123.                 $codesCountByDatesStat['aggregate']['desktop']['free'],
  124.                 $codesCountByDatesStat['aggregate']['desktop']['total'] - $codesCountByDatesStat['aggregate']['desktop']['free'],
  125.                 $codesCountByDatesStat['aggregate']['mobile']['free'],
  126.                 $codesCountByDatesStat['aggregate']['mobile']['total'] - $codesCountByDatesStat['aggregate']['mobile']['free'],
  127.                 $codesCountByDatesStat['aggregate']['app']['free'],
  128.                 $codesCountByDatesStat['aggregate']['app']['total'] - $codesCountByDatesStat['aggregate']['app']['free']
  129.             ],
  130.             'codesByTypesChartData' => [
  131.                 $codesCountByDatesStat['aggregate']['total']['balance'],
  132.                 $codesCountByDatesStat['aggregate']['total']['free'],
  133.                 $codesCountByDatesStat['aggregate']['total']['online']
  134.             ]
  135.         ]);
  136.     }
  137.     private function getChartData($period$data): array
  138.     {
  139.         $chartData = ['x' => [], 'y' => []];
  140.         $dataByX = [];
  141.         foreach ($data as $item) {
  142.             $dataByX[$item['x']] = $item['y'];
  143.         }
  144.         /** @var \DateTime $tick */
  145.         foreach ($period as $tick) {
  146.             $chartData['x'][] = $tick->format('d.m.Y');
  147.             if (isset($dataByX[$tick->format('Y-m-d')])) {
  148.                 $chartData['y'][] = $dataByX[$tick->format('Y-m-d')];
  149.             } else {
  150.                 $chartData['y'][] = 0;
  151.             }
  152.         }
  153.         return $chartData;
  154.     }
  155.     /**
  156.      * @Route("/admin/offer/descriptions/{offerID}/{descriptionType}")
  157.      */
  158.     public function descriptionsAction($offerID$descriptionType) {
  159.         $entityManager $this->getDoctrine()->getManager('admin');
  160.         $sql "select description from entity_description_version where entity_id = $offerID and entity_type_id = 1 and type_id = $descriptionType order by id desc limit 1";
  161.         return new Response('<textarea>'.$entityManager->getConnection()->executeQuery($sql)->fetchColumn().'</textarea>');
  162.     }
  163.     /**
  164.      * @Route("/admin")
  165.      */
  166.     public function adminAction(
  167.         GiftCertificateCategoryRepositoryInterface $giftCertificateCategoryRepository,
  168.         GiftCertificateGroupRepositoryInterface $giftCertificateGroupRepository,
  169.         GiftCertificateGiftCategoryRepositoryInterface $giftCertificateGiftCategoryRepository
  170.     ) {
  171.         ini_set('memory_limit''1g');
  172.         ini_set('max_execution_time'240);
  173.         $entityManager $this->getEntityManager();
  174.         $categoryRepository $entityManager->getRepository(Category::class);
  175.         return $this->render('Slivki/admin/index.html.twig', [
  176.             'managerList' =>  $entityManager->getRepository(UserGroup::class)->findOneByName('MANAGER')->getUsers(),
  177.             'cityAreaList' => $entityManager->getRepository(CityArea::class)->findBy([], ['name' => 'ASC']),
  178.             'priceCategoriesDefault' => $categoryRepository->findBy(['domainObjectID' => Category::PRICE_CATEGORY_ID'typeID' => Category::DEFAULT_PRICE_CATEGORY_TYPE], ['sortOrder' => 'ASC']),
  179.             'priceCategoriesTourism' => $categoryRepository->findBy(['domainObjectID' => Category::PRICE_CATEGORY_ID'typeID' => Category::TOURISM_PRICE_CATEGORY_TYPE], ['sortOrder' => 'ASC']),
  180.             'genderCategories' => $categoryRepository->findBy(['domainObjectID' => Category::GENDER_CATEGORY_ID], ['sortOrder' => 'ASC']),
  181.             'tourismTourTypes' => $categoryRepository->findBy(['domainObjectID' => Category::TOUR_TYPE_CATEGORY_ID], ['sortOrder' => 'ASC']),
  182.             'tourismTransportType' => $categoryRepository->findBy(['domainObjectID' => Category::TRANSPORT_TYPE_CATEGORY_ID], ['sortOrder' => 'ASC']),
  183.         ]);
  184.     }
  185.     /**
  186.      * @Route("/admin/category/ajax_get_category")
  187.      */
  188.     public function ajaxGetCategoryAction(
  189.         Request $request,
  190.         ImageService $imageService,
  191.         CategoryChildRelationRepositoryInterface $categoryChildRelationRepository
  192.     ) {
  193.         ini_set('memory_limit''256m');
  194.         if (!$request->isXmlHttpRequest()) {
  195.             return $this->redirect("/admin");
  196.         }
  197.         $entityManager $this->getDoctrine()->getManager("admin");
  198.         $categoryID $request->request->get('categoryID');
  199.         $categoryRepository $entityManager->getRepository(Category::class);
  200.         /** @var Category $category */
  201.         $category $categoryRepository->find($categoryID);
  202.         $categoryType $category->getCategoryType() ? $category->getCategoryType()->getID() : Category::DEFAULT_CATEGORY_TYPE;
  203.         $seoRepository $entityManager->getRepository(Seo::class);
  204.         $requestDomainObjectID $request->request->get('domainObjectID');
  205.         $resourceURL 'Slivki:Default:category';
  206.         $mainMenuType null;
  207.         $cityID $category->getCity() ? $category->getCity()->getID() : City::DEFAULT_CITY_ID;
  208.         switch($requestDomainObjectID) {
  209.             case Category::OFFER_CATEGORY_ID:
  210.                 $resourceURL 'Slivki:Default:category';
  211.                 $mainMenuType MainMenu::TYPE_OFFER_CATEGORY;
  212.                 $selectedCategoryIDList = [];
  213.                 foreach ($category->getParentCategories() as $parentCategory) {
  214.                     $selectedCategoryIDList[] = $parentCategory->getID();
  215.                 }
  216.                 $data['categories'] = $categoryRepository->getCategoryTree(Category::OFFER_CATEGORY_ID0$cityID);
  217.                 $data['selectedCategoryIDList'] = $selectedCategoryIDList;
  218.                 $result['parentCategories'] = $this->get('twig')->render('Slivki/admin/categories/recursive_category_with_checkboxes_macro.html.twig'$data);
  219.                 $result['selectedParentCategories'] = $this->get('twig')->render('Slivki/admin/categories/selected_parent_categories.html.twig', ['selectedCategoryList' =>  $category->getParentCategories()]);
  220.                 $result['categoryChildRelation'] = $categoryChildRelationRepository->findByChildId($categoryID);
  221.                 break;
  222.             case Category::SALE_CATEGORY_ID:
  223.                 $resourceURL 'Slivki:Sale:category';
  224.                 $mainMenuType MainMenu::TYPE_SALE_CATEGORY;
  225.                 $selectedCategoryIDList = [];
  226.                 foreach ($category->getParentCategories() as $parentCategory) {
  227.                     $selectedCategoryIDList[] = $parentCategory->getID();
  228.                 }
  229.                 $data['categories'] = $categoryRepository->getCategoryTree(Category::SALE_CATEGORY_ID);
  230.                 $data['selectedCategoryIDList'] = $selectedCategoryIDList;
  231.                 $result['parentCategories'] = $this->get('twig')->render('Slivki/admin/categories/recursive_category_with_checkboxes_macro.html.twig'$data);
  232.                 break;
  233.             case Category::DISCOUNT_CARD_CATEGORY_ID:
  234.                 $resourceURL 'Slivki:DiscountCard:category';
  235.                 break;
  236.         }
  237.         if($mainMenuType) {
  238.             $isCategoryInMainMenu $entityManager->getRepository(MainMenu::class)->findOneBy(['entityID' => $categoryID'type' => $mainMenuType]);
  239.         }
  240.         $result['isCategoryInMainMenu'] = $isCategoryInMainMenu instanceof MainMenu;
  241.         $alias $seoRepository->findBy(array('entityID' => $categoryID'resourceURL' => $resourceURL), array('ID' => 'DESC'), 1);
  242.         $result['category'] = $category;
  243.         $result['lastModified'] = $category->getLastModified()->format('Y-m-d H:i:s');
  244.         $result['categoryType'] = $categoryType;
  245.         $result['categoryBanner'] = $this->get('twig')->render('Slivki/admin/banners/list.html.twig', ['bannerList' => $category->getBannersByType(Banner::TYPE_CATEGORY_BANNER)]);
  246.         $adSlotRepository $entityManager->getRepository(AdSlot::class);
  247.         $result['categoryBannersAdSlot'][1]['usedAdSlot'] = $category->getCountActiveBannersByType(Banner::TYPE_CATEGORY_BANNER);
  248.         $adSlotObjects $adSlotRepository->findBy(['bannerTypeID' => 1'categoryID' => $categoryID]);
  249.         if (!empty($adSlotObjects)) {
  250.             $result['categoryBannersAdSlot'][1]['activeAdSlot'] = $adSlotObjects[0]->getActiveAdSlot();
  251.         } else {
  252.             $result['categoryBannersAdSlot'][1]['activeAdSlot'] = 0;
  253.         }
  254.         $result['verticalTeaserBanner'] = $this->get('twig')->render('Slivki/admin/banners/vertical_teaser_banner/list.html.twig', ['bannerList' => $category->getBannersByType(Banner::TYPE_TEASER_VERTICAL_BANNER)]);
  255.         $result['categoryBannersAdSlot'][2]['usedAdSlot'] = $category->getCountActiveBannersByType(Banner::TYPE_TEASER_BANNER);
  256.         $adSlotObjects $adSlotRepository->findBy(['bannerTypeID' => 2'categoryID' => $categoryID]);
  257.         if (!empty($adSlotObjects)) {
  258.             $result['categoryBannersAdSlot'][2]['activeAdSlot'] = $adSlotObjects[0]->getActiveAdSlot();
  259.         } else {
  260.             $result['categoryBannersAdSlot'][2]['activeAdSlot'] = 0;
  261.         }
  262.         $result['teaserBanner'] = $this->get('twig')->render('Slivki/admin/banners/teaser_banner/list.html.twig', ['bannerList' => $category->getBannersByType(Banner::TYPE_TEASER_BANNER)]);
  263.         $result['categoryBannersAdSlot'][3]['usedAdSlot'] = $category->getCountActiveBannersByType(Banner::TYPE_TEASER_BANNER);
  264.         $adSlotObjects $adSlotRepository->findBy(['bannerTypeID' => 3'categoryID' => $categoryID]);
  265.         if (!empty($adSlotObjects)) {
  266.             $result['categoryBannersAdSlot'][3]['activeAdSlot'] = $adSlotObjects[0]->getActiveAdSlot();
  267.         } else {
  268.             $result['categoryBannersAdSlot'][3]['activeAdSlot'] = 0;
  269.         }
  270.         if($alias) {
  271.             $alias $alias[0];
  272.             $result['alias'] = $alias->getMainAlias();
  273.             $result['metaTitle'] = $alias->getMetaTitle();
  274.             $result['metaDescription'] = $alias->getMetaDescription();
  275.             $result['metaKeywords'] = $alias->getMetaKeywords();
  276.         }
  277.         $commentAlias $seoRepository->getByEntity(SeoRepository::RESOURCE_URL_CATEGORY_COMMENTS$categoryID);
  278.         if ($commentAlias) {
  279.             $result['commentALias']['alias']= $commentAlias->getMainAlias();
  280.             $result['commentALias']['metaTitle'] = $commentAlias->getMetaTitle();
  281.             $result['commentALias']['metaDescription'] = $commentAlias->getMetaDescription();
  282.             $result['commentALias']['metaKeywords'] = $commentAlias->getMetaKeywords();
  283.         }
  284.         $landingImage $entityManager->getRepository(Media::class)->getСategoryLandingImageMedia($categoryID);
  285.         $result['landingImage'] = $landingImage $imageService->getImageURL($landingImage00) : '';
  286.         $hotFeed $entityManager->getRepository(HotFeed::class)->findBy(['entityTypeID' => Category::CATEGORY_ID'entityID' => $categoryID]);
  287.         if ($hotFeed) {
  288.             $result['hotFeed'] = true;
  289.         }
  290.         $hotFeedImage $entityManager->getRepository(Media::class)->getСategoryHotFeedImageMedia($categoryID);
  291.         $hotFeedIcon $entityManager->getRepository(Media::class)->getСategoryHotFeedIconMedia($categoryID);
  292.         $result['hotFeedImage'] = $hotFeedImage $imageService->getImageURL($hotFeedImage00) : '';
  293.         $result['hotFeedIcon'] = $hotFeedIcon $imageService->getImageURL($hotFeedIcon00) : '';
  294.         $mobileMenuIcon $category->getMobileMenuIconMedia();
  295.         $result['mobileMenuIcon'] = $mobileMenuIcon $imageService->getImageURL($mobileMenuIcon00) : '';
  296.         $appIcon $category->getAppIconMedia();
  297.         $result['appIcon'] = $appIcon $imageService->getImageURL($appIcon00) : '';
  298.         $mapPinIcon $category->getMapPinIconMedia();
  299.         $result['mapPinIcon'] = $mapPinIcon $imageService->getImageURL($mapPinIcon00) : '';
  300.         return new Response(json_encode($result));
  301.     }
  302.     /**
  303.      * @Route("/admin/category/ajax_add_category")
  304.      */
  305.     public function ajaxAddCategoryAction(Request $requestImageService $imageServiceCategoryDbalInterface $categoryDbal) {
  306.         if (!$request->isXmlHttpRequest()) {
  307.             return $this->redirect("/admin");
  308.         }
  309.         $entityManager $this->getDoctrine()->getManager("admin");
  310.         $categoryRepository =  $entityManager->getRepository(Category::class);
  311.         $cityID $request->request->get('edit-category-city-id'City::DEFAULT_CITY_ID);
  312.         if ($cityID == '') {
  313.             $cityID City::DEFAULT_CITY_ID;
  314.         }
  315.         $city $entityManager->getRepository(City::class)->find($cityID);
  316.         $category = new Category();
  317.         if ($city) {
  318.             $category->setCity($city);
  319.         }
  320.         $category->setName(trim($request->request->get('edit-category-name')));
  321.         $h1 trim($request->request->get('editCategoryH1'''));
  322.         $category->setH1($h1 == '' null $h1);
  323.         $category->setSortOrder(
  324.             $request->request->getInt('edit-category-order') ?: self::DEFAULT_CATEGORY_SORT_ORDER
  325.         );
  326.         $category->setTelegramBotName(trim($request->request->get('editCategoryTelegramBotName')));
  327.         $category->setTelegramBotShow($request->request->getBoolean('editCategoryTelegramBotShow'));
  328.         $category->setPosition($request->request->getInt('editСategoryPosition'));
  329.         $category->setCode($request->request->get('edit-category-code'));
  330.         $category->setTopCount((int)$request->request->get('edit-category-tops'));
  331.         $category->setPast(false);
  332.         $category->setLastModified(new \DateTime());
  333.         $category->setInMenuBottom($request->request->has('inMenuBottom'));
  334.         $category->setUtmCampaign($request->request->get('editCategoryUtmCampaign'));
  335.         $category->setSplitOffersWithSameCategories($request->request->getInt('splitOffersWithSameCategories'));
  336.         $category->setUnpopular($request->request->has('unpopular'));
  337.         $category->setFeaturedInMenu($request->request->getBoolean('categoryFeaturedInMenu'));
  338.         $category->setShowItemsCatalog($request->request->getBoolean('showItemsCatalog'));
  339.         $category->setHideWorkExamples($request->request->getBoolean('hideWorkExamples'));
  340.         $category->setIsBonusCode($request->request->getBoolean('isBonusCode'));
  341.         $categoryTypeID $request->request->getInt('edit-category-group');
  342.         $categoryType $entityManager->find(CategoryType::class, $categoryTypeID);
  343.         if ($categoryType) {
  344.             $category->setCategoryType($categoryType);
  345.         }
  346.         if ($request->request->get('edit-category-active')) {
  347.             $category->setActive(true);
  348.         } else {
  349.             $category->setActive(false);
  350.         }
  351.         $category->setDescription($request->request->get('edit-category-description'));
  352.         $requestDomainObjectID $request->request->get('edit-category-domain-object-id');
  353.         $category->setDomainObjectID($requestDomainObjectID);
  354.         $entityManager->persist($category);
  355.         $categoryDbal->updateChildBonusCodes($category->getID(), $category->isBonusCode());
  356.         $this->getCategoryRepository()->scheduleCategoryReload($category->getID());
  357.         $requestCategoryBannerList $request->request->get('admin-category-banner-id', []);
  358.         foreach ($requestCategoryBannerList as $index => $bannerID) {
  359.             $banner $entityManager->getRepository(Banner::class)->find($bannerID);
  360.             if($banner) {
  361.                 if ($request->request->get('admin-category-banner-deleted')[$index] == "true") {
  362.                     $category->deleteBanner($banner);
  363.                 } else {
  364.                     $category->addBanner($banner);
  365.                 }
  366.                 $entityManager->flush($banner);
  367.             }
  368.         }
  369.         $requestTeaserBannerList $request->request->get('admin-teaser-banner-id', []);
  370.         foreach ($requestTeaserBannerList as $index => $bannerID) {
  371.             $banner $entityManager->getRepository(Banner::class)->find($bannerID);
  372.             if($banner) {
  373.                 if ($request->request->get('admin-teaser-banner-deleted')[$index] == "true") {
  374.                     $category->deleteBanner($banner);
  375.                 } else {
  376.                     $category->addBanner($banner);
  377.                 }
  378.                 $entityManager->flush($banner);
  379.             }
  380.         }
  381.         $requestVerticalTeaserBannerList $request->request->get('admin-vertical-teaser-banner-id', []);
  382.         foreach ($requestVerticalTeaserBannerList as $index => $bannerID) {
  383.             $banner $entityManager->getRepository(Banner::class)->find($bannerID);
  384.             if($banner) {
  385.                 if ($request->request->get('admin-vertical-teaser-banner-deleted')[$index] == "true") {
  386.                     $category->deleteBanner($banner);
  387.                 } else {
  388.                     $category->addBanner($banner);
  389.                 }
  390.                 $entityManager->flush($banner);
  391.             }
  392.         }
  393.         $alias = new Seo();
  394.         $seoRepository $entityManager->getRepository(Seo::class);
  395.         $requestAlias $request->request->get('edit-category-alias');
  396.         if (trim($requestAlias) == '') {
  397.             $result = array(
  398.                 'title' => 'Ошибка!',
  399.                 'message' => 'Введите алиас',
  400.                 'type' => 'modal-danger'
  401.             );
  402.             return new Response(json_encode($result));
  403.         }
  404.         if ($requestAlias[0] != '/') {
  405.             $requestAlias '/' $requestAlias;
  406.         }
  407.         $alias->setMainAlias($requestAlias);
  408.         $alias->setEntityID($category->getID());
  409.         $alias->setActive(true);
  410.         $alias->setMetaTitle($request->request->get('edit-category-meta-title'));
  411.         $alias->setMetaDescription($request->request->get('edit-category-meta-description'));
  412.         $alias->setMetaKeywords($request->request->get('edit-category-meta-keywords'));
  413.         $alias->setDomain($city->getDomain());
  414.         switch($requestDomainObjectID) {
  415.             case Category::OFFER_CATEGORY_ID:
  416.                 $alias->setResourceURL('Slivki:Default:category');
  417.                 break;
  418.             case Category::SALE_CATEGORY_ID:
  419.                 $alias->setResourceURL('Slivki:Sale:category');
  420.                 break;
  421.             case Category::DISCOUNT_CARD_CATEGORY_ID:
  422.                 $alias->setResourceURL('Slivki:DiscountCard:category');
  423.                 break;
  424.         }
  425.         if (!$seoRepository->setAlias($alias)) {
  426.             $result = array(
  427.                 'title' => 'Ошибка!',
  428.                 'message' => 'Алиас ' $requestAlias ' уже существует!',
  429.                 'type' => 'modal-danger'
  430.             );
  431.             return new Response(json_encode($result));
  432.         }
  433.         $parentCategoryIDList $request->request->get('categories', []);
  434.         if (is_array($parentCategoryIDList)) {
  435.             foreach ($parentCategoryIDList as $parentCategoryID) {
  436.                 $parentCategory $categoryRepository->find($parentCategoryID);
  437.                 if ($parentCategory->addSubCategory($category)) {
  438.                     $entityManager->flush($parentCategory);
  439.                     $this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
  440.                 }
  441.             }
  442.         }
  443.         $category->setHotFeedName($request->request->get('edit-category-hot-feed-name'));
  444.         $entityManager->flush($category);
  445.         $entityManager->detach($category);
  446.         $seoRepository->setAlias($seoRepository->getCategoryCommentsSeo($category));
  447.         $data['categories'] = [];
  448.         if ($category->getParentCategories()->count() > 0) {
  449.             $data['categories'] = $categoryRepository->getCategoryTree($requestDomainObjectID$parentCategory->getID());
  450.         } else {
  451.             $data['categories'] = $categoryRepository->getCategoryTree($requestDomainObjectID0$cityID);
  452.         }
  453.         $newCategoryList $this->get('twig')->render('Slivki/admin/categories/refresh_categories.html.twig'$data);
  454.         $result = array(
  455.             'title' => 'Успех!',
  456.             'message' => 'Раздел успешно добавлен!',
  457.             'type' => 'modal-success',
  458.             'newCategoryList' => $newCategoryList,
  459.             'newLastModified' => $category->getLastModified()->format('Y-m-d H:i:s')
  460.         );
  461.         if (!$category->getParentCategories()->count() == && $category->isActive() && !$category->isPast() && $category->getDomainObjectID() == Category::OFFER_CATEGORY_ID) {
  462.             $this->getDoctrine()->getManager('admin')->getRepository(MainMenu::class)->addMenuItem($category->getID(), MainMenu::TYPE_OFFER_CATEGORY);
  463.         }
  464.         if ($category->isActive()) {
  465.             foreach ($parentCategoryIDList as $parentCategoryID) {
  466.                 if ($parentCategoryID == Category::FLIER_SALE_CATEGORY_ID) {
  467.                     $entityManager->getRepository(MainMenu::class)->addMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORYMainMenu::MENU_ID_FLIER);
  468.                     break;
  469.                 }
  470.             }
  471.         }
  472.         $mediaTypeRepository $entityManager->getRepository(MediaType::class);
  473.         $landingImage $request->request->get('editCategoryLandingImage');
  474.         if ($landingImage) {
  475.             $this->saveMedia($imageService$category->getID(),MediaType::TYPE_CATEGORY_LANDING_IMAGE_IDMediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH$landingImage);
  476.         }
  477.         if ($request->request->get('edit-category-hot-feed') == 'on') {
  478.             $hotFeed = new HotFeed();
  479.             $hotFeed->setCreatedOn(new \DateTime());
  480.             $hotFeed->setEntityTypeID(Category::CATEGORY_ID);
  481.             $hotFeed->setEntityID($category->getID());
  482.             $hotFeed->setCityID($cityID);
  483.             $entityManager->persist($hotFeed);
  484.             $entityManager->flush($hotFeed);
  485.         }
  486.         $hotFeedImage $request->request->get('editCategoryHotFeedImage');
  487.         if ($hotFeedImage) {
  488.             $this->saveMedia($imageService$category->getID(),MediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_IDMediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_PATH$hotFeedImage);
  489.         }
  490.         $mapPinIcon $request->request->get('editCategoryMapPinIcon');
  491.         if ($mapPinIcon) {
  492.             $category $categoryRepository->findOneBy(['ID' => $category->getID()]);
  493.             $mapPinIconMedia = new Media\CategoryMapPinIconMedia();
  494.             $mapPinIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
  495.             $mapPinIconMedia->setCategory($category);
  496.             $mapPinIconMedia->setName($mapPinIcon);
  497.             $category->setMapPinIconMedia($mapPinIconMedia);
  498.             $entityManager->persist($mapPinIconMedia);
  499.             $entityManager->flush($mapPinIconMedia);
  500.         }
  501.         return new Response(json_encode($result));
  502.     }
  503.     /**
  504.      * @Route("/admin/category/ajax_edit_category")
  505.      */
  506.     public function ajaxEditCategoryAction(
  507.         Request $request,
  508.         ImageService $imageService,
  509.         CategoryChildRelationRepositoryInterface $categoryChildRelationRepository,
  510.         CategoryDbalInterface $categoryDbal
  511.     ) {
  512.         if (!$request->isXmlHttpRequest()) {
  513.             return $this->redirect("/admin");
  514.         }
  515.         if($request->request->get('edit-category-name') == '') {
  516.             $result = array(
  517.                 'title' => 'Ошибка!',
  518.                 'message' => 'Введите название раздела!',
  519.                 'type' => 'modal-danger'
  520.             );
  521.             return new Response(json_encode($result));
  522.         }
  523.         $entityManager $this->getDoctrine()->getManager("admin");
  524.         $categoryRepository =  $entityManager->getRepository(Category::class);
  525.         $mainMenuRepository $entityManager->getRepository(MainMenu::class);
  526.         $requestCategoryID = (int)$request->request->get('edit-category-id');
  527.         /** @var Category $category */
  528.         $category $categoryRepository->find($requestCategoryID);
  529.         if(!$category) {
  530.             $result = array(
  531.                 'title' => 'Ошибка!',
  532.                 'message' => 'Категории с ID = ' $requestCategoryID ' не существует!',
  533.                 'type' => 'modal-danger'
  534.             );
  535.             return new Response(json_encode($result));
  536.         }
  537.         if (!$request->request->get('forceSave'false) && $category->getLastModified() > new \DateTime($request->request->get('edit-category-last-modified'))) {
  538.             return new Response(json_encode(['error' => 'categoryChanged']));
  539.         }
  540.         $parentCategoryIDList $request->request->get('categories', []);
  541.         /** @var Category $parentCategory */
  542.         foreach ($category->getParentCategories() as $parentCategory) {
  543.             if (!in_array($parentCategory->getID(), $parentCategoryIDList)) {
  544.                 $parentCategory->getSubCategories()->removeElement($category);
  545.                 $parentCategory->setMobileApiHash(md5(time()));
  546.                 $entityManager->flush($parentCategory);
  547.                 $this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
  548.                 if ($parentCategory->getID() == Category::FLIER_SALE_CATEGORY_ID && $category->isActive()) {//TODO: check $parentCategoryIDList
  549.                     $entityManager->getRepository(MainMenu::class)->deleteMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORYMainMenu::MENU_ID_FLIER);
  550.                 }
  551.             }
  552.         }
  553.         if ($parentCategoryIDList) {
  554.             foreach ($parentCategoryIDList as $parentCategoryID) {
  555.                 $parentCategory $categoryRepository->find($parentCategoryID);
  556.                 if ($parentCategory->addSubCategory($category)) {
  557.                     $entityManager->flush($parentCategory);
  558.                     $this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
  559.                 }
  560.             }
  561.         }
  562.         $reloadMenuCache false;
  563.         if ($category->getName() != $request->request->get('edit-category-name')) {
  564.             foreach ($category->getParentCategories() as $parentCategory) {
  565.                 $parentCategory->setMobileApiHash(md5(time()));
  566.                 $entityManager->flush($parentCategory);
  567.                 $this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
  568.             }
  569.             if ($category->getDomainObjectID() != Category::OFFER_CATEGORY_ID) {
  570.                 $reloadMenuCache true;
  571.             }
  572.         }
  573.         $category->setName(trim($request->request->get('edit-category-name')));
  574.         $h1 trim($request->request->get('editCategoryH1'''));
  575.         $category->setH1($h1 == '' null $h1);
  576.         $category->setLastModified(new \DateTime());
  577.         $category->setSortOrder(
  578.             $request->request->getInt('edit-category-order') ?: self::DEFAULT_CATEGORY_SORT_ORDER
  579.         );
  580.         $category->setTelegramBotName(trim($request->request->get('editCategoryTelegramBotName')));
  581.         $category->setTelegramBotShow($request->request->getBoolean('editCategoryTelegramBotShow'));
  582.         $category->setPosition($request->request->getInt('editСategoryPosition'));
  583.         $category->setCode($request->request->get('edit-category-code'));
  584.         $category->setTopCount((int)$request->request->get('edit-category-tops'));
  585.         $category->setInMenuBottom($request->request->has('inMenuBottom'));
  586.         $category->setUtmCampaign($request->request->get('editCategoryUtmCampaign'));
  587.         $category->setSplitOffersWithSameCategories($request->request->getInt('splitOffersWithSameCategories'));
  588.         $category->setUnpopular($request->request->has('unpopular'));
  589.         $category->setFeaturedInMenu($request->request->getBoolean('categoryFeaturedInMenu'));
  590.         $category->setShowItemsCatalog($request->request->getBoolean('showItemsCatalog'));
  591.         $category->setHideWorkExamples($request->request->getBoolean('hideWorkExamples'));
  592.         $category->setIsBonusCode($request->request->getBoolean('isBonusCode'));
  593.         $categoryDbal->updateChildBonusCodes($category->getID(), $category->isBonusCode());
  594.         $category->setMapPinColor($request->request->get('editCategoryMapPinColor'));
  595.         $categoryType $entityManager->find(CategoryType::class, (int)$request->request->get('edit-category-group'));
  596.         if ($categoryType) {
  597.             $category->setCategoryType($categoryType);
  598.         }
  599.         $categoryParentRelations $categoryChildRelationRepository->findByChildId($requestCategoryID);
  600.         $endOfBlockParentCategoryIds = (array) $request->request->get('endOfBlock', []);
  601.         foreach ($categoryParentRelations as $categoryParentRelation) {
  602.             if (!$categoryParentRelation->isEndOfBlock() && in_array($categoryParentRelation->getParentId(), $endOfBlockParentCategoryIds)) {
  603.                 $categoryParentRelation->setEndOfBlock(true);
  604.                 $categoryChildRelationRepository->save($categoryParentRelation);
  605.             }
  606.             if ($categoryParentRelation->isEndOfBlock() && !in_array($categoryParentRelation->getParentId(), $endOfBlockParentCategoryIds)) {
  607.                 $categoryParentRelation->setEndOfBlock(false);
  608.                 $categoryChildRelationRepository->save($categoryParentRelation);
  609.             }
  610.         }
  611.         $editCategoryMobileMenuIcon $request->request->get('editCategoryMobileMenuIcon');
  612.         if ($editCategoryMobileMenuIcon) {
  613.             $mobileMenuIconMedia $category->getMobileMenuIconMedia();
  614.             if (!$mobileMenuIconMedia) {
  615.                 $mobileMenuIconMedia = new Media\CategoryMobileMenuIconMedia();
  616.                 $mobileMenuIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
  617.                 $mobileMenuIconMedia->setCategory($category);
  618.                 $entityManager->persist($mobileMenuIconMedia);
  619.             }
  620.             $mobileMenuIconMedia->setName($editCategoryMobileMenuIcon);
  621.             $category->setMobileMenuIconMedia($mobileMenuIconMedia);
  622.         }
  623.         $editCategoryAppIcon $request->request->get('editCategoryAppIcon');
  624.         if ($editCategoryAppIcon) {
  625.             $appIconMedia $category->getAppIconMedia();
  626.             if (!$appIconMedia) {
  627.                 $appIconMedia = new Media\CategoryAppIconMedia();
  628.                 $appIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
  629.                 $appIconMedia->setCategory($category);
  630.                 $entityManager->persist($appIconMedia);
  631.             }
  632.             $appIconMedia->setName($editCategoryAppIcon);
  633.             $category->setAppIconMedia($appIconMedia);
  634.             $entityManager->flush($appIconMedia);
  635.         }
  636.         $editCategoryMapPinIcon $request->request->get('editCategoryMapPinIcon');
  637.         if ($editCategoryMapPinIcon) {
  638.             $mapPinIconMedia $category->getMapPinIconMedia();
  639.             if (!$mapPinIconMedia) {
  640.                 $mapPinIconMedia = new Media\CategoryMapPinIconMedia();
  641.                 $mapPinIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
  642.                 $mapPinIconMedia->setCategory($category);
  643.                 $entityManager->persist($mapPinIconMedia);
  644.             }
  645.             $mapPinIconMedia->setName($editCategoryMapPinIcon);
  646.             $category->setMapPinIconMedia($mapPinIconMedia);
  647.             $entityManager->flush($mapPinIconMedia);
  648.         }
  649.         if ($this->isGranted('ROLE_CATEGORY_MANAGER')) {
  650.             $active $request->request->get('edit-category-active');
  651.             if ($active != $category->isActive()) {
  652.                 $category->setActive($active);
  653.                 if ($active) {
  654.                     $this->logOperatorAction($request$requestCategoryID"activation category " Category::OFFER_CATEGORY_IDOperatorActionLog::ACTIVATION_CATEGORY);
  655.                 } else {
  656.                     $this->logOperatorAction($request$requestCategoryID"deactivation category " Category::OFFER_CATEGORY_IDOperatorActionLog::ACTIVATION_CATEGORY);
  657.                     foreach ($category->getSubCategories() as $subCategory) {
  658.                         $subCategory->setActive(false);
  659.                         $entityManager->flush($subCategory);
  660.                         $categoryRepository->scheduleCategoryReload($subCategory->getID());
  661.                     }
  662.                 }
  663.             }
  664.         }
  665.         if ($parentCategoryIDList) {
  666.             foreach ($parentCategoryIDList as $parentCategoryID) {
  667.                 if ($parentCategoryID == Category::FLIER_SALE_CATEGORY_ID) {
  668.                     if ($category->isActive()) {
  669.                         $entityManager->getRepository(MainMenu::class)->addMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORYMainMenu::MENU_ID_FLIERCity::DEFAULT_CITY_ID);
  670.                     } else {
  671.                         $entityManager->getRepository(MainMenu::class)->deleteMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORYMainMenu::MENU_ID_FLIER);
  672.                     }
  673.                     break;
  674.                 }
  675.             }
  676.         }
  677.         $category->setDescription($request->request->get('edit-category-description'));
  678.         $requestCategoryBannerList $request->request->get('admin-category-banner-id', []);
  679.         foreach ($requestCategoryBannerList as $index => $bannerID) {
  680.             $banner $entityManager->getRepository(Banner::class)->find($bannerID);
  681.             if($banner) {
  682.                 if ($request->request->get('admin-category-banner-deleted')[$index] == "true") {
  683.                     $category->deleteBanner($banner);
  684.                 } else {
  685.                     $category->addBanner($banner);
  686.                 }
  687.                 $entityManager->flush($banner);
  688.                 $categoryRepository->scheduleCategoryBannerReload($requestCategoryID);
  689.             }
  690.         }
  691.         $requestTeaserBannerList $request->request->get('admin-teaser-banner-id', []);
  692.         foreach ($requestTeaserBannerList as $index => $bannerID) {
  693.             $banner $entityManager->getRepository(Banner::class)->find($bannerID);
  694.             if($banner) {
  695.                 if ($request->request->get('admin-teaser-banner-deleted')[$index] == "true") {
  696.                     $category->deleteBanner($banner);
  697.                 } else {
  698.                     $category->addBanner($banner);
  699.                 }
  700.                 $entityManager->flush($banner);
  701.                 $categoryRepository->scheduleCategoryBannerReload($requestCategoryID);
  702.             }
  703.         }
  704.         $requestVerticalTeaserBannerList $request->request->get('admin-vertical-teaser-banner-id', []);
  705.         foreach ($requestVerticalTeaserBannerList as $index => $bannerID) {
  706.             $banner $entityManager->getRepository(Banner::class)->find($bannerID);
  707.             if($banner) {
  708.                 if ($request->request->get('admin-vertical-teaser-banner-deleted')[$index] == "true") {
  709.                     $category->deleteBanner($banner);
  710.                 } else {
  711.                     $category->addBanner($banner);
  712.                 }
  713.                 $entityManager->flush($banner);
  714.                 $categoryRepository->scheduleCategoryBannerReload($requestCategoryID);
  715.             }
  716.         }
  717.         $landingImage $request->request->get('editCategoryLandingImage');
  718.         if ($landingImage) {
  719.             $this->saveMedia($imageService$requestCategoryID,MediaType::TYPE_CATEGORY_LANDING_IMAGE_IDMediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH$landingImage);
  720.         }
  721.         $hotFeed $entityManager->getRepository(HotFeed::class)->findBy(['entityTypeID' => Category::CATEGORY_ID'entityID' => $requestCategoryID]);
  722.         $showInHotFeed $request->request->get('edit-category-hot-feed') == 'on';
  723.         if ($showInHotFeed && !$hotFeed) {
  724.             $hotFeed = new HotFeed();
  725.             $hotFeed->setCreatedOn(new \DateTime());
  726.             $hotFeed->setEntityTypeID(Category::CATEGORY_ID);
  727.             $hotFeed->setEntityID($category->getID());
  728.             $categoryCityID City::DEFAULT_CITY_ID;
  729.             if ($category->getCity()) {
  730.                 $categoryCityID $category->getCity()->getID();
  731.             }
  732.             $hotFeed->setCityID($categoryCityID);
  733.             $entityManager->persist($hotFeed);
  734.             $entityManager->flush($hotFeed);
  735.         } else if (!$showInHotFeed && $hotFeed) {
  736.             $entityManager->remove($hotFeed[0]);
  737.             $entityManager->flush($hotFeed[0]);
  738.         }
  739.         $hotFeedImage $request->request->get('editCategoryHotFeedImage');
  740.         if ($hotFeedImage) {
  741.             $this->saveMedia($imageService$requestCategoryID,MediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_IDMediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_PATH$hotFeedImage);
  742.         }
  743.         $category->setHotFeedName($request->request->get('edit-category-hot-feed-name'));
  744.         $entityManager->flush($category);
  745.         $mainMenuType MainMenu::TYPE_OFFER_CATEGORY;
  746.         $resourceURL 'Slivki:Default:category';
  747.         switch ($request->request->get('edit-category-domain-object-id')) {
  748.             case Category::OFFER_CATEGORY_ID:
  749.                 $resourceURL SeoRepository::RESOURCE_URL_OFFER_CATEGORY;
  750.                 $mainMenuType MainMenu::TYPE_OFFER_CATEGORY;
  751.                 break;
  752.             case Category::SALE_CATEGORY_ID:
  753.                 $resourceURL SeoRepository::RESOURCE_URL_SALE_CATEGORY;
  754.                 $mainMenuType MainMenu::TYPE_SALE_CATEGORY;
  755.                 break;
  756.         }
  757.         $hotFeedIcon $request->request->get('editCategoryHotFeedIcon');
  758.         if ($hotFeedIcon) {
  759.             $this->saveMedia($imageService$requestCategoryIDMediaType::TYPE_HOT_FEED_CATEGORY_ICON_IMAGE_IDMediaType::TYPE_HOT_FEED_ICON_IMAGE_PATH$hotFeedIcon);
  760.         }
  761.         $seoRepository $entityManager->getRepository(Seo::class);
  762.         $requestAlias $request->request->get('edit-category-alias');
  763.         if (trim($requestAlias) == '') {
  764.             $result = array(
  765.                 'title' => 'Ошибка!',
  766.                 'message' => 'Введите алиас',
  767.                 'type' => 'modal-danger'
  768.             );
  769.             return new Response(json_encode($result));
  770.         }
  771.         if ($requestAlias[0] != '/') {
  772.             $requestAlias '/' $requestAlias;
  773.         }
  774.         $metaTitle $request->request->get('edit-category-meta-title');
  775.         $metaDescription $request->request->get('edit-category-meta-description');
  776.         $metaKeywords $request->request->get('edit-category-meta-keywords');
  777.         $alias = new Seo();
  778.         $alias->setMainAlias($requestAlias);
  779.         $alias->setEntityID($category->getID());
  780.         $alias->setActive(true);
  781.         $alias->setMetaTitle($metaTitle);
  782.         $alias->setMetaDescription($metaDescription);
  783.         $alias->setMetaKeywords($metaKeywords);
  784.         $alias->setResourceURL($resourceURL);
  785.         $alias->setDomain($category->getCity()->getDomain());
  786.         if(!$seoRepository->setAlias($alias)) {
  787.             $result = array(
  788.                 'title' => 'Ошибка!',
  789.                 'message' => 'Алиас ' $requestAlias ' уже существует!',
  790.                 'type' => 'modal-danger'
  791.             );
  792.             return new Response(json_encode($result));
  793.         }
  794.         $commentSeo $seoRepository->getCategoryCommentsSeo($category);
  795.         if ($commentSeo) {
  796.             $commentSeo->setMainAlias($requestAlias);
  797.             $commentSeo->setMetaTitle($metaTitle);
  798.             $commentSeo->setMetaDescription($metaDescription);
  799.             $commentSeo->setMetaKeywords($metaKeywords);
  800.             $seoRepository->setAlias($commentSeo);
  801.         }
  802.         $cityID null;
  803.         if ($category->getDomainObjectID() == Category::OFFER_CATEGORY_ID) {
  804.             $cityID $category->getCity()->getID();
  805.         }
  806.         $menuID $category->getDomainObjectID() == Category::OFFER_CATEGORY_ID MainMenu::MENU_ID_MAIN MainMenu::MENU_ID_SALE;
  807.         if($request->request->get('edit-category-show-in-main-menu') == 'on') {
  808.             $entityManager->getRepository(MainMenu::class)->addMenuItem($category->getID(), $mainMenuType$menuID$cityID);
  809.         } else {
  810.             $entityManager->getRepository(MainMenu::class)->deleteMenuItem($category->getID(), $mainMenuType$menuID);
  811.         }
  812.         $result = array(
  813.             'title' => 'Успех!',
  814.             'message' => 'Раздел успешно сохранен!',
  815.             'type' => 'modal-success',
  816.             'newLastModified' => $category->getLastModified()->format('Y-m-d H:i:s')
  817.         );
  818.         if ($reloadMenuCache) {
  819.             $mainMenuRepository->reloadCache($menuID$cityID);
  820.         }
  821.         $categoryRepository->scheduleCategoryReload($requestCategoryID);
  822.         return new Response(json_encode($result));
  823.     }
  824.     /**
  825.      * @route("/admin/category/banner/save")
  826.      */
  827.     public function saveCategoryBanner(Request $request) {
  828.         if (!$request->isXmlHttpRequest()) {
  829.             return $this->redirect("/admin");
  830.         }
  831.         $result['message'] = $this->validateCategoryBannerForm($request);
  832.         if($result['message'] !== true) {
  833.             return new Response(json_encode($result));
  834.         }
  835.         $entityManager $this->getDoctrine()->getManager("admin");
  836.         $bannerRepository $entityManager->getRepository(Banner::class);
  837.         $requestBannerID $request->request->get("category-banner-id");
  838.         $banner = new Banner();
  839.         if(!$requestBannerID) {
  840.             $banner->setTypeID(Banner::TYPE_CATEGORY_BANNER);
  841.             $entityManager->persist($banner);
  842.         } else {
  843.             $banner $bannerRepository->find($requestBannerID);
  844.             if(!$banner) {
  845.                 $result['message'] = array(
  846.                     'title' => 'Ошибка!',
  847.                     'message' => 'Банер с id = ' $requestBannerID ' не существует!',
  848.                     'type' => 'modal-danger'
  849.                 );
  850.                 return new Response(json_encode($result));
  851.             }
  852.         }
  853.         $banner->setTitle($request->request->get("edit-category-banner-name"));
  854.         $banner->setActive($request->request->get("edit-category-banner-active"false) !== false);
  855.         $banner->setJavaScript($request->request->get("edit-category-banner-javascript"false) !== false);
  856.         $banner->setCode($request->request->get("edit-category-banner-code"));
  857.         $banner->setURL($request->request->get("edit-category-banner-link"""));
  858.         $requestBannerFilePath $request->request->get("edit-category-banner-banner-file-path"'');
  859.         if($requestBannerFilePath != '') {
  860.             $banner->setFilePath($requestBannerFilePath);
  861.         }
  862.         $requestBannerSubstitutePath $request->request->get("edit-category-banner-substitute-path"'');
  863.         if($requestBannerSubstitutePath != '') {
  864.             $banner->setSubstitutePath($requestBannerSubstitutePath);
  865.         }
  866.         $entityManager->flush();
  867.         $bannerList = [$banner];
  868.         $result['bannerID'] = $banner->getID();
  869.         $result['bannerLine'] = $this->get('twig')->render('Slivki/admin/banners/list.html.twig', ['bannerList' => $bannerList]);
  870.         return new Response(json_encode($result));
  871.     }
  872.     private function validateCategoryBannerForm(Request $request) {
  873.         $errorMessage '';
  874.         if($request->request->get('edit-category-banner-name') == '') {
  875.             $errorMessage .= 'Введите название!<br>';
  876.         }
  877.         if($errorMessage != '') {
  878.             $result = array(
  879.                 'title' => 'Ошибка!',
  880.                 'message' => $errorMessage,
  881.                 'type' => 'modal-danger'
  882.             );
  883.             return $result;
  884.         }
  885.         return true;
  886.     }
  887.     /**
  888.      * @route("/admin/category/banner/list")
  889.      */
  890.     public function categoryBannerList() {
  891.         $entityManager $this->getDoctrine()->getManager();
  892.         $bannerRepository $entityManager->getRepository(Banner::class);
  893.         $bannerList $bannerRepository->findByTypeID(Banner::TYPE_CATEGORY_BANNER);
  894.         return $this->render('Slivki/admin/banners/list.html.twig', ['bannerList' => $bannerList]);
  895.     }
  896.     /**
  897.      * @route("/admin/category/teaser_banner/list")
  898.      */
  899.     public function categoryTeaserBannerList() {
  900.         $entityManager $this->getDoctrine()->getManager();
  901.         $bannerRepository $entityManager->getRepository(Banner::class);
  902.         $bannerList $bannerRepository->findByTypeID(Banner::TYPE_TEASER_BANNER);
  903.         return $this->render('Slivki/admin/banners/teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
  904.     }
  905.     /**
  906.      * @route("/admin/category/teaser_banner/save")
  907.      */
  908.     public function saveCategoryTeaserBanner(Request $requestCategoryBoxCacheService $categoryBoxCacheService) {
  909.         if (!$request->isXmlHttpRequest()) {
  910.             return $this->redirect("/admin");
  911.         }
  912.         $result['message'] = $this->validateCategoryTeaserBannerForm($request);
  913.         if($result['message'] !== true) {
  914.             return new Response(json_encode($result));
  915.         }
  916.         $entityManager $this->getDoctrine()->getManager("admin");
  917.         $bannerRepository $entityManager->getRepository(Banner::class);
  918.         $requestBannerID $request->request->get("category-teaser-banner-id");
  919.         $banner = new Banner();
  920.         if(!$requestBannerID) {
  921.             $banner->setTypeID(Banner::TYPE_TEASER_BANNER);
  922.             $entityManager->persist($banner);
  923.         } else {
  924.             $banner $bannerRepository->find($requestBannerID);
  925.             if(!$banner) {
  926.                 $result['message'] = array(
  927.                     'title' => 'Ошибка!',
  928.                     'message' => 'Банер с id = ' $requestBannerID ' не существует!',
  929.                     'type' => 'modal-danger'
  930.                 );
  931.                 return new Response(json_encode($result));
  932.             }
  933.         }
  934.         $banner->setTitle($request->request->get("edit-category-teaser-banner-name"));
  935.         $banner->setActive($request->request->get("edit-category-teaser-banner-active"false) !== false);
  936.         $banner->setJavaScript($request->request->get("edit-category-teaser-banner-javascript"false) !== false);
  937.         $banner->setJson($request->request->getBoolean('edit-category-teaser-banner-json'));
  938.         $banner->setCode($request->request->get("edit-category-teaser-banner-code"));
  939.         $banner->setURL($request->request->get("edit-category-teaser-banner-link"""));
  940.         $banner->setPositionRow((int)$request->request->get("edit-category-teaser-banner-row"));
  941.         $banner->setPositionColumn((int)$request->request->get("edit-category-teaser-banner-column"));
  942.         $banner->setUtmCampaign($request->request->get("edit-category-teaser-banner-campaign"));
  943.         $requestBannerFilePath $request->request->get("edit-category-teaser-banner-banner-file-path"'');
  944.         if($requestBannerFilePath != '') {
  945.             $banner->setFilePath($requestBannerFilePath);
  946.         }
  947.         $requestBannerSubstitutePath $request->request->get("edit-category-teaser-banner-substitute-path"'');
  948.         if($requestBannerSubstitutePath != '') {
  949.             $banner->setSubstitutePath($requestBannerSubstitutePath);
  950.         }
  951.         $entityManager->flush();
  952.         $categoryBoxCacheService->setTeaser($banner);
  953.         $bannerList = [$banner];
  954.         $result['bannerID'] = $banner->getID();
  955.         $result['bannerLine'] = $this->get('twig')->render('Slivki/admin/banners/teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
  956.         foreach($banner->getCategories() as $category) {
  957.             $entityManager->getRepository(Category::class)->scheduleCategoryReload($category->getID());
  958.         }
  959.         return new Response(json_encode($result));
  960.     }
  961.     private function validateCategoryTeaserBannerForm(Request $request) {
  962.         $errorMessage '';
  963.         if($request->request->get('edit-category-teaser-banner-name') == '') {
  964.             $errorMessage .= 'Введите название!<br>';
  965.         }
  966.         if($errorMessage != '') {
  967.             $result = array(
  968.                 'title' => 'Ошибка!',
  969.                 'message' => $errorMessage,
  970.                 'type' => 'modal-danger'
  971.             );
  972.             return $result;
  973.         }
  974.         return true;
  975.     }
  976.     /**
  977.      * @route("/admin/category/vertical_teaser_banner/list")
  978.      */
  979.     public function categoryVerticalTeaserBannerList() {
  980.         $entityManager $this->getDoctrine()->getManager();
  981.         $bannerRepository $entityManager->getRepository(Banner::class);
  982.         $bannerList $bannerRepository->findByTypeID(Banner::TYPE_TEASER_VERTICAL_BANNER);
  983.         return $this->render('Slivki/admin/banners/vertical_teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
  984.     }
  985.     /**
  986.      * @route("/admin/category/vertical_teaser_banner/save")
  987.      */
  988.     public function saveCategoryVerticalTeaserBanner(Request $request) {
  989.         if (!$request->isXmlHttpRequest()) {
  990.             return $this->redirect("/admin");
  991.         }
  992.         $result['message'] = $this->validateCategoryVerticalTeaserBannerForm($request);
  993.         if($result['message'] !== true) {
  994.             return new Response(json_encode($result));
  995.         }
  996.         $entityManager $this->getDoctrine()->getManager("admin");
  997.         $bannerRepository $entityManager->getRepository(Banner::class);
  998.         $requestBannerID $request->request->get("category-vertical-teaser-banner-id");
  999.         $banner = new Banner();
  1000.         if(!$requestBannerID) {
  1001.             $banner->setTypeID(Banner::TYPE_TEASER_VERTICAL_BANNER);
  1002.             $entityManager->persist($banner);
  1003.         } else {
  1004.             $banner $bannerRepository->find($requestBannerID);
  1005.             if(!$banner) {
  1006.                 $result['message'] = array(
  1007.                     'title' => 'Ошибка!',
  1008.                     'message' => 'Банер с id = ' $requestBannerID ' не существует!',
  1009.                     'type' => 'modal-danger'
  1010.                 );
  1011.                 return new Response(json_encode($result));
  1012.             }
  1013.         }
  1014.         $banner->setTitle($request->request->get("edit-category-vertical-teaser-banner-name"));
  1015.         $banner->setActive($request->request->get("edit-category-vertical-teaser-banner-active"false) !== false);
  1016.         $banner->setJavaScript($request->request->get("edit-category-vertical-teaser-banner-javascript"false) !== false);
  1017.         $banner->setCode($request->request->get("edit-category-vertical-teaser-banner-code"));
  1018.         $banner->setURL($request->request->get("edit-category-vertical-teaser-banner-link"""));
  1019.         $banner->setPositionRow((int)$request->request->get("edit-category-vertical-teaser-banner-row"));
  1020.         $banner->setPositionColumn((int)$request->request->get("edit-category-vertical-teaser-banner-column"));
  1021.         $requestBannerFilePath $request->request->get("edit-category-vertical-teaser-banner-banner-file-path"'');
  1022.         if($requestBannerFilePath != '') {
  1023.             $banner->setFilePath($requestBannerFilePath);
  1024.         }
  1025.         $requestBannerSubstitutePath $request->request->get("edit-category-vertical-teaser-banner-substitute-path"'');
  1026.         if($requestBannerSubstitutePath != '') {
  1027.             $banner->setSubstitutePath($requestBannerSubstitutePath);
  1028.         }
  1029.         $entityManager->flush();
  1030.         $bannerList = [$banner];
  1031.         $result['bannerID'] = $banner->getID();
  1032.         $result['bannerLine'] = $this->get('twig')->render('Slivki/admin/banners/vertical_teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
  1033.         foreach($banner->getCategories() as $category) {
  1034.             $entityManager->getRepository(Category::class)->scheduleCategoryReload($category->getID());
  1035.         }
  1036.         return new Response(json_encode($result));
  1037.     }
  1038.     /**
  1039.      * @Route("/admin/site_settings")
  1040.      */
  1041.     public function ajaxSiteSettings(){
  1042.         return $this->render('Slivki/admin/site_settings/edit_site_settings.html.twig');
  1043.     }
  1044.     public function sendCommentBonusMessage(Mailer $mailerValidatorInterface $validatorComment $comment) {
  1045.         $user $comment->getUser();
  1046.         $emailConstraint = new EmailConstraint();
  1047.         $emailConstraint->message 'Invalid email';
  1048.         if (!$user->getEmail()) {
  1049.             return false;
  1050.         }
  1051.         $to trim($user->getEmail());
  1052.         if ($to == '' || $validator->validate($to$emailConstraint) != '') {
  1053.             return false;
  1054.         }
  1055.         $entityManager $this->getDoctrine()->getManager();
  1056.         $balanceActivity $entityManager->getRepository(UserBalanceActivity::class)->findByEntityID($comment->getID());
  1057.         if (!$balanceActivity || count($balanceActivity) == 0) {
  1058.             return;
  1059.         }
  1060.         $data['balanceActivity'] = $balanceActivity[0];
  1061.         $data['offer'] = $entityManager->find(Offer::class, $comment->getEntityID());
  1062.         if (!$data['offer']) {
  1063.             return false;
  1064.         }
  1065.         $message $mailer->createMessage();
  1066.         $message->setSubject("Поздравляем! Вам зачислен Бонус!")
  1067.             ->setFrom("info@slivki.by"'Slivki.by')
  1068.             ->setTo($to)
  1069.             ->setBody(
  1070.                 $this->renderView(
  1071.                     'Slivki/emails/bonus/comment_bonus.html.twig',
  1072.                     $data
  1073.                 ),
  1074.                 'text/html'
  1075.             );
  1076.         $mailer->send($message);
  1077.     }
  1078.     /**
  1079.      * @Route("/admin/site_settings/edit_confirm")
  1080.      */
  1081.     public function ajaxEditConfirm(Request $request){
  1082.         if (!$request->isXmlHttpRequest()) {
  1083.             return $this->redirect("/admin");
  1084.         }
  1085.         $message $this->validateSiteSettings($request);
  1086.         if (!$message) {
  1087.             $siteSettings $this->getSiteSettings();
  1088.             /** @var SiteSettings $siteSettings */
  1089.             $siteSettings $this->getDoctrine()->getManager('admin')->getRepository(SiteSettings::class)->find($siteSettings->getID());
  1090.             $codeCost str_replace(',''.'$request->request->get('edit-code-cost'));
  1091.             if ($codeCost) {
  1092.                 $siteSettings->setCodeCost($codeCost);
  1093.             }
  1094.             $regionsCodeCost $request->request->get('editRegionsCodeCost''');
  1095.             $siteSettings->setRegionsCodeCost((float)str_replace(',''.'$regionsCodeCost));
  1096.             $rateHomePhoneText $request->request->get('edit-rate-home-phone-text');
  1097.             if ($rateHomePhoneText) {
  1098.                 $siteSettings->setRateHomePhoneText($rateHomePhoneText);
  1099.             }
  1100.             $rateMobilePhoneText $request->request->get('edit-rate-mobile-phone-text');
  1101.             if ($rateMobilePhoneText) {
  1102.                 $siteSettings->setRateMobilePhoneText($rateMobilePhoneText);
  1103.             }
  1104.             $commentBoughtBonus str_replace(',''.'$request->request->get('edit-comment-bought-bonus'));
  1105.             if ($commentBoughtBonus) {
  1106.                 $siteSettings->setCommentBoughtBonus($commentBoughtBonus);
  1107.             }
  1108.             $replishmentBonus str_replace(',''.'$request->request->get('edit-replenishment-bonus'));
  1109.             if ($replishmentBonus) {
  1110.                 $siteSettings->setReplenishmentBonus($replishmentBonus);
  1111.             }
  1112.             $replishmentBonus str_replace(',''.'$request->request->get('edit-replenishment-bonus1'));
  1113.             if ($replishmentBonus) {
  1114.                 $siteSettings->setReplenishmentBonus1($replishmentBonus);
  1115.             }
  1116.             $replenishmentBonus2 = \str_replace(',''.'$request->request->get('replenishmentBonus2'0));
  1117.             $siteSettings->setReplenishmentBonus2((float) $replenishmentBonus2);
  1118.             $replishmentBonus str_replace(',''.'$request->request->get('edit-replenishment-bonus3'));
  1119.             if ($replishmentBonus) {
  1120.                 $siteSettings->setReplenishmentBonus3($replishmentBonus);
  1121.             }
  1122.             $replishmentBonus str_replace(',''.'$request->request->get('edit-replenishment-bonus4'));
  1123.             if ($replishmentBonus) {
  1124.                 $siteSettings->setReplenishmentBonus4($replishmentBonus);
  1125.             }
  1126.             $defaultBalanceRepl str_replace(',''.'$request->request->get('edit-default-balance-repl'));
  1127.             if ($defaultBalanceRepl) {
  1128.                 $siteSettings->setDefaultBalanceReplenishment($defaultBalanceRepl);
  1129.             }
  1130.             $defaultBalanceReplCall str_replace(',''.'$request->request->get('edit-default-balance-repl-call'));
  1131.             if (\strlen(\trim($defaultBalanceReplCall)) !== 0) {
  1132.                 $siteSettings->setdefaultBalanceReplenishmentCall($defaultBalanceReplCall);
  1133.             }
  1134.             $promisedPaymentLimit = \str_replace(',''.'$request->request->get('promisedPaymentLimit'0));
  1135.             $siteSettings->setPromisedPaymentLimit((float) $promisedPaymentLimit);
  1136.             $monthlyCodeCount $request->request->get('edit-monthly-code-count');
  1137.             if ($monthlyCodeCount) {
  1138.                 $siteSettings->setMonthlyCodeCount($monthlyCodeCount);
  1139.             }
  1140.             $avatarBonus str_replace(',''.'$request->request->get('edit-avatar-bonus'));
  1141.             if ($avatarBonus) {
  1142.                 $siteSettings->setAvatarBonus($avatarBonus);
  1143.             }
  1144.             $monthlyBonus str_replace(',''.'$request->request->get('edit-monthly-bonus'));
  1145.             if ($monthlyBonus) {
  1146.                 $siteSettings->setMonthlyBonus($monthlyBonus);
  1147.             }
  1148.             $registerBonus str_replace(',''.'$request->request->get('edit-registration-bonus'));
  1149.             if ($registerBonus) {
  1150.                 $siteSettings->setRegistrationBonus($registerBonus);
  1151.             }
  1152.             $commentBonus str_replace(',''.'$request->request->get('edit-comment-bonus'));
  1153.             if ($commentBonus) {
  1154.                 $siteSettings->setCommentBonus($commentBonus);
  1155.             }
  1156.             $commentPhotoBonus str_replace(',''.'$request->request->get('edit-comment-photo-bonus'));
  1157.             if ($commentPhotoBonus) {
  1158.                 $siteSettings->setCommentPhotoBonus($commentPhotoBonus);
  1159.             }
  1160.             $mediaKitManager $request->request->get('edit-mediakit-manager');
  1161.             if ($mediaKitManager) {
  1162.                 $siteSettings->setMediaKitManager($mediaKitManager);
  1163.             }
  1164.             $mediaKitPhone $request->request->get('edit-mediakit-phone');
  1165.             if ($mediaKitPhone) {
  1166.                 $siteSettings->setMediaKitPhone($mediaKitPhone);
  1167.             }
  1168.             $subscriptionFirstPayment $request->request->get('subscriptionFirstPayment');
  1169.             if (!$subscriptionFirstPayment) {
  1170.                 $subscriptionFirstPayment 0;
  1171.             } else {
  1172.                 $subscriptionFirstPayment str_replace(',''.'$subscriptionFirstPayment);
  1173.             }
  1174.             $siteSettings->setSubscriptionFirstPayment($subscriptionFirstPayment);
  1175.             $subscriptionCodeActivePeriodInDays $request->request->getInt('subscriptionCodeActivePeriodInDays');
  1176.             $siteSettings->setSubscriptionCodeActivePeriodInDays(=== $subscriptionCodeActivePeriodInDays null $subscriptionCodeActivePeriodInDays);
  1177.             $subscriptionPrice $request->request->get('subscriptionPrice');
  1178.             if (!$subscriptionPrice) {
  1179.                 $subscriptionPrice 0;
  1180.             } else {
  1181.                 $subscriptionPrice str_replace(',''.'$subscriptionPrice);
  1182.             }
  1183.             $siteSettings->setSubscriptionPrice($subscriptionPrice);
  1184.             $cashBack str_replace(',''.'$request->request->get('cashBack'));
  1185.             $siteSettings->setCashBackBonus($cashBack);
  1186.             $siteSettings->setMainPagePromoText($request->request->get('edit-main-page-text'));
  1187.             $siteSettings->setReferralBonus(str_replace(',''.'$request->request->get('referralBonus')));
  1188.             $mobAppLoginBonus str_replace(',''.'$request->request->get('mobAppLoginBonus'''));
  1189.             if ($mobAppLoginBonus == '') {
  1190.                 $mobAppLoginBonus 0;
  1191.             }
  1192.             $siteSettings->setMobAppLoginBonus($mobAppLoginBonus);
  1193.             $siteSettings->setMobileApplicationVersion($request->request->get('mobileApplicationVersion'''));
  1194.             $siteSettings->setMobileApplicationLockVersion($request->request->get('mobileApplicationLockVersion'''));
  1195.             $this->getDoctrine()->getManager('admin')->flush($siteSettings);
  1196.             if($this->getSiteSettingsRepository()->setSiteSettingsToCache($siteSettings)) {
  1197.                 $message['message'] = array(
  1198.                     "title" => "Успех!",
  1199.                     "message" => "Настройки успешно сохранены!",
  1200.                     "type" => "modal-success"
  1201.                 );
  1202.             } else {
  1203.                 $message['message'] = array(
  1204.                     "title" => "Ошибка!",
  1205.                     "message" => "Изменения не удалось сохранить!",
  1206.                     "type" => "modal-danger"
  1207.                 );
  1208.             }
  1209.         }
  1210.         return new JsonResponse(json_encode($message));
  1211.     }
  1212.     private function validateSiteSettings(Request $request){
  1213.         return false;
  1214.         $settings $request->request->all();
  1215.         $message "";
  1216.         foreach ($settings as $field => $value){
  1217.             if($value && (!is_numeric($value) && ($field != "edit-rate-home-phone-text" && $field != "edit-rate-mobile-phone-text"))){
  1218.                 $message['message'] = array(
  1219.                     "title" => "Ошибка!",
  1220.                     "message" => "Неправильно заполнено одно из полей!",
  1221.                     "type" => "modal-danger"
  1222.                 );
  1223.             };
  1224.         }
  1225.         return $message;
  1226.     }
  1227.     private function validateCategoryVerticalTeaserBannerForm(Request $request) {
  1228.         $errorMessage '';
  1229.         if($request->request->get('edit-category-vertical-teaser-banner-name') == '') {
  1230.             $errorMessage .= 'Введите название!<br>';
  1231.         }
  1232.         if($errorMessage != '') {
  1233.             $result = array(
  1234.                 'title' => 'Ошибка!',
  1235.                 'message' => $errorMessage,
  1236.                 'type' => 'modal-danger'
  1237.             );
  1238.             return $result;
  1239.         }
  1240.         return true;
  1241.     }
  1242.     /**
  1243.      * @return \Slivki\Repository\SaleRepository
  1244.      */
  1245.     protected function getSaleRepository() {
  1246.         return $this->getDoctrine()->getManager('admin')->getRepository(Sale::class);
  1247.     }
  1248.     /**
  1249.      * @return \Slivki\Repository\OfferRepository
  1250.      */
  1251.     protected function getOfferRepository() {
  1252.         return $this->getDoctrine()->getManager('admin')->getRepository(Offer::class);
  1253.     }
  1254.     protected function logOperatorAction($request$entityID$description$type) {
  1255.         $entityManager $this->getDoctrine()->getManager('admin');
  1256.         $actionLog = new OperatorActionLog();
  1257.         $actionLog->setEntityID($entityID);
  1258.         $actionLog->setOperatorID($this->getUser()->getID());
  1259.         $actionLog->setType($type);
  1260.         $actionLog->setDescription($description);
  1261.         $actionLog->setIpAddress($request->getClientIp());
  1262.         $actionLog->setBrowser($request->headers->get('user-agent'));
  1263.         $entityManager->persist($actionLog);
  1264.         $entityManager->flush($actionLog);
  1265.     }
  1266.     /**
  1267.      * @Route("/admin/category/category-tree/{domainObjectID}/{cityID}/{parentCategoryID}")
  1268.      */
  1269.     public function categoryTreeAction($domainObjectID$cityID$parentCategoryID) {
  1270.         $data['categories'] = $this->getCategoryRepository()->getCategoryTree($domainObjectID0$cityID);
  1271.         $result['html'] = $this->get('twig')->render('Slivki/admin/categories/recursive_category_with_checkboxes_macro.html.twig'$data);
  1272.         $result['parentCategoryURL'] = $this->getSeoRepository()->getCategoryURL($this->getCategoryRepository()->find($parentCategoryID));
  1273.         return new JsonResponse($result);
  1274.     }
  1275.     public function getGeoLocationList($entity) {
  1276.         return $this->get('twig')->render('Slivki/admin/offers/geo_location_item.html.twig', array('geoLocations' => $entity->getGeoLocations()));
  1277.     }
  1278.     protected function saveMedia(
  1279.         ImageService $imageService,
  1280.         $entityID$mediaType,
  1281.         $mediaPath$fileName,
  1282.         $sortOrder null,
  1283.         $multiple false,
  1284.         bool $isVideo false
  1285.     ) {
  1286.         $entityManager $this->getEntityManager();
  1287.         $mediaRepository $entityManager->getRepository(Media::class);
  1288.         $mediaTypeRepository $entityManager->getRepository(MediaType::class);
  1289.         $media $mediaRepository->findOneBy(['entityID' => $entityID'mediaType' => $mediaType]);
  1290.         if (!$media || $multiple) {
  1291.             $media = new Media();
  1292.             $media->setEntityID($entityID);
  1293.             $media->setMediaType($mediaTypeRepository->find($mediaType));
  1294.             $entityManager->persist($media);
  1295.         }
  1296.         $media->setPath($mediaPath);
  1297.         $media->setName($fileName);
  1298.         if ($sortOrder) {
  1299.             $media->setSortOrder($sortOrder);
  1300.         }
  1301.         $media->setTypeID($mediaType);
  1302.         $entityManager->flush($media);
  1303.         if ($isVideo) {
  1304.             $media->setYoutube(true);
  1305.         }
  1306.         $mediaSizeList $media->getSizes();
  1307.         foreach ($mediaSizeList->toArray() as $mediaSize) {
  1308.             $imageService->resizeImage($media$mediaSize->getWidth(), $mediaSize->getHeight());
  1309.         }
  1310.     }
  1311.     /** @Route("/admin/save-special-mailing/{direction}") */
  1312.     public function saveSpecialMailing(KernelInterface $kernel$direction) {
  1313.         $filePath $kernel->getProjectDir() . '/etc/slivki-cache/mailing.html';
  1314.         $entityManager $this->getDoctrine()->getManager('admin');
  1315.         $specialMailing $entityManager->find(MailingCampaign::class, 376);
  1316.         if ($direction == 'out') {
  1317.             file_put_contents($filePath$specialMailing->getMailBody());
  1318.         } else if ($direction == 'in') {
  1319.             $specialMailing->setMailBody(file_get_contents($filePath));
  1320.             $entityManager->flush($specialMailing);
  1321.         }
  1322.         return new Response();
  1323.     }
  1324.     /** @return \Doctrine\Orm\EntityManager */
  1325.     protected function getEntityManager() {
  1326.         return $this->getDoctrine()->getManager('admin');
  1327.     }
  1328.     protected function getUserRepository(): UserRepository
  1329.     {
  1330.         return $this->getDoctrine()->getRepository(User::class, 'admin');
  1331.     }
  1332.     public function setImageRatio(KernelInterface $kernel$description) {
  1333.         if (trim($description) == '') {
  1334.             return '';
  1335.         }
  1336.         $html = new Crawler();
  1337.         $html->addHtmlContent($description);
  1338.         $nodeList $html->filter('img');
  1339.         if (!empty($nodeList)) {
  1340.             $nodeList->each(function (Crawler $node) use ($kernel) {
  1341.                 $nodeElem $node->getNode(0);
  1342.                 $source parse_url($nodeElem->getAttribute('src'));
  1343.                 if (isset($source['path'])) {
  1344.                     $imagePath $kernel->getProjectDir() . '/public' $source['path'];
  1345.                     $imageSize = @getimagesize($imagePath);
  1346.                     $nodeElemWidth $nodeElem->getAttribute('width');
  1347.                     if ($nodeElemWidth == '') {
  1348.                         $nodeElem->setAttribute('width'$imageSize[0]);
  1349.                     }
  1350.                     if ($imageSize) {
  1351.                         $nodeElem->setAttribute('data-ratio'round(100 $imageSize[1]/$imageSize[0], 2));
  1352.                     }
  1353.                 }
  1354.             });
  1355.         }
  1356.         $result str_replace('<body>'''$html->html());
  1357.         $result str_replace('</body>'''$result);
  1358.         return $result;
  1359.     }
  1360.     /** @Route("/admin/upload-image") */
  1361.     public function uploadImageAction(Request $requestKernelInterface $kernel) {
  1362.         if (!$request->isMethod('POST')) {
  1363.             return $this->redirect("/admin");
  1364.         }
  1365.         $initialMediaPath $kernel->getProjectDir() . '/public' ImageService::MEDIA_ROOT ImageService::INITIAL_PATH;
  1366.         $fileInputName $request->request->get('fileInputName');
  1367.         $filePath $request->request->get('filePath');
  1368.         $uploadedFile $request->files->get($fileInputName);
  1369.         $realFilePath $initialMediaPath $filePath;
  1370.         $fs = new Filesystem();
  1371.         $fileName $uploadedFile->getClientOriginalName();
  1372.         while ($fs->exists($realFilePath $fileName)) {
  1373.             $fileName time() . '_' $fileName;
  1374.         }
  1375.         $uploadedFile->move($realFilePath$fileName);
  1376.         $selection $request->request->get('selection');
  1377.         if ($selection) {
  1378.             $selection json_decode($selection);
  1379.             $this->cropImage($realFilePath $fileName$selection);
  1380.         }
  1381.         return new Response(json_encode([
  1382.             'imageURL' => ImageService::MEDIA_ROOT ImageService::INITIAL_PATH $filePath $fileName,
  1383.             'imageName' => $fileName
  1384.         ]));
  1385.     }
  1386.     public function cropImage($filePath$selection) {
  1387.         $x $selection->$selection->0;
  1388.         $y $selection->$selection->0;
  1389.         $imagine = new Imagine();
  1390.         $image $imagine->open($filePath);
  1391.         $image->crop(new Point($x$y), new Box($selection->width$selection->height));
  1392.         $image->save($filePath);
  1393.     }
  1394. }