<?php
namespace Slivki\Controller\Admin;
use Imagine\Gd\Imagine;
use Imagine\Image\Box;
use Imagine\Image\Point;
use League\Period\Period;
use Slivki\Dao\Statistic\VirtualWallet\VirtualWalletDaoInterface;
use Slivki\Dbal\Category\CategoryDbalInterface;
use Slivki\Entity\AbstractOrderBase;
use Slivki\Entity\AdSlot;
use Slivki\Entity\CategoryType;
use Slivki\Entity\CityArea;
use Slivki\Entity\MailingCampaign;
use Slivki\Entity\Sale;
use Slivki\Entity\SiteSettings;
use Slivki\Entity\User;
use Slivki\Entity\UserBalanceActivity;
use Slivki\Entity\UserGroup;
use Slivki\Repository\Category\Admin\CategoryChildRelationRepositoryInterface;
use Slivki\Repository\GiftCertificate\GiftCertificateGroup\Admin\GiftCertificateGroupRepositoryInterface;
use Slivki\Repository\GiftCertificateCategory\Admin\GiftCertificateCategoryRepositoryInterface;
use Slivki\Repository\GiftCertificateGiftCategory\Admin\GiftCertificateGiftCategoryRepositoryInterface;
use Slivki\Repository\UserRepository;
use Slivki\Services\CategoryBoxCacheService;
use Slivki\Services\StatService;
use Symfony\Component\Routing\Annotation\Route;
use Slivki\Controller\SiteController;
use Slivki\Entity\Banner;
use Slivki\Entity\Category;
use Slivki\Entity\City;
use Slivki\Entity\Comment;
use Slivki\Entity\HotFeed;
use Slivki\Services\ImageService;
use Slivki\Services\Mailer;
use Symfony\Component\Filesystem\Filesystem;
use Slivki\Entity\MainMenu;
use Slivki\Entity\Media;
use Slivki\Entity\MediaType;
use Slivki\Entity\OperatorActionLog;
use Slivki\Entity\Seo;
use Slivki\Entity\Offer;
use Slivki\Repository\SeoRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class AdminController extends SiteController
{
private const DEFAULT_CATEGORY_SORT_ORDER = 9999;
/**
* @Route("/admin/ajax_check_version")
*/
public function ajaxCheckVersionAction() {
$twigGlobals = $this->get('twig')->getGlobals();
return new Response($twigGlobals['version']);
}
/** @Route("/admin/dashboard") */
public function ajaxDashboardAction(
Request $request,
StatService $statService,
VirtualWalletDaoInterface $virtualWalletDao
): Response {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$entityManager = $this->getEntityManager();
$connection = $entityManager->getConnection();
$requestDateFrom = $request->request->get('dashboardDateFrom');
$requestDateTo = $request->request->get('dashboardDateTo');
$dateFrom = $requestDateFrom ? (new \DateTime())->setTimestamp(strtotime($requestDateFrom)) : (new \DateTime())->setTime(0, 0, 0);
$dateTo = $requestDateTo ? (new \DateTime())->setTimestamp(strtotime($requestDateTo)) : (new \DateTime())->setTime(0, 0, 0);
$dateTo->add(new \DateInterval('P1D'));
$from = $dateFrom->format('Y-m-d 00:00:00');
$to = $dateTo->format('Y-m-d 00:00:00');
$period = new \DatePeriod($dateFrom, \DateInterval::createFromDateString('+1 day'), $dateTo);
$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 = "
. AbstractOrderBase::STATUS_BALANCE_CONFIRM . ' group by 1';
$balanceReplenishmentChartData = $this->getChartData($period, $connection->executeQuery($sql)->fetchAll());
$dateTo->sub(new \DateInterval('P1D'));
$codesCountByDatesStat = $statService->getCodesCountByDates($dateFrom, $dateTo);
$codesChartData = [
'x' => [],
'total' => [],
'free' => [],
'online' => [],
'balance' => [],
];
$appCodesChartData = $codesChartData;
foreach ($codesCountByDatesStat as $key => $item) {
if ($key == 'aggregate') {
continue;
}
$codesChartData['x'][] = $key;
$codesChartData['total'][] = $item['total']['total'];
$codesChartData['balance'][] = $item['total']['balance'];
$codesChartData['free'][] = $item['total']['free'];
$codesChartData['online'][] = $item['total']['online'];
$appCodesChartData['x'][] = $key;
$appCodesChartData['total'][] = $item['app']['total'];
$appCodesChartData['balance'][] = $item['app']['balance'];
$appCodesChartData['free'][] = $item['app']['free'];
$appCodesChartData['online'][] = $item['app']['online'];
}
return $this->render('Slivki/admin/dashboard/index.html.twig', [
'dateFrom' => $dateFrom,
'dateTo' => $dateTo,
'balanceReplenishmentChartData' => $balanceReplenishmentChartData,
'virtualWalletChartData' => $this->getChartData($period, $virtualWalletDao->getChartData(
Period::fromDatePeriod($period)
)),
'codesCountByDatesStat' => $codesCountByDatesStat,
'codesChartData' => $codesChartData,
'appCodesChartData' => $appCodesChartData,
'codesByDevicesChartData' => [
$codesCountByDatesStat['aggregate']['desktop']['total'],
$codesCountByDatesStat['aggregate']['mobile']['total'],
$codesCountByDatesStat['aggregate']['app']['total']
],
'codesByDevicesFreeChartData' => [
$codesCountByDatesStat['aggregate']['desktop']['free'],
$codesCountByDatesStat['aggregate']['desktop']['total'] - $codesCountByDatesStat['aggregate']['desktop']['free'],
$codesCountByDatesStat['aggregate']['mobile']['free'],
$codesCountByDatesStat['aggregate']['mobile']['total'] - $codesCountByDatesStat['aggregate']['mobile']['free'],
$codesCountByDatesStat['aggregate']['app']['free'],
$codesCountByDatesStat['aggregate']['app']['total'] - $codesCountByDatesStat['aggregate']['app']['free']
],
'codesByTypesChartData' => [
$codesCountByDatesStat['aggregate']['total']['balance'],
$codesCountByDatesStat['aggregate']['total']['free'],
$codesCountByDatesStat['aggregate']['total']['online']
]
]);
}
private function getChartData($period, $data): array
{
$chartData = ['x' => [], 'y' => []];
$dataByX = [];
foreach ($data as $item) {
$dataByX[$item['x']] = $item['y'];
}
/** @var \DateTime $tick */
foreach ($period as $tick) {
$chartData['x'][] = $tick->format('d.m.Y');
if (isset($dataByX[$tick->format('Y-m-d')])) {
$chartData['y'][] = $dataByX[$tick->format('Y-m-d')];
} else {
$chartData['y'][] = 0;
}
}
return $chartData;
}
/**
* @Route("/admin/offer/descriptions/{offerID}/{descriptionType}")
*/
public function descriptionsAction($offerID, $descriptionType) {
$entityManager = $this->getDoctrine()->getManager('admin');
$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";
return new Response('<textarea>'.$entityManager->getConnection()->executeQuery($sql)->fetchColumn().'</textarea>');
}
/**
* @Route("/admin")
*/
public function adminAction(
GiftCertificateCategoryRepositoryInterface $giftCertificateCategoryRepository,
GiftCertificateGroupRepositoryInterface $giftCertificateGroupRepository,
GiftCertificateGiftCategoryRepositoryInterface $giftCertificateGiftCategoryRepository
) {
ini_set('memory_limit', '1g');
ini_set('max_execution_time', 240);
$entityManager = $this->getEntityManager();
$categoryRepository = $entityManager->getRepository(Category::class);
return $this->render('Slivki/admin/index.html.twig', [
'managerList' => $entityManager->getRepository(UserGroup::class)->findOneByName('MANAGER')->getUsers(),
'cityAreaList' => $entityManager->getRepository(CityArea::class)->findBy([], ['name' => 'ASC']),
'priceCategoriesDefault' => $categoryRepository->findBy(['domainObjectID' => Category::PRICE_CATEGORY_ID, 'typeID' => Category::DEFAULT_PRICE_CATEGORY_TYPE], ['sortOrder' => 'ASC']),
'priceCategoriesTourism' => $categoryRepository->findBy(['domainObjectID' => Category::PRICE_CATEGORY_ID, 'typeID' => Category::TOURISM_PRICE_CATEGORY_TYPE], ['sortOrder' => 'ASC']),
'genderCategories' => $categoryRepository->findBy(['domainObjectID' => Category::GENDER_CATEGORY_ID], ['sortOrder' => 'ASC']),
'tourismTourTypes' => $categoryRepository->findBy(['domainObjectID' => Category::TOUR_TYPE_CATEGORY_ID], ['sortOrder' => 'ASC']),
'tourismTransportType' => $categoryRepository->findBy(['domainObjectID' => Category::TRANSPORT_TYPE_CATEGORY_ID], ['sortOrder' => 'ASC']),
]);
}
/**
* @Route("/admin/category/ajax_get_category")
*/
public function ajaxGetCategoryAction(
Request $request,
ImageService $imageService,
CategoryChildRelationRepositoryInterface $categoryChildRelationRepository
) {
ini_set('memory_limit', '256m');
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$entityManager = $this->getDoctrine()->getManager("admin");
$categoryID = $request->request->get('categoryID');
$categoryRepository = $entityManager->getRepository(Category::class);
/** @var Category $category */
$category = $categoryRepository->find($categoryID);
$categoryType = $category->getCategoryType() ? $category->getCategoryType()->getID() : Category::DEFAULT_CATEGORY_TYPE;
$seoRepository = $entityManager->getRepository(Seo::class);
$requestDomainObjectID = $request->request->get('domainObjectID');
$resourceURL = 'Slivki:Default:category';
$mainMenuType = null;
$cityID = $category->getCity() ? $category->getCity()->getID() : City::DEFAULT_CITY_ID;
switch($requestDomainObjectID) {
case Category::OFFER_CATEGORY_ID:
$resourceURL = 'Slivki:Default:category';
$mainMenuType = MainMenu::TYPE_OFFER_CATEGORY;
$selectedCategoryIDList = [];
foreach ($category->getParentCategories() as $parentCategory) {
$selectedCategoryIDList[] = $parentCategory->getID();
}
$data['categories'] = $categoryRepository->getCategoryTree(Category::OFFER_CATEGORY_ID, 0, $cityID);
$data['selectedCategoryIDList'] = $selectedCategoryIDList;
$result['parentCategories'] = $this->get('twig')->render('Slivki/admin/categories/recursive_category_with_checkboxes_macro.html.twig', $data);
$result['selectedParentCategories'] = $this->get('twig')->render('Slivki/admin/categories/selected_parent_categories.html.twig', ['selectedCategoryList' => $category->getParentCategories()]);
$result['categoryChildRelation'] = $categoryChildRelationRepository->findByChildId($categoryID);
break;
case Category::SALE_CATEGORY_ID:
$resourceURL = 'Slivki:Sale:category';
$mainMenuType = MainMenu::TYPE_SALE_CATEGORY;
$selectedCategoryIDList = [];
foreach ($category->getParentCategories() as $parentCategory) {
$selectedCategoryIDList[] = $parentCategory->getID();
}
$data['categories'] = $categoryRepository->getCategoryTree(Category::SALE_CATEGORY_ID);
$data['selectedCategoryIDList'] = $selectedCategoryIDList;
$result['parentCategories'] = $this->get('twig')->render('Slivki/admin/categories/recursive_category_with_checkboxes_macro.html.twig', $data);
break;
case Category::DISCOUNT_CARD_CATEGORY_ID:
$resourceURL = 'Slivki:DiscountCard:category';
break;
}
if($mainMenuType) {
$isCategoryInMainMenu = $entityManager->getRepository(MainMenu::class)->findOneBy(['entityID' => $categoryID, 'type' => $mainMenuType]);
}
$result['isCategoryInMainMenu'] = $isCategoryInMainMenu instanceof MainMenu;
$alias = $seoRepository->findBy(array('entityID' => $categoryID, 'resourceURL' => $resourceURL), array('ID' => 'DESC'), 1);
$result['category'] = $category;
$result['lastModified'] = $category->getLastModified()->format('Y-m-d H:i:s');
$result['categoryType'] = $categoryType;
$result['categoryBanner'] = $this->get('twig')->render('Slivki/admin/banners/list.html.twig', ['bannerList' => $category->getBannersByType(Banner::TYPE_CATEGORY_BANNER)]);
$adSlotRepository = $entityManager->getRepository(AdSlot::class);
$result['categoryBannersAdSlot'][1]['usedAdSlot'] = $category->getCountActiveBannersByType(Banner::TYPE_CATEGORY_BANNER);
$adSlotObjects = $adSlotRepository->findBy(['bannerTypeID' => 1, 'categoryID' => $categoryID]);
if (!empty($adSlotObjects)) {
$result['categoryBannersAdSlot'][1]['activeAdSlot'] = $adSlotObjects[0]->getActiveAdSlot();
} else {
$result['categoryBannersAdSlot'][1]['activeAdSlot'] = 0;
}
$result['verticalTeaserBanner'] = $this->get('twig')->render('Slivki/admin/banners/vertical_teaser_banner/list.html.twig', ['bannerList' => $category->getBannersByType(Banner::TYPE_TEASER_VERTICAL_BANNER)]);
$result['categoryBannersAdSlot'][2]['usedAdSlot'] = $category->getCountActiveBannersByType(Banner::TYPE_TEASER_BANNER);
$adSlotObjects = $adSlotRepository->findBy(['bannerTypeID' => 2, 'categoryID' => $categoryID]);
if (!empty($adSlotObjects)) {
$result['categoryBannersAdSlot'][2]['activeAdSlot'] = $adSlotObjects[0]->getActiveAdSlot();
} else {
$result['categoryBannersAdSlot'][2]['activeAdSlot'] = 0;
}
$result['teaserBanner'] = $this->get('twig')->render('Slivki/admin/banners/teaser_banner/list.html.twig', ['bannerList' => $category->getBannersByType(Banner::TYPE_TEASER_BANNER)]);
$result['categoryBannersAdSlot'][3]['usedAdSlot'] = $category->getCountActiveBannersByType(Banner::TYPE_TEASER_BANNER);
$adSlotObjects = $adSlotRepository->findBy(['bannerTypeID' => 3, 'categoryID' => $categoryID]);
if (!empty($adSlotObjects)) {
$result['categoryBannersAdSlot'][3]['activeAdSlot'] = $adSlotObjects[0]->getActiveAdSlot();
} else {
$result['categoryBannersAdSlot'][3]['activeAdSlot'] = 0;
}
if($alias) {
$alias = $alias[0];
$result['alias'] = $alias->getMainAlias();
$result['metaTitle'] = $alias->getMetaTitle();
$result['metaDescription'] = $alias->getMetaDescription();
$result['metaKeywords'] = $alias->getMetaKeywords();
}
$commentAlias = $seoRepository->getByEntity(SeoRepository::RESOURCE_URL_CATEGORY_COMMENTS, $categoryID);
if ($commentAlias) {
$result['commentALias']['alias']= $commentAlias->getMainAlias();
$result['commentALias']['metaTitle'] = $commentAlias->getMetaTitle();
$result['commentALias']['metaDescription'] = $commentAlias->getMetaDescription();
$result['commentALias']['metaKeywords'] = $commentAlias->getMetaKeywords();
}
$landingImage = $entityManager->getRepository(Media::class)->getСategoryLandingImageMedia($categoryID);
$result['landingImage'] = $landingImage ? $imageService->getImageURL($landingImage, 0, 0) : '';
$hotFeed = $entityManager->getRepository(HotFeed::class)->findBy(['entityTypeID' => Category::CATEGORY_ID, 'entityID' => $categoryID]);
if ($hotFeed) {
$result['hotFeed'] = true;
}
$hotFeedImage = $entityManager->getRepository(Media::class)->getСategoryHotFeedImageMedia($categoryID);
$hotFeedIcon = $entityManager->getRepository(Media::class)->getСategoryHotFeedIconMedia($categoryID);
$result['hotFeedImage'] = $hotFeedImage ? $imageService->getImageURL($hotFeedImage, 0, 0) : '';
$result['hotFeedIcon'] = $hotFeedIcon ? $imageService->getImageURL($hotFeedIcon, 0, 0) : '';
$mobileMenuIcon = $category->getMobileMenuIconMedia();
$result['mobileMenuIcon'] = $mobileMenuIcon ? $imageService->getImageURL($mobileMenuIcon, 0, 0) : '';
$appIcon = $category->getAppIconMedia();
$result['appIcon'] = $appIcon ? $imageService->getImageURL($appIcon, 0, 0) : '';
$mapPinIcon = $category->getMapPinIconMedia();
$result['mapPinIcon'] = $mapPinIcon ? $imageService->getImageURL($mapPinIcon, 0, 0) : '';
return new Response(json_encode($result));
}
/**
* @Route("/admin/category/ajax_add_category")
*/
public function ajaxAddCategoryAction(Request $request, ImageService $imageService, CategoryDbalInterface $categoryDbal) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$entityManager = $this->getDoctrine()->getManager("admin");
$categoryRepository = $entityManager->getRepository(Category::class);
$cityID = $request->request->get('edit-category-city-id', City::DEFAULT_CITY_ID);
if ($cityID == '') {
$cityID = City::DEFAULT_CITY_ID;
}
$city = $entityManager->getRepository(City::class)->find($cityID);
$category = new Category();
if ($city) {
$category->setCity($city);
}
$category->setName(trim($request->request->get('edit-category-name')));
$h1 = trim($request->request->get('editCategoryH1', ''));
$category->setH1($h1 == '' ? null : $h1);
$category->setSortOrder(
$request->request->getInt('edit-category-order') ?: self::DEFAULT_CATEGORY_SORT_ORDER
);
$category->setTelegramBotName(trim($request->request->get('editCategoryTelegramBotName')));
$category->setTelegramBotShow($request->request->getBoolean('editCategoryTelegramBotShow'));
$category->setPosition($request->request->getInt('editСategoryPosition'));
$category->setCode($request->request->get('edit-category-code'));
$category->setTopCount((int)$request->request->get('edit-category-tops'));
$category->setPast(false);
$category->setLastModified(new \DateTime());
$category->setInMenuBottom($request->request->has('inMenuBottom'));
$category->setUtmCampaign($request->request->get('editCategoryUtmCampaign'));
$category->setSplitOffersWithSameCategories($request->request->getInt('splitOffersWithSameCategories'));
$category->setUnpopular($request->request->has('unpopular'));
$category->setFeaturedInMenu($request->request->getBoolean('categoryFeaturedInMenu'));
$category->setShowItemsCatalog($request->request->getBoolean('showItemsCatalog'));
$category->setHideWorkExamples($request->request->getBoolean('hideWorkExamples'));
$category->setIsBonusCode($request->request->getBoolean('isBonusCode'));
$categoryTypeID = $request->request->getInt('edit-category-group');
$categoryType = $entityManager->find(CategoryType::class, $categoryTypeID);
if ($categoryType) {
$category->setCategoryType($categoryType);
}
if ($request->request->get('edit-category-active')) {
$category->setActive(true);
} else {
$category->setActive(false);
}
$category->setDescription($request->request->get('edit-category-description'));
$requestDomainObjectID = $request->request->get('edit-category-domain-object-id');
$category->setDomainObjectID($requestDomainObjectID);
$entityManager->persist($category);
$categoryDbal->updateChildBonusCodes($category->getID(), $category->isBonusCode());
$this->getCategoryRepository()->scheduleCategoryReload($category->getID());
$requestCategoryBannerList = $request->request->get('admin-category-banner-id', []);
foreach ($requestCategoryBannerList as $index => $bannerID) {
$banner = $entityManager->getRepository(Banner::class)->find($bannerID);
if($banner) {
if ($request->request->get('admin-category-banner-deleted')[$index] == "true") {
$category->deleteBanner($banner);
} else {
$category->addBanner($banner);
}
$entityManager->flush($banner);
}
}
$requestTeaserBannerList = $request->request->get('admin-teaser-banner-id', []);
foreach ($requestTeaserBannerList as $index => $bannerID) {
$banner = $entityManager->getRepository(Banner::class)->find($bannerID);
if($banner) {
if ($request->request->get('admin-teaser-banner-deleted')[$index] == "true") {
$category->deleteBanner($banner);
} else {
$category->addBanner($banner);
}
$entityManager->flush($banner);
}
}
$requestVerticalTeaserBannerList = $request->request->get('admin-vertical-teaser-banner-id', []);
foreach ($requestVerticalTeaserBannerList as $index => $bannerID) {
$banner = $entityManager->getRepository(Banner::class)->find($bannerID);
if($banner) {
if ($request->request->get('admin-vertical-teaser-banner-deleted')[$index] == "true") {
$category->deleteBanner($banner);
} else {
$category->addBanner($banner);
}
$entityManager->flush($banner);
}
}
$alias = new Seo();
$seoRepository = $entityManager->getRepository(Seo::class);
$requestAlias = $request->request->get('edit-category-alias');
if (trim($requestAlias) == '') {
$result = array(
'title' => 'Ошибка!',
'message' => 'Введите алиас',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
if ($requestAlias[0] != '/') {
$requestAlias = '/' . $requestAlias;
}
$alias->setMainAlias($requestAlias);
$alias->setEntityID($category->getID());
$alias->setActive(true);
$alias->setMetaTitle($request->request->get('edit-category-meta-title'));
$alias->setMetaDescription($request->request->get('edit-category-meta-description'));
$alias->setMetaKeywords($request->request->get('edit-category-meta-keywords'));
$alias->setDomain($city->getDomain());
switch($requestDomainObjectID) {
case Category::OFFER_CATEGORY_ID:
$alias->setResourceURL('Slivki:Default:category');
break;
case Category::SALE_CATEGORY_ID:
$alias->setResourceURL('Slivki:Sale:category');
break;
case Category::DISCOUNT_CARD_CATEGORY_ID:
$alias->setResourceURL('Slivki:DiscountCard:category');
break;
}
if (!$seoRepository->setAlias($alias)) {
$result = array(
'title' => 'Ошибка!',
'message' => 'Алиас ' . $requestAlias . ' уже существует!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
$parentCategoryIDList = $request->request->get('categories', []);
if (is_array($parentCategoryIDList)) {
foreach ($parentCategoryIDList as $parentCategoryID) {
$parentCategory = $categoryRepository->find($parentCategoryID);
if ($parentCategory->addSubCategory($category)) {
$entityManager->flush($parentCategory);
$this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
}
}
}
$category->setHotFeedName($request->request->get('edit-category-hot-feed-name'));
$entityManager->flush($category);
$entityManager->detach($category);
$seoRepository->setAlias($seoRepository->getCategoryCommentsSeo($category));
$data['categories'] = [];
if ($category->getParentCategories()->count() > 0) {
$data['categories'] = $categoryRepository->getCategoryTree($requestDomainObjectID, $parentCategory->getID());
} else {
$data['categories'] = $categoryRepository->getCategoryTree($requestDomainObjectID, 0, $cityID);
}
$newCategoryList = $this->get('twig')->render('Slivki/admin/categories/refresh_categories.html.twig', $data);
$result = array(
'title' => 'Успех!',
'message' => 'Раздел успешно добавлен!',
'type' => 'modal-success',
'newCategoryList' => $newCategoryList,
'newLastModified' => $category->getLastModified()->format('Y-m-d H:i:s')
);
if (!$category->getParentCategories()->count() == 0 && $category->isActive() && !$category->isPast() && $category->getDomainObjectID() == Category::OFFER_CATEGORY_ID) {
$this->getDoctrine()->getManager('admin')->getRepository(MainMenu::class)->addMenuItem($category->getID(), MainMenu::TYPE_OFFER_CATEGORY);
}
if ($category->isActive()) {
foreach ($parentCategoryIDList as $parentCategoryID) {
if ($parentCategoryID == Category::FLIER_SALE_CATEGORY_ID) {
$entityManager->getRepository(MainMenu::class)->addMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORY, MainMenu::MENU_ID_FLIER);
break;
}
}
}
$mediaTypeRepository = $entityManager->getRepository(MediaType::class);
$landingImage = $request->request->get('editCategoryLandingImage');
if ($landingImage) {
$this->saveMedia($imageService, $category->getID(),MediaType::TYPE_CATEGORY_LANDING_IMAGE_ID, MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH, $landingImage);
}
if ($request->request->get('edit-category-hot-feed') == 'on') {
$hotFeed = new HotFeed();
$hotFeed->setCreatedOn(new \DateTime());
$hotFeed->setEntityTypeID(Category::CATEGORY_ID);
$hotFeed->setEntityID($category->getID());
$hotFeed->setCityID($cityID);
$entityManager->persist($hotFeed);
$entityManager->flush($hotFeed);
}
$hotFeedImage = $request->request->get('editCategoryHotFeedImage');
if ($hotFeedImage) {
$this->saveMedia($imageService, $category->getID(),MediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_ID, MediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_PATH, $hotFeedImage);
}
$mapPinIcon = $request->request->get('editCategoryMapPinIcon');
if ($mapPinIcon) {
$category = $categoryRepository->findOneBy(['ID' => $category->getID()]);
$mapPinIconMedia = new Media\CategoryMapPinIconMedia();
$mapPinIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
$mapPinIconMedia->setCategory($category);
$mapPinIconMedia->setName($mapPinIcon);
$category->setMapPinIconMedia($mapPinIconMedia);
$entityManager->persist($mapPinIconMedia);
$entityManager->flush($mapPinIconMedia);
}
return new Response(json_encode($result));
}
/**
* @Route("/admin/category/ajax_edit_category")
*/
public function ajaxEditCategoryAction(
Request $request,
ImageService $imageService,
CategoryChildRelationRepositoryInterface $categoryChildRelationRepository,
CategoryDbalInterface $categoryDbal
) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
if($request->request->get('edit-category-name') == '') {
$result = array(
'title' => 'Ошибка!',
'message' => 'Введите название раздела!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
$entityManager = $this->getDoctrine()->getManager("admin");
$categoryRepository = $entityManager->getRepository(Category::class);
$mainMenuRepository = $entityManager->getRepository(MainMenu::class);
$requestCategoryID = (int)$request->request->get('edit-category-id');
/** @var Category $category */
$category = $categoryRepository->find($requestCategoryID);
if(!$category) {
$result = array(
'title' => 'Ошибка!',
'message' => 'Категории с ID = ' . $requestCategoryID . ' не существует!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
if (!$request->request->get('forceSave', false) && $category->getLastModified() > new \DateTime($request->request->get('edit-category-last-modified'))) {
return new Response(json_encode(['error' => 'categoryChanged']));
}
$parentCategoryIDList = $request->request->get('categories', []);
/** @var Category $parentCategory */
foreach ($category->getParentCategories() as $parentCategory) {
if (!in_array($parentCategory->getID(), $parentCategoryIDList)) {
$parentCategory->getSubCategories()->removeElement($category);
$parentCategory->setMobileApiHash(md5(time()));
$entityManager->flush($parentCategory);
$this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
if ($parentCategory->getID() == Category::FLIER_SALE_CATEGORY_ID && $category->isActive()) {//TODO: check $parentCategoryIDList
$entityManager->getRepository(MainMenu::class)->deleteMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORY, MainMenu::MENU_ID_FLIER);
}
}
}
if ($parentCategoryIDList) {
foreach ($parentCategoryIDList as $parentCategoryID) {
$parentCategory = $categoryRepository->find($parentCategoryID);
if ($parentCategory->addSubCategory($category)) {
$entityManager->flush($parentCategory);
$this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
}
}
}
$reloadMenuCache = false;
if ($category->getName() != $request->request->get('edit-category-name')) {
foreach ($category->getParentCategories() as $parentCategory) {
$parentCategory->setMobileApiHash(md5(time()));
$entityManager->flush($parentCategory);
$this->getCategoryRepository()->scheduleCategoryReload($parentCategory->getID());
}
if ($category->getDomainObjectID() != Category::OFFER_CATEGORY_ID) {
$reloadMenuCache = true;
}
}
$category->setName(trim($request->request->get('edit-category-name')));
$h1 = trim($request->request->get('editCategoryH1', ''));
$category->setH1($h1 == '' ? null : $h1);
$category->setLastModified(new \DateTime());
$category->setSortOrder(
$request->request->getInt('edit-category-order') ?: self::DEFAULT_CATEGORY_SORT_ORDER
);
$category->setTelegramBotName(trim($request->request->get('editCategoryTelegramBotName')));
$category->setTelegramBotShow($request->request->getBoolean('editCategoryTelegramBotShow'));
$category->setPosition($request->request->getInt('editСategoryPosition'));
$category->setCode($request->request->get('edit-category-code'));
$category->setTopCount((int)$request->request->get('edit-category-tops'));
$category->setInMenuBottom($request->request->has('inMenuBottom'));
$category->setUtmCampaign($request->request->get('editCategoryUtmCampaign'));
$category->setSplitOffersWithSameCategories($request->request->getInt('splitOffersWithSameCategories'));
$category->setUnpopular($request->request->has('unpopular'));
$category->setFeaturedInMenu($request->request->getBoolean('categoryFeaturedInMenu'));
$category->setShowItemsCatalog($request->request->getBoolean('showItemsCatalog'));
$category->setHideWorkExamples($request->request->getBoolean('hideWorkExamples'));
$category->setIsBonusCode($request->request->getBoolean('isBonusCode'));
$categoryDbal->updateChildBonusCodes($category->getID(), $category->isBonusCode());
$category->setMapPinColor($request->request->get('editCategoryMapPinColor'));
$categoryType = $entityManager->find(CategoryType::class, (int)$request->request->get('edit-category-group'));
if ($categoryType) {
$category->setCategoryType($categoryType);
}
$categoryParentRelations = $categoryChildRelationRepository->findByChildId($requestCategoryID);
$endOfBlockParentCategoryIds = (array) $request->request->get('endOfBlock', []);
foreach ($categoryParentRelations as $categoryParentRelation) {
if (!$categoryParentRelation->isEndOfBlock() && in_array($categoryParentRelation->getParentId(), $endOfBlockParentCategoryIds)) {
$categoryParentRelation->setEndOfBlock(true);
$categoryChildRelationRepository->save($categoryParentRelation);
}
if ($categoryParentRelation->isEndOfBlock() && !in_array($categoryParentRelation->getParentId(), $endOfBlockParentCategoryIds)) {
$categoryParentRelation->setEndOfBlock(false);
$categoryChildRelationRepository->save($categoryParentRelation);
}
}
$editCategoryMobileMenuIcon = $request->request->get('editCategoryMobileMenuIcon');
if ($editCategoryMobileMenuIcon) {
$mobileMenuIconMedia = $category->getMobileMenuIconMedia();
if (!$mobileMenuIconMedia) {
$mobileMenuIconMedia = new Media\CategoryMobileMenuIconMedia();
$mobileMenuIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
$mobileMenuIconMedia->setCategory($category);
$entityManager->persist($mobileMenuIconMedia);
}
$mobileMenuIconMedia->setName($editCategoryMobileMenuIcon);
$category->setMobileMenuIconMedia($mobileMenuIconMedia);
}
$editCategoryAppIcon = $request->request->get('editCategoryAppIcon');
if ($editCategoryAppIcon) {
$appIconMedia = $category->getAppIconMedia();
if (!$appIconMedia) {
$appIconMedia = new Media\CategoryAppIconMedia();
$appIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
$appIconMedia->setCategory($category);
$entityManager->persist($appIconMedia);
}
$appIconMedia->setName($editCategoryAppIcon);
$category->setAppIconMedia($appIconMedia);
$entityManager->flush($appIconMedia);
}
$editCategoryMapPinIcon = $request->request->get('editCategoryMapPinIcon');
if ($editCategoryMapPinIcon) {
$mapPinIconMedia = $category->getMapPinIconMedia();
if (!$mapPinIconMedia) {
$mapPinIconMedia = new Media\CategoryMapPinIconMedia();
$mapPinIconMedia->setPath(MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH);
$mapPinIconMedia->setCategory($category);
$entityManager->persist($mapPinIconMedia);
}
$mapPinIconMedia->setName($editCategoryMapPinIcon);
$category->setMapPinIconMedia($mapPinIconMedia);
$entityManager->flush($mapPinIconMedia);
}
if ($this->isGranted('ROLE_CATEGORY_MANAGER')) {
$active = $request->request->get('edit-category-active');
if ($active != $category->isActive()) {
$category->setActive($active);
if ($active) {
$this->logOperatorAction($request, $requestCategoryID, "activation category " . Category::OFFER_CATEGORY_ID, OperatorActionLog::ACTIVATION_CATEGORY);
} else {
$this->logOperatorAction($request, $requestCategoryID, "deactivation category " . Category::OFFER_CATEGORY_ID, OperatorActionLog::ACTIVATION_CATEGORY);
foreach ($category->getSubCategories() as $subCategory) {
$subCategory->setActive(false);
$entityManager->flush($subCategory);
$categoryRepository->scheduleCategoryReload($subCategory->getID());
}
}
}
}
if ($parentCategoryIDList) {
foreach ($parentCategoryIDList as $parentCategoryID) {
if ($parentCategoryID == Category::FLIER_SALE_CATEGORY_ID) {
if ($category->isActive()) {
$entityManager->getRepository(MainMenu::class)->addMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORY, MainMenu::MENU_ID_FLIER, City::DEFAULT_CITY_ID);
} else {
$entityManager->getRepository(MainMenu::class)->deleteMenuItem($category->getID(), MainMenu::TYPE_SALE_CATEGORY, MainMenu::MENU_ID_FLIER);
}
break;
}
}
}
$category->setDescription($request->request->get('edit-category-description'));
$requestCategoryBannerList = $request->request->get('admin-category-banner-id', []);
foreach ($requestCategoryBannerList as $index => $bannerID) {
$banner = $entityManager->getRepository(Banner::class)->find($bannerID);
if($banner) {
if ($request->request->get('admin-category-banner-deleted')[$index] == "true") {
$category->deleteBanner($banner);
} else {
$category->addBanner($banner);
}
$entityManager->flush($banner);
$categoryRepository->scheduleCategoryBannerReload($requestCategoryID);
}
}
$requestTeaserBannerList = $request->request->get('admin-teaser-banner-id', []);
foreach ($requestTeaserBannerList as $index => $bannerID) {
$banner = $entityManager->getRepository(Banner::class)->find($bannerID);
if($banner) {
if ($request->request->get('admin-teaser-banner-deleted')[$index] == "true") {
$category->deleteBanner($banner);
} else {
$category->addBanner($banner);
}
$entityManager->flush($banner);
$categoryRepository->scheduleCategoryBannerReload($requestCategoryID);
}
}
$requestVerticalTeaserBannerList = $request->request->get('admin-vertical-teaser-banner-id', []);
foreach ($requestVerticalTeaserBannerList as $index => $bannerID) {
$banner = $entityManager->getRepository(Banner::class)->find($bannerID);
if($banner) {
if ($request->request->get('admin-vertical-teaser-banner-deleted')[$index] == "true") {
$category->deleteBanner($banner);
} else {
$category->addBanner($banner);
}
$entityManager->flush($banner);
$categoryRepository->scheduleCategoryBannerReload($requestCategoryID);
}
}
$landingImage = $request->request->get('editCategoryLandingImage');
if ($landingImage) {
$this->saveMedia($imageService, $requestCategoryID,MediaType::TYPE_CATEGORY_LANDING_IMAGE_ID, MediaType::TYPE_CATEGORY_LANDING_IMAGE_PATH, $landingImage);
}
$hotFeed = $entityManager->getRepository(HotFeed::class)->findBy(['entityTypeID' => Category::CATEGORY_ID, 'entityID' => $requestCategoryID]);
$showInHotFeed = $request->request->get('edit-category-hot-feed') == 'on';
if ($showInHotFeed && !$hotFeed) {
$hotFeed = new HotFeed();
$hotFeed->setCreatedOn(new \DateTime());
$hotFeed->setEntityTypeID(Category::CATEGORY_ID);
$hotFeed->setEntityID($category->getID());
$categoryCityID = City::DEFAULT_CITY_ID;
if ($category->getCity()) {
$categoryCityID = $category->getCity()->getID();
}
$hotFeed->setCityID($categoryCityID);
$entityManager->persist($hotFeed);
$entityManager->flush($hotFeed);
} else if (!$showInHotFeed && $hotFeed) {
$entityManager->remove($hotFeed[0]);
$entityManager->flush($hotFeed[0]);
}
$hotFeedImage = $request->request->get('editCategoryHotFeedImage');
if ($hotFeedImage) {
$this->saveMedia($imageService, $requestCategoryID,MediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_ID, MediaType::TYPE_CATEGORY_HOT_FEED_IMAGE_PATH, $hotFeedImage);
}
$category->setHotFeedName($request->request->get('edit-category-hot-feed-name'));
$entityManager->flush($category);
$mainMenuType = MainMenu::TYPE_OFFER_CATEGORY;
$resourceURL = 'Slivki:Default:category';
switch ($request->request->get('edit-category-domain-object-id')) {
case Category::OFFER_CATEGORY_ID:
$resourceURL = SeoRepository::RESOURCE_URL_OFFER_CATEGORY;
$mainMenuType = MainMenu::TYPE_OFFER_CATEGORY;
break;
case Category::SALE_CATEGORY_ID:
$resourceURL = SeoRepository::RESOURCE_URL_SALE_CATEGORY;
$mainMenuType = MainMenu::TYPE_SALE_CATEGORY;
break;
}
$hotFeedIcon = $request->request->get('editCategoryHotFeedIcon');
if ($hotFeedIcon) {
$this->saveMedia($imageService, $requestCategoryID, MediaType::TYPE_HOT_FEED_CATEGORY_ICON_IMAGE_ID, MediaType::TYPE_HOT_FEED_ICON_IMAGE_PATH, $hotFeedIcon);
}
$seoRepository = $entityManager->getRepository(Seo::class);
$requestAlias = $request->request->get('edit-category-alias');
if (trim($requestAlias) == '') {
$result = array(
'title' => 'Ошибка!',
'message' => 'Введите алиас',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
if ($requestAlias[0] != '/') {
$requestAlias = '/' . $requestAlias;
}
$metaTitle = $request->request->get('edit-category-meta-title');
$metaDescription = $request->request->get('edit-category-meta-description');
$metaKeywords = $request->request->get('edit-category-meta-keywords');
$alias = new Seo();
$alias->setMainAlias($requestAlias);
$alias->setEntityID($category->getID());
$alias->setActive(true);
$alias->setMetaTitle($metaTitle);
$alias->setMetaDescription($metaDescription);
$alias->setMetaKeywords($metaKeywords);
$alias->setResourceURL($resourceURL);
$alias->setDomain($category->getCity()->getDomain());
if(!$seoRepository->setAlias($alias)) {
$result = array(
'title' => 'Ошибка!',
'message' => 'Алиас ' . $requestAlias . ' уже существует!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
$commentSeo = $seoRepository->getCategoryCommentsSeo($category);
if ($commentSeo) {
$commentSeo->setMainAlias($requestAlias);
$commentSeo->setMetaTitle($metaTitle);
$commentSeo->setMetaDescription($metaDescription);
$commentSeo->setMetaKeywords($metaKeywords);
$seoRepository->setAlias($commentSeo);
}
$cityID = null;
if ($category->getDomainObjectID() == Category::OFFER_CATEGORY_ID) {
$cityID = $category->getCity()->getID();
}
$menuID = $category->getDomainObjectID() == Category::OFFER_CATEGORY_ID ? MainMenu::MENU_ID_MAIN : MainMenu::MENU_ID_SALE;
if($request->request->get('edit-category-show-in-main-menu') == 'on') {
$entityManager->getRepository(MainMenu::class)->addMenuItem($category->getID(), $mainMenuType, $menuID, $cityID);
} else {
$entityManager->getRepository(MainMenu::class)->deleteMenuItem($category->getID(), $mainMenuType, $menuID);
}
$result = array(
'title' => 'Успех!',
'message' => 'Раздел успешно сохранен!',
'type' => 'modal-success',
'newLastModified' => $category->getLastModified()->format('Y-m-d H:i:s')
);
if ($reloadMenuCache) {
$mainMenuRepository->reloadCache($menuID, $cityID);
}
$categoryRepository->scheduleCategoryReload($requestCategoryID);
return new Response(json_encode($result));
}
/**
* @route("/admin/category/banner/save")
*/
public function saveCategoryBanner(Request $request) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$result['message'] = $this->validateCategoryBannerForm($request);
if($result['message'] !== true) {
return new Response(json_encode($result));
}
$entityManager = $this->getDoctrine()->getManager("admin");
$bannerRepository = $entityManager->getRepository(Banner::class);
$requestBannerID = $request->request->get("category-banner-id");
$banner = new Banner();
if(!$requestBannerID) {
$banner->setTypeID(Banner::TYPE_CATEGORY_BANNER);
$entityManager->persist($banner);
} else {
$banner = $bannerRepository->find($requestBannerID);
if(!$banner) {
$result['message'] = array(
'title' => 'Ошибка!',
'message' => 'Банер с id = ' . $requestBannerID . ' не существует!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
}
$banner->setTitle($request->request->get("edit-category-banner-name"));
$banner->setActive($request->request->get("edit-category-banner-active", false) !== false);
$banner->setJavaScript($request->request->get("edit-category-banner-javascript", false) !== false);
$banner->setCode($request->request->get("edit-category-banner-code"));
$banner->setURL($request->request->get("edit-category-banner-link", ""));
$requestBannerFilePath = $request->request->get("edit-category-banner-banner-file-path", '');
if($requestBannerFilePath != '') {
$banner->setFilePath($requestBannerFilePath);
}
$requestBannerSubstitutePath = $request->request->get("edit-category-banner-substitute-path", '');
if($requestBannerSubstitutePath != '') {
$banner->setSubstitutePath($requestBannerSubstitutePath);
}
$entityManager->flush();
$bannerList = [$banner];
$result['bannerID'] = $banner->getID();
$result['bannerLine'] = $this->get('twig')->render('Slivki/admin/banners/list.html.twig', ['bannerList' => $bannerList]);
return new Response(json_encode($result));
}
private function validateCategoryBannerForm(Request $request) {
$errorMessage = '';
if($request->request->get('edit-category-banner-name') == '') {
$errorMessage .= 'Введите название!<br>';
}
if($errorMessage != '') {
$result = array(
'title' => 'Ошибка!',
'message' => $errorMessage,
'type' => 'modal-danger'
);
return $result;
}
return true;
}
/**
* @route("/admin/category/banner/list")
*/
public function categoryBannerList() {
$entityManager = $this->getDoctrine()->getManager();
$bannerRepository = $entityManager->getRepository(Banner::class);
$bannerList = $bannerRepository->findByTypeID(Banner::TYPE_CATEGORY_BANNER);
return $this->render('Slivki/admin/banners/list.html.twig', ['bannerList' => $bannerList]);
}
/**
* @route("/admin/category/teaser_banner/list")
*/
public function categoryTeaserBannerList() {
$entityManager = $this->getDoctrine()->getManager();
$bannerRepository = $entityManager->getRepository(Banner::class);
$bannerList = $bannerRepository->findByTypeID(Banner::TYPE_TEASER_BANNER);
return $this->render('Slivki/admin/banners/teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
}
/**
* @route("/admin/category/teaser_banner/save")
*/
public function saveCategoryTeaserBanner(Request $request, CategoryBoxCacheService $categoryBoxCacheService) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$result['message'] = $this->validateCategoryTeaserBannerForm($request);
if($result['message'] !== true) {
return new Response(json_encode($result));
}
$entityManager = $this->getDoctrine()->getManager("admin");
$bannerRepository = $entityManager->getRepository(Banner::class);
$requestBannerID = $request->request->get("category-teaser-banner-id");
$banner = new Banner();
if(!$requestBannerID) {
$banner->setTypeID(Banner::TYPE_TEASER_BANNER);
$entityManager->persist($banner);
} else {
$banner = $bannerRepository->find($requestBannerID);
if(!$banner) {
$result['message'] = array(
'title' => 'Ошибка!',
'message' => 'Банер с id = ' . $requestBannerID . ' не существует!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
}
$banner->setTitle($request->request->get("edit-category-teaser-banner-name"));
$banner->setActive($request->request->get("edit-category-teaser-banner-active", false) !== false);
$banner->setJavaScript($request->request->get("edit-category-teaser-banner-javascript", false) !== false);
$banner->setJson($request->request->getBoolean('edit-category-teaser-banner-json'));
$banner->setCode($request->request->get("edit-category-teaser-banner-code"));
$banner->setURL($request->request->get("edit-category-teaser-banner-link", ""));
$banner->setPositionRow((int)$request->request->get("edit-category-teaser-banner-row"));
$banner->setPositionColumn((int)$request->request->get("edit-category-teaser-banner-column"));
$banner->setUtmCampaign($request->request->get("edit-category-teaser-banner-campaign"));
$requestBannerFilePath = $request->request->get("edit-category-teaser-banner-banner-file-path", '');
if($requestBannerFilePath != '') {
$banner->setFilePath($requestBannerFilePath);
}
$requestBannerSubstitutePath = $request->request->get("edit-category-teaser-banner-substitute-path", '');
if($requestBannerSubstitutePath != '') {
$banner->setSubstitutePath($requestBannerSubstitutePath);
}
$entityManager->flush();
$categoryBoxCacheService->setTeaser($banner);
$bannerList = [$banner];
$result['bannerID'] = $banner->getID();
$result['bannerLine'] = $this->get('twig')->render('Slivki/admin/banners/teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
foreach($banner->getCategories() as $category) {
$entityManager->getRepository(Category::class)->scheduleCategoryReload($category->getID());
}
return new Response(json_encode($result));
}
private function validateCategoryTeaserBannerForm(Request $request) {
$errorMessage = '';
if($request->request->get('edit-category-teaser-banner-name') == '') {
$errorMessage .= 'Введите название!<br>';
}
if($errorMessage != '') {
$result = array(
'title' => 'Ошибка!',
'message' => $errorMessage,
'type' => 'modal-danger'
);
return $result;
}
return true;
}
/**
* @route("/admin/category/vertical_teaser_banner/list")
*/
public function categoryVerticalTeaserBannerList() {
$entityManager = $this->getDoctrine()->getManager();
$bannerRepository = $entityManager->getRepository(Banner::class);
$bannerList = $bannerRepository->findByTypeID(Banner::TYPE_TEASER_VERTICAL_BANNER);
return $this->render('Slivki/admin/banners/vertical_teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
}
/**
* @route("/admin/category/vertical_teaser_banner/save")
*/
public function saveCategoryVerticalTeaserBanner(Request $request) {
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$result['message'] = $this->validateCategoryVerticalTeaserBannerForm($request);
if($result['message'] !== true) {
return new Response(json_encode($result));
}
$entityManager = $this->getDoctrine()->getManager("admin");
$bannerRepository = $entityManager->getRepository(Banner::class);
$requestBannerID = $request->request->get("category-vertical-teaser-banner-id");
$banner = new Banner();
if(!$requestBannerID) {
$banner->setTypeID(Banner::TYPE_TEASER_VERTICAL_BANNER);
$entityManager->persist($banner);
} else {
$banner = $bannerRepository->find($requestBannerID);
if(!$banner) {
$result['message'] = array(
'title' => 'Ошибка!',
'message' => 'Банер с id = ' . $requestBannerID . ' не существует!',
'type' => 'modal-danger'
);
return new Response(json_encode($result));
}
}
$banner->setTitle($request->request->get("edit-category-vertical-teaser-banner-name"));
$banner->setActive($request->request->get("edit-category-vertical-teaser-banner-active", false) !== false);
$banner->setJavaScript($request->request->get("edit-category-vertical-teaser-banner-javascript", false) !== false);
$banner->setCode($request->request->get("edit-category-vertical-teaser-banner-code"));
$banner->setURL($request->request->get("edit-category-vertical-teaser-banner-link", ""));
$banner->setPositionRow((int)$request->request->get("edit-category-vertical-teaser-banner-row"));
$banner->setPositionColumn((int)$request->request->get("edit-category-vertical-teaser-banner-column"));
$requestBannerFilePath = $request->request->get("edit-category-vertical-teaser-banner-banner-file-path", '');
if($requestBannerFilePath != '') {
$banner->setFilePath($requestBannerFilePath);
}
$requestBannerSubstitutePath = $request->request->get("edit-category-vertical-teaser-banner-substitute-path", '');
if($requestBannerSubstitutePath != '') {
$banner->setSubstitutePath($requestBannerSubstitutePath);
}
$entityManager->flush();
$bannerList = [$banner];
$result['bannerID'] = $banner->getID();
$result['bannerLine'] = $this->get('twig')->render('Slivki/admin/banners/vertical_teaser_banner/list.html.twig', ['bannerList' => $bannerList]);
foreach($banner->getCategories() as $category) {
$entityManager->getRepository(Category::class)->scheduleCategoryReload($category->getID());
}
return new Response(json_encode($result));
}
/**
* @Route("/admin/site_settings")
*/
public function ajaxSiteSettings(){
return $this->render('Slivki/admin/site_settings/edit_site_settings.html.twig');
}
public function sendCommentBonusMessage(Mailer $mailer, ValidatorInterface $validator, Comment $comment) {
$user = $comment->getUser();
$emailConstraint = new EmailConstraint();
$emailConstraint->message = 'Invalid email';
if (!$user->getEmail()) {
return false;
}
$to = trim($user->getEmail());
if ($to == '' || $validator->validate($to, $emailConstraint) != '') {
return false;
}
$entityManager = $this->getDoctrine()->getManager();
$balanceActivity = $entityManager->getRepository(UserBalanceActivity::class)->findByEntityID($comment->getID());
if (!$balanceActivity || count($balanceActivity) == 0) {
return;
}
$data['balanceActivity'] = $balanceActivity[0];
$data['offer'] = $entityManager->find(Offer::class, $comment->getEntityID());
if (!$data['offer']) {
return false;
}
$message = $mailer->createMessage();
$message->setSubject("Поздравляем! Вам зачислен Бонус!")
->setFrom("info@slivki.by", 'Slivki.by')
->setTo($to)
->setBody(
$this->renderView(
'Slivki/emails/bonus/comment_bonus.html.twig',
$data
),
'text/html'
);
$mailer->send($message);
}
/**
* @Route("/admin/site_settings/edit_confirm")
*/
public function ajaxEditConfirm(Request $request){
if (!$request->isXmlHttpRequest()) {
return $this->redirect("/admin");
}
$message = $this->validateSiteSettings($request);
if (!$message) {
$siteSettings = $this->getSiteSettings();
/** @var SiteSettings $siteSettings */
$siteSettings = $this->getDoctrine()->getManager('admin')->getRepository(SiteSettings::class)->find($siteSettings->getID());
$codeCost = str_replace(',', '.', $request->request->get('edit-code-cost'));
if ($codeCost) {
$siteSettings->setCodeCost($codeCost);
}
$regionsCodeCost = $request->request->get('editRegionsCodeCost', '');
$siteSettings->setRegionsCodeCost((float)str_replace(',', '.', $regionsCodeCost));
$rateHomePhoneText = $request->request->get('edit-rate-home-phone-text');
if ($rateHomePhoneText) {
$siteSettings->setRateHomePhoneText($rateHomePhoneText);
}
$rateMobilePhoneText = $request->request->get('edit-rate-mobile-phone-text');
if ($rateMobilePhoneText) {
$siteSettings->setRateMobilePhoneText($rateMobilePhoneText);
}
$commentBoughtBonus = str_replace(',', '.', $request->request->get('edit-comment-bought-bonus'));
if ($commentBoughtBonus) {
$siteSettings->setCommentBoughtBonus($commentBoughtBonus);
}
$replishmentBonus = str_replace(',', '.', $request->request->get('edit-replenishment-bonus'));
if ($replishmentBonus) {
$siteSettings->setReplenishmentBonus($replishmentBonus);
}
$replishmentBonus = str_replace(',', '.', $request->request->get('edit-replenishment-bonus1'));
if ($replishmentBonus) {
$siteSettings->setReplenishmentBonus1($replishmentBonus);
}
$replenishmentBonus2 = \str_replace(',', '.', $request->request->get('replenishmentBonus2', 0));
$siteSettings->setReplenishmentBonus2((float) $replenishmentBonus2);
$replishmentBonus = str_replace(',', '.', $request->request->get('edit-replenishment-bonus3'));
if ($replishmentBonus) {
$siteSettings->setReplenishmentBonus3($replishmentBonus);
}
$replishmentBonus = str_replace(',', '.', $request->request->get('edit-replenishment-bonus4'));
if ($replishmentBonus) {
$siteSettings->setReplenishmentBonus4($replishmentBonus);
}
$defaultBalanceRepl = str_replace(',', '.', $request->request->get('edit-default-balance-repl'));
if ($defaultBalanceRepl) {
$siteSettings->setDefaultBalanceReplenishment($defaultBalanceRepl);
}
$defaultBalanceReplCall = str_replace(',', '.', $request->request->get('edit-default-balance-repl-call'));
if (\strlen(\trim($defaultBalanceReplCall)) !== 0) {
$siteSettings->setdefaultBalanceReplenishmentCall($defaultBalanceReplCall);
}
$promisedPaymentLimit = \str_replace(',', '.', $request->request->get('promisedPaymentLimit', 0));
$siteSettings->setPromisedPaymentLimit((float) $promisedPaymentLimit);
$monthlyCodeCount = $request->request->get('edit-monthly-code-count');
if ($monthlyCodeCount) {
$siteSettings->setMonthlyCodeCount($monthlyCodeCount);
}
$avatarBonus = str_replace(',', '.', $request->request->get('edit-avatar-bonus'));
if ($avatarBonus) {
$siteSettings->setAvatarBonus($avatarBonus);
}
$monthlyBonus = str_replace(',', '.', $request->request->get('edit-monthly-bonus'));
if ($monthlyBonus) {
$siteSettings->setMonthlyBonus($monthlyBonus);
}
$registerBonus = str_replace(',', '.', $request->request->get('edit-registration-bonus'));
if ($registerBonus) {
$siteSettings->setRegistrationBonus($registerBonus);
}
$commentBonus = str_replace(',', '.', $request->request->get('edit-comment-bonus'));
if ($commentBonus) {
$siteSettings->setCommentBonus($commentBonus);
}
$commentPhotoBonus = str_replace(',', '.', $request->request->get('edit-comment-photo-bonus'));
if ($commentPhotoBonus) {
$siteSettings->setCommentPhotoBonus($commentPhotoBonus);
}
$mediaKitManager = $request->request->get('edit-mediakit-manager');
if ($mediaKitManager) {
$siteSettings->setMediaKitManager($mediaKitManager);
}
$mediaKitPhone = $request->request->get('edit-mediakit-phone');
if ($mediaKitPhone) {
$siteSettings->setMediaKitPhone($mediaKitPhone);
}
$subscriptionFirstPayment = $request->request->get('subscriptionFirstPayment');
if (!$subscriptionFirstPayment) {
$subscriptionFirstPayment = 0;
} else {
$subscriptionFirstPayment = str_replace(',', '.', $subscriptionFirstPayment);
}
$siteSettings->setSubscriptionFirstPayment($subscriptionFirstPayment);
$subscriptionCodeActivePeriodInDays = $request->request->getInt('subscriptionCodeActivePeriodInDays');
$siteSettings->setSubscriptionCodeActivePeriodInDays(0 === $subscriptionCodeActivePeriodInDays ? null : $subscriptionCodeActivePeriodInDays);
$subscriptionPrice = $request->request->get('subscriptionPrice');
if (!$subscriptionPrice) {
$subscriptionPrice = 0;
} else {
$subscriptionPrice = str_replace(',', '.', $subscriptionPrice);
}
$siteSettings->setSubscriptionPrice($subscriptionPrice);
$cashBack = str_replace(',', '.', $request->request->get('cashBack'));
$siteSettings->setCashBackBonus($cashBack);
$siteSettings->setMainPagePromoText($request->request->get('edit-main-page-text'));
$siteSettings->setReferralBonus(str_replace(',', '.', $request->request->get('referralBonus')));
$mobAppLoginBonus = str_replace(',', '.', $request->request->get('mobAppLoginBonus', ''));
if ($mobAppLoginBonus == '') {
$mobAppLoginBonus = 0;
}
$siteSettings->setMobAppLoginBonus($mobAppLoginBonus);
$siteSettings->setMobileApplicationVersion($request->request->get('mobileApplicationVersion', ''));
$siteSettings->setMobileApplicationLockVersion($request->request->get('mobileApplicationLockVersion', ''));
$this->getDoctrine()->getManager('admin')->flush($siteSettings);
if($this->getSiteSettingsRepository()->setSiteSettingsToCache($siteSettings)) {
$message['message'] = array(
"title" => "Успех!",
"message" => "Настройки успешно сохранены!",
"type" => "modal-success"
);
} else {
$message['message'] = array(
"title" => "Ошибка!",
"message" => "Изменения не удалось сохранить!",
"type" => "modal-danger"
);
}
}
return new JsonResponse(json_encode($message));
}
private function validateSiteSettings(Request $request){
return false;
$settings = $request->request->all();
$message = "";
foreach ($settings as $field => $value){
if($value && (!is_numeric($value) && ($field != "edit-rate-home-phone-text" && $field != "edit-rate-mobile-phone-text"))){
$message['message'] = array(
"title" => "Ошибка!",
"message" => "Неправильно заполнено одно из полей!",
"type" => "modal-danger"
);
};
}
return $message;
}
private function validateCategoryVerticalTeaserBannerForm(Request $request) {
$errorMessage = '';
if($request->request->get('edit-category-vertical-teaser-banner-name') == '') {
$errorMessage .= 'Введите название!<br>';
}
if($errorMessage != '') {
$result = array(
'title' => 'Ошибка!',
'message' => $errorMessage,
'type' => 'modal-danger'
);
return $result;
}
return true;
}
/**
* @return \Slivki\Repository\SaleRepository
*/
protected function getSaleRepository() {
return $this->getDoctrine()->getManager('admin')->getRepository(Sale::class);
}
/**
* @return \Slivki\Repository\OfferRepository
*/
protected function getOfferRepository() {
return $this->getDoctrine()->getManager('admin')->getRepository(Offer::class);
}
protected function logOperatorAction($request, $entityID, $description, $type) {
$entityManager = $this->getDoctrine()->getManager('admin');
$actionLog = new OperatorActionLog();
$actionLog->setEntityID($entityID);
$actionLog->setOperatorID($this->getUser()->getID());
$actionLog->setType($type);
$actionLog->setDescription($description);
$actionLog->setIpAddress($request->getClientIp());
$actionLog->setBrowser($request->headers->get('user-agent'));
$entityManager->persist($actionLog);
$entityManager->flush($actionLog);
}
/**
* @Route("/admin/category/category-tree/{domainObjectID}/{cityID}/{parentCategoryID}")
*/
public function categoryTreeAction($domainObjectID, $cityID, $parentCategoryID) {
$data['categories'] = $this->getCategoryRepository()->getCategoryTree($domainObjectID, 0, $cityID);
$result['html'] = $this->get('twig')->render('Slivki/admin/categories/recursive_category_with_checkboxes_macro.html.twig', $data);
$result['parentCategoryURL'] = $this->getSeoRepository()->getCategoryURL($this->getCategoryRepository()->find($parentCategoryID));
return new JsonResponse($result);
}
public function getGeoLocationList($entity) {
return $this->get('twig')->render('Slivki/admin/offers/geo_location_item.html.twig', array('geoLocations' => $entity->getGeoLocations()));
}
protected function saveMedia(
ImageService $imageService,
$entityID, $mediaType,
$mediaPath, $fileName,
$sortOrder = null,
$multiple = false,
bool $isVideo = false
) {
$entityManager = $this->getEntityManager();
$mediaRepository = $entityManager->getRepository(Media::class);
$mediaTypeRepository = $entityManager->getRepository(MediaType::class);
$media = $mediaRepository->findOneBy(['entityID' => $entityID, 'mediaType' => $mediaType]);
if (!$media || $multiple) {
$media = new Media();
$media->setEntityID($entityID);
$media->setMediaType($mediaTypeRepository->find($mediaType));
$entityManager->persist($media);
}
$media->setPath($mediaPath);
$media->setName($fileName);
if ($sortOrder) {
$media->setSortOrder($sortOrder);
}
$media->setTypeID($mediaType);
$entityManager->flush($media);
if ($isVideo) {
$media->setYoutube(true);
}
$mediaSizeList = $media->getSizes();
foreach ($mediaSizeList->toArray() as $mediaSize) {
$imageService->resizeImage($media, $mediaSize->getWidth(), $mediaSize->getHeight());
}
}
/** @Route("/admin/save-special-mailing/{direction}") */
public function saveSpecialMailing(KernelInterface $kernel, $direction) {
$filePath = $kernel->getProjectDir() . '/etc/slivki-cache/mailing.html';
$entityManager = $this->getDoctrine()->getManager('admin');
$specialMailing = $entityManager->find(MailingCampaign::class, 376);
if ($direction == 'out') {
file_put_contents($filePath, $specialMailing->getMailBody());
} else if ($direction == 'in') {
$specialMailing->setMailBody(file_get_contents($filePath));
$entityManager->flush($specialMailing);
}
return new Response();
}
/** @return \Doctrine\Orm\EntityManager */
protected function getEntityManager() {
return $this->getDoctrine()->getManager('admin');
}
protected function getUserRepository(): UserRepository
{
return $this->getDoctrine()->getRepository(User::class, 'admin');
}
public function setImageRatio(KernelInterface $kernel, $description) {
if (trim($description) == '') {
return '';
}
$html = new Crawler();
$html->addHtmlContent($description);
$nodeList = $html->filter('img');
if (!empty($nodeList)) {
$nodeList->each(function (Crawler $node) use ($kernel) {
$nodeElem = $node->getNode(0);
$source = parse_url($nodeElem->getAttribute('src'));
if (isset($source['path'])) {
$imagePath = $kernel->getProjectDir() . '/public' . $source['path'];
$imageSize = @getimagesize($imagePath);
$nodeElemWidth = $nodeElem->getAttribute('width');
if ($nodeElemWidth == '') {
$nodeElem->setAttribute('width', $imageSize[0]);
}
if ($imageSize) {
$nodeElem->setAttribute('data-ratio', round(100 * $imageSize[1]/$imageSize[0], 2));
}
}
});
}
$result = str_replace('<body>', '', $html->html());
$result = str_replace('</body>', '', $result);
return $result;
}
/** @Route("/admin/upload-image") */
public function uploadImageAction(Request $request, KernelInterface $kernel) {
if (!$request->isMethod('POST')) {
return $this->redirect("/admin");
}
$initialMediaPath = $kernel->getProjectDir() . '/public' . ImageService::MEDIA_ROOT . ImageService::INITIAL_PATH;
$fileInputName = $request->request->get('fileInputName');
$filePath = $request->request->get('filePath');
$uploadedFile = $request->files->get($fileInputName);
$realFilePath = $initialMediaPath . $filePath;
$fs = new Filesystem();
$fileName = $uploadedFile->getClientOriginalName();
while ($fs->exists($realFilePath . $fileName)) {
$fileName = time() . '_' . $fileName;
}
$uploadedFile->move($realFilePath, $fileName);
$selection = $request->request->get('selection');
if ($selection) {
$selection = json_decode($selection);
$this->cropImage($realFilePath . $fileName, $selection);
}
return new Response(json_encode([
'imageURL' => ImageService::MEDIA_ROOT . ImageService::INITIAL_PATH . $filePath . $fileName,
'imageName' => $fileName
]));
}
public function cropImage($filePath, $selection) {
$x = $selection->x > 0 ? $selection->x : 0;
$y = $selection->y > 0 ? $selection->y : 0;
$imagine = new Imagine();
$image = $imagine->open($filePath);
$image->crop(new Point($x, $y), new Box($selection->width, $selection->height));
$image->save($filePath);
}
}