<?php
namespace App\AtechNet\CoreBundle\Controller;
use App\AtechNet\CoreBundle\Entity\BlogPage;
use App\AtechNet\CoreBundle\Entity\CategoryPage;
use App\AtechNet\CoreBundle\Entity\Domain;
use App\AtechNet\CoreBundle\Entity\Language;
use App\AtechNet\CoreBundle\Entity\PageMeta;
use App\AtechNet\CoreBundle\Entity\Product;
use App\AtechNet\CoreBundle\Entity\ProductType;
use App\AtechNet\CoreBundle\Entity\Review;
use App\AtechNet\CoreBundle\Entity\ReviewSurveyMedia;
use App\AtechNet\CoreBundle\Entity\SeoUrl;
use App\AtechNet\CoreBundle\Entity\StaticPage;
use App\AtechNet\CoreBundle\Form\ReviewType;
use App\AtechNet\CoreBundle\Form\ServiceType;
use App\AtechNet\CoreBundle\Helper\Furbify\Heureka;
use App\AtechNet\CoreBundle\Helper\Furbify\Image;
use App\AtechNet\CoreBundle\Helper\Furbify\MultiStore;
use App\AtechNet\CoreBundle\Helper\Furbify\ProductHelper;
use App\AtechNet\CoreBundle\Helper\Furbify\ResizeImage;
use Doctrine\ORM\Exception\NotSupported;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Psr\SimpleCache\InvalidArgumentException;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PageController extends AbstractController
{
/**
* @Route("/page/{pageId}", name="page_show", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/page/{pageId}", name="page_show_locale", defaults={"_locale":""})
* @param int $pageId
* @param Request $request
* @return Response
* @throws \Exception
*/
public function showAction($pageId, Request $request): Response
{
$multiStore = $this->getMultiStoreHelper($request);
$domain = $multiStore->getDomain();
//Product categories
if (in_array($domain->getId(), MultiStore::getRetailDomainIDs())
&& in_array($pageId, [11, 27, 60, 100]))
{
$pageId = match ($domain->getId()) {
Domain::DOMAIN_ID_RT_SK => 182,
Domain::DOMAIN_ID_RT_HU => 183,
Domain::DOMAIN_ID_RT_CZ => 184,
Domain::DOMAIN_ID_RT_EU => 185
};
}
//Return policy
if ($domain->getId() == Domain::DOMAIN_ID_WS_HU && $pageId == 31) {
$pageId = 187;
}
//Frequently Asked Questions
if ($domain->getId() == Domain::DOMAIN_ID_WS_EU && $pageId == 99) {
$pageId = 186;
}
$data = [
'pageId' => $pageId,
];
$page = $this->getEntityManager()->getRepository(StaticPage::class)->findOneById($pageId);
if ($page && $page->isPublished()) {
$data['pageId'] = $pageId;
$meta = $page->getMetaByLanguage($multiStore->getDefaultLanguage());
if (!$meta) {
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
}
$this->getStaticPageData($request, $page, $meta, $data);
return $this->render('AtechNetCoreBundle/Page/static.html.twig', $data);
} else {
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
}
}
/**
* @Route("/static-preview/{pageId}", name="page_preview")
* @param int|string $pageId
* @param Request $request
* @return Response
* @throws InvalidArgumentException
*/
public function previewPageAction($pageId, Request $request): Response
{
$data = [];
$data['canonical_link'] = '';
$data['preview'] = true;
$staticPage = $this->getEntityManager()->getRepository(StaticPage::class)->findOneById($pageId);
if ($staticPage) {
$data['pageId'] = $pageId;
$multiStore = $this->getMultiStoreHelper($request);
$meta = $staticPage->getMetaByLanguage($multiStore->getDefaultLanguage());
if (!$meta) {
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
}
$this->getStaticPageData($request, $staticPage, $meta, $data);
return $this->render('AtechNetCoreBundle/Page/static.html.twig', $data);
} else {
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
}
}
/**
* @param Request $request
* @param StaticPage $staticPage
* @param PageMeta $meta
* @param array &$data
*/
private function getStaticPageData(Request $request, StaticPage $staticPage, PageMeta $meta, array &$data)
{
$multiStore = $this->getMultiStoreHelper($request);
$translator = $this->getTranslator($request);
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $meta->getTitle(),
'href' => $this->url($request)->link('page', [
'static_id' => $staticPage->getId(),
]),
];
$data['seoTitle'] = $meta->getSeoTitle();
$data['indexable'] = $staticPage->isIndexable();
if (empty($data['seoTitle'])) {
$data['seoTitle'] = $meta->getTitle();
}
$data['seoDescription'] = $meta->getSeoDesc();
$data['title'] = $meta->getTitle();
$data['content'] = $meta->getContent();
if (strpos($data['content'], '[PICKUP_POINT_LIST]') !== false) {
$pickupPoints = $this->getEntityManager()->createQuery("SELECT pp.title,pp.street,pp.city,pp.zip,pp.glsId,pp.type,pp.locker
FROM AtechNetCoreBundle:PickupPoint pp
WHERE pp.active = 1 AND pp.country = :country
ORDER BY pp.city ASC")
->setParameter('country', $multiStore->getDomain()->getLanguage()->getCode())
->getResult();
if (count($pickupPoints) > 0) {
$pickupPointsHtml = '<ul>';
foreach ($pickupPoints as $pp) {
$pickupPointsHtml .= '<li>' . mb_strtoupper($pp['city']) . ', ' . $pp['street'] . ' - ' . $pp['title'] . '</li>';
}
$pickupPointsHtml .= '</ul>';
$data['content'] = str_replace('[PICKUP_POINT_LIST]', $pickupPointsHtml, $data['content']);
} else {
$pickupPointsHtml = $translator->trans('No Pick-up points are available');
}
$data['content'] = str_replace('[PICKUP_POINT_LIST]', $pickupPointsHtml, $data['content']);
}
if (strpos($data['content'], '[PACKETA_BRANCH_LIST]') !== false) {
$packetaBranchesCacheKey = 'packeta.branches.array';
$cacheItem = $this->cache->getItem($packetaBranchesCacheKey);
if (!$cacheItem->isHit()) {
$packeta = $this->getPacketa();
$branches = $packeta->getBrancheListForCountry($multiStore->getDomain()->getLanguage()->getCode(), $this->getKernel()->getRootDir());
$cacheItem->set($branches);
$cacheItem->expiresAfter(self::CACHE_LIFETIME_7_DAYS);
$this->cache->save($cacheItem);
} else {
$branches = $cacheItem->get();
}
if (count($branches) > 0) {
$branchesHtml = '<ul>';
foreach ($branches as $pp) {
$branchesHtml .= '<li>' . $pp['address'] . ' - <a href="' . $pp['url'] . '" target="_blank">' . $pp['url'] . '</a></li>';
}
$branchesHtml .= '</ul>';
$data['content'] = str_replace('[PACKETA_BRANCH_LIST]', $branchesHtml, $data['content']);
} else {
$branchesHtml = $this->getTranslator($request)->trans('No Pick-up points are available');
}
$data['content'] = str_replace('[PACKETA_BRANCH_LIST]', $branchesHtml, $data['content']);
}
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['contentBottom'] = $this->getContentBottom($request);
$data['socialShareImage'] = $this->getSocialShareImageHelper()->getImageUrl($staticPage->getSocialShareImage(), 'static');
$data['showAdminLoginPanel'] = $request->getSession()->get('isAdminLogin');
}
/**
* @Route("/blog/{blogCategoryId}/{blogId}", name="blog_show", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/blog/{blogCategoryId}/{blogId}", name="blog_show_locale", defaults={"_locale":""})
* @param Request $request
* @param null $blogCategoryId
* @param int|string $blogId
* @return Response
* @throws InvalidArgumentException
* @throws NotSupported
*/
public function showBlogAction(Request $request, $blogId, $blogCategoryId = null): Response
{
// Entity Manager
$entityManager = $this->getEntityManager();
// Multi-Store
$multiStore = $this->getMultiStoreHelper($request);
// Data
$data = [];
$data['hideChat'] = true;
$data['canonical_link'] = '';
if (!is_numeric($blogId)) {
$seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'keyword' => $blogId,
'language' => $multiStore->getDefaultLanguage(),
]);
if ($seoUrl) {
$query = explode('=', $seoUrl->getQuery());
$blogId = $query[1];
} else {
$blogId = 0;
}
} else {
$seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'blog_id=' . $blogId,
'language' => $multiStore->getDefaultLanguage(),
]);
if ($seoUrl) {
$data['canonical_link'] = 'https://' . $request->getHost() . '/blog/' . $seoUrl->getKeyWord();
}
}
$data['blogId'] = $blogId;
$blog = $entityManager->getRepository(BlogPage::class)->findOneById($blogId);
$customerTypeId = $this->getCustomerTypeId($request);
if ($blog) {
if ($customerTypeId != 2 && in_array($blog->getDomain()->getId(), [Domain::DOMAIN_ID_WS_SK, DOMAIN::DOMAIN_ID_WS_HU, Domain::DOMAIN_ID_WS_CZ])) {
return $this->redirectToRoute('homepage');
}
$productHelper = $this->getProductHelper($request);
// Redirect to current blog page if blogCategoryId not set or not currenty set
$meta = $blog->getMetaByLanguage($multiStore->getDefaultLanguage());
$currentCategorySeoUrl = null;
if ($blog->getCategoryPage()) {
$currentCategorySeoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'category_id=' . $blog->getCategoryPage()->getId(),
'language' => $multiStore->getDefaultLanguage(),
]);
}
// Redirect to current blog page if blogCategoryId not set or not currenty set
if (is_null($blogCategoryId) || (!is_null($currentCategorySeoUrl) && $currentCategorySeoUrl->getKeyword() != $blogCategoryId)) {
$seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'blog_id=' . $blogId,
'language' => $multiStore->getDefaultLanguage(),
]);
if ($seoUrl) {
$seoUrl->getKeyWord();
$url = 'https://' . $request->getHost() . '/blog/' . $currentCategorySeoUrl->getKeyWord() . '/' . $seoUrl->getKeyword();
return $this->redirect($url, 301);
}
}
if ($meta) {
$translator = $this->getTranslator();
$data['breadcrumbs'] = [];
$title = in_array($multiStore->getDomain()->getId(), [1, 3]) ? $translator->trans('Blog') : $translator->trans('News');
$data['breadcrumbs'][] = [
'text' => $title,
'href' => $this->generateUrl('blog_main'),
];
$data['breadcrumbs'][] = [
'text' => $meta->getTitle(),
'href' => $this->url($request)->link('blog', [
'blog_id' => $blog->getId(),
]),
];
$data['seoTitle'] = $meta->getSeoTitle();
$data['indexable'] = $blog->isIndexable();
if (empty($data['seoTitle'])) {
$data['seoTitle'] = $meta->getTitle();
}
$data['seoDescription'] = $meta->getSeoDesc();
$data['title'] = $meta->getTitle();
$data['created'] = $blog->getCreated()->format($translator->trans('datetime.format'));
$data['createdSchema'] = $blog->getCreated()->format('Y-m-d H:i:s');
$data['modifiedSchema'] = $blog->getUpdated()->format('Y-m-d H:i:s');
$data['createdBy'] = $blog->getCreatedBy()->getFirstName();
$data['content'] = $meta->getContent();
$data['tags'] = $blog->getTags();
//-> Embeddings
$data['embeddings'] = [];
if (preg_match_all('/\[\[(.*)\]\]/', $data['content'], $embeddings) !== false) {
if (!empty($embeddings[0])) {
foreach ($embeddings[0] as $embedding) {
// Remove brackets & trim
$_embedding = trim(str_replace(['[', ']'], '', $embedding));
// Arguments
$start = strpos($_embedding, '(') + 1;
$end = strrpos($_embedding, ')');
$arguments = explode(',', trim(substr($_embedding, $start, ($end - $start))));
// Get Function Name
$function = strtoupper(substr($_embedding, 0, strpos($_embedding, '(')));
// Flash Sale Box
if (strpos($function, 'FLASHSALEBOX') !== false) {
$product = $entityManager->getRepository(Product::class)->findOneByCode($arguments[0]);
if ($product) {
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
$result = $productHelper->getStructuredDataForProduct($product, 'list');
$image = $placeholder;
if (is_object($result['images'])) {
$image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
if ($result['timedSalesStartDate'] === false) {
$timedSalesStartDate = [
'year' => (new \DateTime())->format('Y'),
'month' => (new \DateTime())->format('M'),
'day' => (new \DateTime())->format('d'),
'hour' => (new \DateTime())->format('H'),
];
} else {
$timedSalesStartDate = $result['timedSalesStartDate'];
}
if ($result['timedSalesEndDate'] === false) {
$timedSalesEndDate = [
'year' => (new \DateTime())->format('Y'),
'month' => (new \DateTime())->format('M'),
'day' => (new \DateTime())->format('d'),
'hour' => (new \DateTime())->format('H'),
];
} else {
$timedSalesEndDate = $result['timedSalesEndDate'];
}
$flashSaleProduct = [
'id' => $result['id'],
'title' => $result['title'],
'vendor' => $result['vendor'],
'labels' => $result['badges'],
'rawPrice' => $result['rawPrice'],
'price' => $result['vatPrice'],
'rawSpecial' => ($result['isDiscounted'] ? $result['rawDiscountPrice'] : false),
'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
'image' => $image,
'attributes' => $result['attributes'],
'available' => $result['availableQty'],
'href' => $this->url($request)->link('product', [
'product_id' => $result['id'],
'isBazaar' => $result['isBazaar'] ?? 0
]),
'active' => $result['active'],
'timedSalesActive' => $result['timedSalesActive'],
'timedSalesStartDate' => $timedSalesStartDate,
'timedSalesEndDate' => $timedSalesEndDate,
];
$data['embeddings'][] = [
'type' => 'flashsalebox',
'search' => $embedding,
'data' => $flashSaleProduct,
];
}
} // Product Type
elseif (strpos($function, 'PRODUCTTYPE') !== false) {
// Where
$where = '';
if (isset($arguments[0])) {
$where .= ' AND p.type = ' . (int)$arguments[0];
}
if (isset($arguments[1]) && (int)$arguments[1] == 1) {
$where .= ' AND pm.discounted = 1';
}
// Order By
$orderBy = 'pm.currentVatPrice ';
if (isset($arguments[2])) {
if (strotupper($arguments[2]) == 'CREATED') {
$orderBy = 'p.crated ';
} elseif (strotupper($arguments[2]) == 'AVAILABLE') {
$orderBy = 'p.available ';
}
}
if (isset($arguments[3]) && strotupper($arguments[3]) == 'DESC') {
$orderBy .= 'DESC';
} else {
$orderBy .= 'ASC';
}
// Limit
if (isset($arguments[4]) && (int)$arguments[4] > 0 && (int)$arguments[4] <= 6) {
$limit = (int)$arguments[4];
} else {
$limit = 6;
}
// Placeholder
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
// Products
$products = [];
$productsByType = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . "
)
WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1" . $where . "
ORDER BY " . $orderBy . ", p.updated DESC")
->setMaxResults($limit)
->getResult();
$results = $productHelper->getStructuredDataForProducts($productsByType);
foreach ($results as $result) {
$image = $placeholder;
if (is_object($result['images'])) {
$image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
$products[] = [
'id' => $result['id'],
'title' => ProductHelper::getHeadingTitle($result),
'vendor' => $result['vendor'],
'vendorId' => $result['vendorId'],
'labels' => $result['badges'],
'price' => $result['vatPrice'],
'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
'rawPrice' => $result['rawPrice'],
'rawDiscountPrice' => $result['rawDiscountPrice'],
'image' => $image,
'attributes' => $result['attributes'],
'attributesListTxt' => $result['attributesListTxt'],
'available' => $result['availableQty'],
'type' => $result['productType'],
'typeId' => $result['productTypeId'],
'href' => $this->url($request)->link('product', [
'product_id' => $result['id'],
'isBazaar' => $result['isBazaar'] ?? 0
]),
'active' => $result['active'],
'timedSalesActive' => $result['timedSalesActive'],
'reviewCount' => $result['reviewCount'],
'reviewStars' => $result['reviewStars'],
'reviews' => $result['reviews'],
'freeShipping' => $result['freeShipping'],
'warrantyYear' => $this->getWarrantyForProductType($multiStore->getDomainId(), $result['productTypeId'])['year'],
];
}
$data['embeddings'][] = [
'type' => 'producttype',
'search' => $embedding,
'data' => $products,
];
} // Products
elseif (strpos($function, 'PRODUCTS') !== false) {
// Placeholder
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
// Products
$products = [];
$selectedProducts = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . "
)
WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1 AND p.code IN (" . implode(',', $arguments) . ")
ORDER BY pm.currentVatPrice ASC, p.updated DESC")
->setMaxResults(6)
->getResult()
;
$results = $productHelper->getStructuredDataForProducts($selectedProducts);
foreach ($results as $result) {
$image = $placeholder;
if (is_object($result['images'])) {
$image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
$products[] = [
'id' => $result['id'],
'title' => ProductHelper::getHeadingTitle($result),
'vendor' => $result['vendor'],
'vendorId' => $result['vendorId'],
'labels' => $result['badges'],
'price' => $result['vatPrice'],
'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
'rawPrice' => $result['rawPrice'],
'rawDiscountPrice' => $result['rawDiscountPrice'],
'image' => $image,
'attributes' => $result['attributes'],
'attributesListTxt' => $result['attributesListTxt'],
'available' => $result['availableQty'],
'type' => $result['productType'],
'typeId' => $result['productTypeId'],
'href' => $this->url($request)->link('product', [
'product_id' => $result['id'],
'isBazaar' => $result['isBazaar'] ?? 0
]),
'active' => $result['active'],
'timedSalesActive' => $result['timedSalesActive'],
'reviewCount' => $result['reviewCount'],
'reviewStars' => $result['reviewStars'],
'reviews' => $result['reviews'],
'freeShipping' => $result['freeShipping'],
];
}
$data['embeddings'][] = [
'type' => 'products',
'search' => $embedding,
'data' => $products,
];
}
// Invalid Function
else {
$data['content'] = str_replace($embedding, '', $data['content']);
}
}
}
}
$domain = $multiStore->getDomain();
$data['precision'] = $domain->getPricePrecision();
$data['currency'] = $domain->getCurrency();
//<- Embeddings
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['columnRight'] = $this->getColumnRight($request);
$data['contentBottom'] = $this->getContentBottom($request);
$blogCategoryId = 0;
if ($blog->getCategoryPage()) {
$blogCategoryId = $blog->getCategoryPage()->getId();
}
if (empty($blogCategoryId)) {
$domainId = $blog->getDomain()->getId();
if ($domainId == Domain::DOMAIN_ID_RT_SK) {
$blogCategoryId = 3;
} elseif ($domainId == Domain::DOMAIN_ID_RT_HU) {
$blogCategoryId = 77;
} elseif ($domainId == Domain::DOMAIN_ID_RT_CZ) {
$blogCategoryId = 169;
}
}
$data['url'] = $this->generateUrl('blog_show', [
'blogCategoryId' => $blogCategoryId,
'blogId' => $seoUrl ? $seoUrl->getKeyword() : $blogId,
], UrlGeneratorInterface::ABSOLUTE_URL);
$data['urlEscaped'] = urlencode($data['url']);
$data['inLanguageSchema'] = MultiStore::getBCP47LanguageCode($multiStore->getDefaultLocale());
$data['coverImage'] = $this->getSocialShareImageHelper()->getImageUrl($blog->getCoverImage(), 'blog');
$categoryPageId = $meta->getCategoryPage();
$languageId = $multiStore->getDefaultLanguage()->getId();
if ($categoryPageId != null && $languageId > 0) {
$data['articleSection'] = $entityManager->getRepository(PageMeta::class)->findOneBy([
'category_page_id' => $categoryPageId,
'language_id' => $languageId,
])->getTitle();
}
$data['showAdminLoginPanel'] = $request->getSession()->get('isAdminLogin');
return $this->render('AtechNetCoreBundle/Page/blog.html.twig', $data);
}
}
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
}
/**
* @Route("/blog/{blogId}/preview", name="blog_preview", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/blog/{blogId}/preview", name="blog_preview_locale", defaults={"_locale":""})
* @param int|string $blogId
* @param Request $request
* @return Response
* @throws InvalidArgumentException
*/
public function previewBlogAction($blogId, Request $request): Response
{
$data = [];
$data['canonical_link'] = '';
$data['preview'] = true;
// Entity Manager
$entityManager = $this->getEntityManager();
$blog = $this->getEntityManager()->getRepository(BlogPage::class)->findOneById($blogId);
$customerTypeId = $this->getCustomerTypeId($request);
if ($blog) {
if ($customerTypeId != 2 && in_array($blog->getDomain()->getId(), [Domain::DOMAIN_ID_WS_SK, Domain::DOMAIN_ID_WS_HU, Domain::DOMAIN_ID_WS_CZ])) {
return $this->redirectToRoute('homepage');
}
$multiStore = $this->getMultiStoreHelper($request);
$productHelper = $this->getProductHelper($request);
$seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'query' => 'blog_id=' . $blogId,
'language' => $multiStore->getDefaultLanguage(),
]);
$meta = $blog->getMetaByLanguage($multiStore->getDefaultLanguage());
if ($meta) {
$translator = $this->getTranslator();
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $meta->getTitle(),
'href' => $this->url($request)->link('blog', [
'blog_id' => $blog->getId(),
]),
];
$data['seoTitle'] = $meta->getSeoTitle();
$data['indexable'] = $blog->isIndexable();
if (empty($data['seoTitle'])) {
$data['seoTitle'] = $meta->getTitle();
}
$data['seoDescription'] = $meta->getSeoDesc();
$data['title'] = $meta->getTitle();
$data['created'] = $meta->getCreated()->format($translator->trans('datetime.format'));
$data['createdSchema'] = $meta->getCreated()->format('Y-m-d H:i:s');
$data['modifiedSchema'] = $blog->getUpdated()->format('Y-m-d H:i:s');
$data['createdBy'] = $blog->getCreatedBy()->getFirstName();
$data['content'] = $meta->getContent();
$data['tags'] = $blog->getTags();
//-> Embeddings
$data['embeddings'] = [];
if (preg_match_all('/\[\[(.*)\]\]/', $data['content'], $embeddings) !== false) {
if (!empty($embeddings[0])) {
foreach ($embeddings[0] as $embedding) {
// Remove brackets & trim
$_embedding = trim(str_replace(['[', ']'], '', $embedding));
// Arguments
$start = strpos($_embedding, '(') + 1;
$end = strrpos($_embedding, ')');
$arguments = explode(',', trim(substr($_embedding, $start, ($end - $start))));
// Get Function Name
$function = strtoupper(substr($_embedding, 0, strpos($_embedding, '(')));
// Flash Sale Box
if (strpos($function, 'FLASHSALEBOX') !== false) {
$product = $entityManager->getRepository(Product::class)->findOneByCode($arguments[0]);
if ($product) {
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
$result = $productHelper->getStructuredDataForProduct($product, 'list');
$image = $placeholder;
if (is_object($result['images'])) {
$image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
if ($result['timedSalesStartDate'] === false) {
$timedSalesStartDate = [
'year' => (new \DateTime())->format('Y'),
'month' => (new \DateTime())->format('M'),
'day' => (new \DateTime())->format('d'),
'hour' => (new \DateTime())->format('H'),
];
} else {
$timedSalesStartDate = $result['timedSalesStartDate'];
}
if ($result['timedSalesEndDate'] === false) {
$timedSalesEndDate = [
'year' => (new \DateTime())->format('Y'),
'month' => (new \DateTime())->format('M'),
'day' => (new \DateTime())->format('d'),
'hour' => (new \DateTime())->format('H'),
];
} else {
$timedSalesEndDate = $result['timedSalesEndDate'];
}
$flashSaleProduct = [
'id' => $result['id'],
'title' => $result['title'],
'vendor' => $result['vendor'],
'labels' => $result['badges'],
'rawPrice' => $result['rawPrice'],
'price' => $result['vatPrice'],
'rawSpecial' => ($result['isDiscounted'] ? $result['rawDiscountPrice'] : false),
'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
'image' => $image,
'attributes' => $result['attributes'],
'available' => $result['availableQty'],
'href' => $this->url($request)->link('product', [
'product_id' => $result['id'],
'isBazaar' => $result['isBazaar'] ?? 0
]),
'active' => $result['active'],
'timedSalesActive' => $result['timedSalesActive'],
'timedSalesStartDate' => $timedSalesStartDate,
'timedSalesEndDate' => $timedSalesEndDate,
];
$data['embeddings'][] = [
'type' => 'flashsalebox',
'search' => $embedding,
'data' => $flashSaleProduct,
];
}
} // Product Type
elseif (strpos($function, 'PRODUCTTYPE') !== false) {
// Where
$where = '';
if (isset($arguments[0])) {
$where .= ' AND p.type = ' . (int)$arguments[0];
}
if (isset($arguments[1]) && (int)$arguments[1] == 1) {
$where .= ' AND pm.discounted = 1';
}
// Order By
$orderBy = 'pm.currentVatPrice ';
if (isset($arguments[2])) {
if (strotupper($arguments[2]) == 'CREATED') {
$orderBy = 'p.crated ';
} elseif (strotupper($arguments[2]) == 'AVAILABLE') {
$orderBy = 'p.available ';
}
}
if (isset($arguments[3]) && strotupper($arguments[3]) == 'DESC') {
$orderBy .= 'DESC';
} else {
$orderBy .= 'ASC';
}
// Limit
if (isset($arguments[4]) && (int)$arguments[4] > 0 && (int)$arguments[4] <= 6) {
$limit = (int)$arguments[4];
} else {
$limit = 6;
}
// Placeholder
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
// Products
$products = [];
$productsByType = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . "
)
WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1" . $where . "
ORDER BY " . $orderBy . ", p.updated DESC")
->setMaxResults($limit)
->getResult();
$results = $productHelper->getStructuredDataForProducts($productsByType);
foreach ($results as $result) {
$image = $placeholder;
if (is_object($result['images'])) {
$image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
$products[] = [
'id' => $result['id'],
'title' => ProductHelper::getHeadingTitle($result),
'vendor' => $result['vendor'],
'vendorId' => $result['vendorId'],
'labels' => $result['badges'],
'price' => $result['vatPrice'],
'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
'rawPrice' => $result['rawPrice'],
'rawDiscountPrice' => $result['rawDiscountPrice'],
'image' => $image,
'attributes' => $result['attributes'],
'attributesListTxt' => $result['attributesListTxt'],
'available' => $result['availableQty'],
'type' => $result['productType'],
'typeId' => $result['productTypeId'],
'href' => $this->url($request)->link('product', [
'product_id' => $result['id'],
'isBazaar' => $result['isBazaar'] ?? 0
]),
'active' => $result['active'],
'timedSalesActive' => $result['timedSalesActive'],
'reviewCount' => $result['reviewCount'],
'reviewStars' => $result['reviewStars'],
'reviews' => $result['reviews'],
'freeShipping' => $result['freeShipping'],
];
}
$data['embeddings'][] = [
'type' => 'producttype',
'search' => $embedding,
'data' => $products,
];
} // Products
elseif (strpos($function, 'PRODUCTS') !== false) {
// Placeholder
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
// Products
$products = [];
$selectedProducts = $entityManager->createQuery("SELECT p
FROM AtechNetCoreBundle:Product p
LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . "
)
WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1 AND p.code IN (" . implode(',', $arguments) . ")
ORDER BY pm.currentVatPrice ASC, p.updated DESC")
->setMaxResults(6)
->getResult();
$results = $productHelper->getStructuredDataForProducts($selectedProducts);
foreach ($results as $result) {
$image = $placeholder;
if (is_object($result['images'])) {
$image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
}
$products[] = [
'id' => $result['id'],
'title' => ProductHelper::getHeadingTitle($result),
'vendor' => $result['vendor'],
'vendorId' => $result['vendorId'],
'labels' => $result['badges'],
'price' => $result['vatPrice'],
'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
'rawPrice' => $result['rawPrice'],
'rawDiscountPrice' => $result['rawDiscountPrice'],
'image' => $image,
'attributes' => $result['attributes'],
'attributesListTxt' => $result['attributesListTxt'],
'available' => $result['availableQty'],
'type' => $result['productType'],
'typeId' => $result['productTypeId'],
'href' => $this->url($request)->link('product', [
'product_id' => $result['id'],
'isBazaar' => $result['isBazaar'] ?? 0
]),
'active' => $result['active'],
'timedSalesActive' => $result['timedSalesActive'],
'reviewCount' => $result['reviewCount'],
'reviewStars' => $result['reviewStars'],
'reviews' => $result['reviews'],
'freeShipping' => $result['freeShipping'],
];
}
$data['embeddings'][] = [
'type' => 'products',
'search' => $embedding,
'data' => $products,
];
} // Invalid Function
else {
$data['content'] = str_replace($embedding, '', $data['content']);
}
}
}
}
$domain = $multiStore->getDomain();
$data['precision'] = $domain->getPricePrecision();
$data['currency'] = $domain->getCurrency();
$data['warrantyYear'] = $this->getWarrantyForNonProductText($domain->getId());
//<- Embeddings
$data['content'] = str_replace(' ', ' ', $data['content']);
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['columnRight'] = $this->getColumnRight($request);
$data['contentBottom'] = $this->getContentBottom($request);
$blogCategoryId = 0;
if ($blog->getCategoryPage()) {
$blogCategoryId = $blog->getCategoryPage()->getId();
}
if (empty($blogCategoryId)) {
$domainId = $blog->getDomain()->getId();
if ($domainId == Domain::DOMAIN_ID_RT_SK) {
$blogCategoryId = 3;
} elseif ($domainId == Domain::DOMAIN_ID_RT_HU) {
$blogCategoryId = 77;
} elseif ($domainId == Domain::DOMAIN_ID_RT_CZ) {
$blogCategoryId = 169;
}
}
$data['url'] = $this->generateUrl('blog_show', [
'blogCategoryId' => $blogCategoryId,
'blogId' => $seoUrl ? $seoUrl->getKeyword() : $blogId,
], UrlGeneratorInterface::ABSOLUTE_URL);
$data['urlEscaped'] = urlencode($data['url']);
$data['inLanguageSchema'] = MultiStore::getBCP47LanguageCode($multiStore->getDefaultLocale());
$data['coverImage'] = $this->getSocialShareImageHelper()->getImageUrl($blog->getCoverImage(), 'blog');
$categoryPageId = $meta->getCategoryPage();
$languageId = $multiStore->getDefaultLanguage()->getId();
if ($categoryPageId != null && $languageId > 0) {
$data['articleSection'] = $entityManager->getRepository(PageMeta::class)->findOneBy([
'category_page_id' => $categoryPageId,
'language_id' => $languageId,
])->getTitle();
}
$data['showAdminLoginPanel'] = $request->getSession()->get('isAdminLogin');
return $this->render('AtechNetCoreBundle/Page/blog.html.twig', $data);
}
}
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
}
/**
* @Route("/blog", name="blog_main", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/blog", name="blog_main_locale", defaults={"_locale":""})
* @Route("/blog/{blogCategoryId}", name="blog_show_category", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/blog/{blogCategoryId}", name="blog_show_category_locale", defaults={"_locale":""})
* @Route("/blog/{blogCategoryId}/category", name="blog_list", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/blog/{blogCategoryId}/category", name="blog_list_locale", defaults={"_locale":""})
* @param Request $request
* @param int $blogCategoryId
* @return Response
* @throws InvalidArgumentException
* @throws NotSupported
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function listBlogAction(Request $request, $blogCategoryId = 0)
{
$data = [];
$data['hideChat'] = true;
$multiStore = $this->getMultiStoreHelper($request);
$entityManager = $this->getEntityManager();
if (!is_numeric($blogCategoryId)) {
$seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'keyword' => $blogCategoryId,
'language' => $this->getMultiStoreHelper($request)->getDefaultLanguage(),
]);
if ($seoUrl) {
$query = explode('=', $seoUrl->getQuery());
$blogCategoryId = $query[1];
if ($query[0] == 'blog_id') {
$blog = $entityManager->getRepository(BlogPage::class)->findOneById($blogCategoryId);
if ($blog) {
$blogCategoryId = 0;
if ($blog->getCategoryPage()) {
$blogCategoryId = $blog->getCategoryPage()->getId();
}
if (empty($blogCategoryId)) {
$domainId = $blog->getDomain()->getId();
$blogCategoryId = $multiStore->getBlogCategoryIdByDomainId($domainId);
}
return $this->redirect($this->url($request)->link('blog', [
'blog_category_id' => $blogCategoryId,
'blog_id' => $blog->getId(),
]), 301);
}
}
} else {
$blogCategoryId = 0;
}
}
$blogCategory = $entityManager->getRepository(CategoryPage::class)->findOneBy([
'id' => $blogCategoryId,
'published' => true,
'type' => CategoryPage::CATEGORY_TYPE_BLOG,
]);
$customerTypeId = $this->getCustomerTypeId($request);
$translator = $this->getTranslator();
if ($blogCategory) {
$language = $multiStore->getDefaultLanguage();
$meta = $blogCategory->getMetaByLanguage($language);
if ($meta) {
$additionalSeoTitle = '';
if ($request->get('page')) {
$page = $request->get('page');
$additionalSeoTitle .= ', ' . $page . '.' . $translator->trans('page');
} else {
$page = 1;
}
if ($request->get('limit')) {
$limit = $request->get('limit');
} else {
$limit = 12;
}
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $meta->getTitle(),
'href' => $this->url($request)->link('blog_category', [
'blog_category_id' => $blogCategory->getId(),
]),
];
$data['seoTitle'] = $meta->getSeoTitle() . $additionalSeoTitle;
if (empty($data['seoTitle'])) {
$data['seoTitle'] = $meta->getTitle() . $additionalSeoTitle;
}
$data['seoDescription'] = $meta->getSeoDesc();
$data['title'] = $meta->getTitle() . $additionalSeoTitle;
$data['content'] = $meta->getContent();
$data['blogs'] = [];
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::BLOG_LIST_THUMB_WIDTH, Image::BLOG_LIST_THUMB_HEIGHT);
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder
->select('b')
->from('AtechNetCoreBundle:BlogPage', 'b')
->leftJoin('b.metas', 'm')
->andWhere('b.published = :published')
->setParameter(':published', 1)
->andWhere('m.language = :languageId')
->setParameter(':languageId', $multiStore->getDefaultLanguageId())
->andWhere('b.categoryPage = :categoryPage')
->setParameter(':categoryPage', $blogCategory->getId())
->andWhere('b.domain = :domain')
->setParameter(':domain', $multiStore->getDomainId())
->setFirstResult((($page - 1) * $limit))
->orderBy('b.created', 'DESC')
->setMaxResults($limit);
$query = $queryBuilder->getQuery();
$results = new Paginator($query);
foreach ($results as $result) {
if (!is_null($result->getCoverImageLink())) {
$thumb = $this->getImage($result->getCoverImageLink(), 'blog')->resize(Image::BLOG_BLOCK_THUMB_16_9_WIDTH, Image::BLOG_BLOCK_THUMB_16_9_HEIGHT);
} else {
$thumb = $placeholder;
}
$blogCategoryId = 0;
if ($result->getCategoryPage()) {
$blogCategoryId = $result->getCategoryPage()->getId();
}
if (empty($blogCategoryId)) {
$domainId = $result->getDomain()->getId();
$blogCategoryId = $multiStore->getBlogCategoryIdByDomainId($domainId);
}
$meta = $result->getMetaByLanguage($language);
$salesManager = $meta->getBlogPage()->getCreatedBy();
$data['blogs'][] = [
'title' => $meta->getTitle(),
'created' => $meta->getCreated()->format($translator->trans($customerTypeId == 2 ? 'datetime.format.ws' : 'datetime.format')),
'text' => $meta->getShortDesc() != '' ? $meta->getShortDesc() : substr(trim(strip_tags($meta->getContent())), 0, 350),
'thumb' => $thumb,
'href' => $this->url($request)->link('blog', [
'blog_category_id' => $blogCategoryId,
'blog_id' => $result->getId(),
]),
'salesManagerName' => !is_null($salesManager) ? $salesManager->getFirstName() : '',
'salesManagerId' => !is_null($salesManager) ? $salesManager->getId() : '',
];
}
// Totals
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder
->select(
$queryBuilder->expr()->countDistinct('b.id')
)
->from('AtechNetCoreBundle:BlogPage', 'b')
->leftJoin('b.metas', 'm')
->andWhere('b.published = :published')
->setParameter(':published', 1)
->andWhere('m.language = :languageId')
->setParameter(':languageId', $multiStore->getDefaultLanguageId())
->andWhere('b.categoryPage = :categoryPage')
->setParameter(':categoryPage', $blogCategory->getId())
->andWhere('b.domain = :domain')
->setParameter(':domain', $multiStore->getDomainId());
$query = $queryBuilder->getQuery();
$result = $query->getSingleScalarResult();
$data['pagination'] = [
'total' => $result,
'page' => $page,
'limit' => $limit,
'noInfinite' => true,
'url' => $this->url($request)->link('blog_category', [
'blog_category_id' => $blogCategory->getId(),
'page' => '{page}',
]),
];
if ($page > 2) {
$data['linkPrev'] = $this->url($request)->link('blog_category', [
'blog_category_id' => $blogCategory->getId(),
'page' => ($page - 1),
]);
} elseif ($page > 1) {
$data['linkPrev'] = $this->url($request)->link('blog_category', [
'blog_category_id' => $blogCategory->getId(),
]);
} else {
$data['linkPrev'] = false;
}
if ($limit && ceil($result / $limit) > $page) {
$data['linkNext'] = $this->url($request)->link('blog_category', [
'blog_category_id' => $blogCategory->getId(),
'page' => ($page + 1),
]);
} else {
$data['linkNext'] = false;
}
//-> Canonical Link
$canonicalUrl = $this->url($request)->link('blog_category', [
'blog_category_id' => $blogCategory->getId(),
]);
if ($canonicalUrl != $request->getUri()) {
$data['canonical_link'] = $canonicalUrl;
} else {
$data['canonical_link'] = '';
}
//<- Canonical Link
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['columnRight'] = $this->getColumnRight($request);
$data['contentBottom'] = $this->getContentBottom($request);
$data['customerTypeId'] = $customerTypeId;
return $this->render('AtechNetCoreBundle/Page/blogList.html.twig', $data);
}
} elseif ($blogCategoryId == 0) {
$multiStore = $this->getMultiStoreHelper($request);
$entityManager = $this->getEntityManager();
$language = $multiStore->getDefaultLanguage();
$additionalSeoTitle = '';
if ($request->get('tag')) {
$tag = $request->get('tag');
} else {
$tag = false;
}
if ($request->get('page')) {
$page = $request->get('page');
$additionalSeoTitle .= ', ' . $page . '.' . $translator->trans('page');
} else {
$page = 1;
}
if ($request->get('limit')) {
$limit = $request->get('limit');
} else {
$limit = 12;
}
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$title = in_array($multiStore->getDomain()->getId(), [1, 3]) ? $translator->trans('Blog') : $translator->trans('News');
$data['breadcrumbs'][] = [
'text' => $title,
'href' => $this->generateUrl('blog_main'),
];
$data['seoTitle'] = $data['title'] = $title . $additionalSeoTitle;
$data['seoDescription'] = $translator->trans('Blog list description');
$data['content'] = '';
$data['blogs'] = [];
$placeholder = $this->getImage('placeholder.png', '')->resize(Image::BLOG_BLOCK_THUMB_16_9_WIDTH, Image::BLOG_BLOCK_THUMB_16_9_HEIGHT);
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder
->select('b')
->from('AtechNetCoreBundle:BlogPage', 'b')
->leftJoin('b.metas', 'm')
->andWhere('b.published = :published')
->setParameter(':published', 1)
->andWhere('m.language = :languageId')
->setParameter(':languageId', $multiStore->getDefaultLanguageId())
->andWhere('b.domain = :domain')
->setParameter(':domain', $multiStore->getDomainId());
if ($tag) {
$queryBuilder->join('b.tags', 't')
->andWhere('t.slug = :tagSlug')
->setParameter(':tagSlug', $tag);
}
$queryBuilder
->setFirstResult((($page - 1) * $limit))
->orderBy('b.created', 'DESC')
->setMaxResults($limit);
$query = $queryBuilder->getQuery();
$results = new Paginator($query, $fetchJoinCollection = true);
foreach ($results as $result) {
if (!is_null($result->getCoverImageLink())) {
$thumb = $this->getImage($result->getCoverImageLink(), 'blog')->resize(Image::BLOG_BLOCK_THUMB_16_9_WIDTH, Image::BLOG_BLOCK_THUMB_16_9_HEIGHT);
} else {
$thumb = $placeholder;
}
$blogCategoryId = 0;
if ($result->getCategoryPage()) {
$blogCategoryId = $result->getCategoryPage()->getId();
}
if (empty($blogCategoryId)) {
$domainId = $result->getDomain()->getId();
$blogCategoryId = $multiStore->getBlogCategoryIdByDomainId($domainId);
}
$meta = $result->getMetaByLanguage($language);
$salesManager = $meta->getBlogPage()->getCreatedBy();
$data['blogs'][] = [
'title' => $meta->getTitle(),
'created' => $meta->getCreated()->format($translator->trans($customerTypeId == 2 ? 'datetime.format.ws' : 'datetime.format')),
'text' => $meta->getShortDesc() != '' ? $meta->getShortDesc() : substr(trim(strip_tags($meta->getContent())), 0, 350),
'thumb' => $thumb,
'href' => $this->url($request)->link('blog', [
'blog_category_id' => $blogCategoryId,
'blog_id' => $result->getId(),
]),
'salesManagerName' => !is_null($salesManager) ? $salesManager->getFirstName() : '',
'salesManagerId' => !is_null($salesManager) ? $salesManager->getId() : '',
];
}
// Totals
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder
->select(
$queryBuilder->expr()->countDistinct('b.id')
)
->from('AtechNetCoreBundle:BlogPage', 'b')
->leftJoin('b.metas', 'm')
->andWhere('b.published = :published')
->setParameter(':published', 1)
->andWhere('m.language = :languageId')
->setParameter(':languageId', $multiStore->getDefaultLanguageId())
->andWhere('b.domain = :domain')
->setParameter(':domain', $multiStore->getDomainId());
if ($tag) {
$queryBuilder->join('b.tags', 't')
->andWhere('t.slug = :tagSlug')
->setParameter(':tagSlug', $tag);
}
$query = $queryBuilder->getQuery();
$result = $query->getSingleScalarResult();
$data['pagination'] = [
'total' => $result,
'page' => $page,
'limit' => $limit,
'infinite' => false,
'url' => $this->generateUrl('blog_main', [
'page' => '{page}',
]),
'moreButton' => false,
];
if ($page > 2) {
$data['linkPrev'] = $this->generateUrl('blog_main', [
'page' => ($page - 1),
], UrlGeneratorInterface::ABSOLUTE_URL);
} elseif ($page > 1) {
$data['linkPrev'] = $this->generateUrl('blog_main', [], UrlGeneratorInterface::ABSOLUTE_URL);
} else {
$data['linkPrev'] = false;
}
if ($limit && ceil($result / $limit) > $page) {
$data['linkNext'] = $this->generateUrl('blog_main', [
'page' => ($page + 1),
], UrlGeneratorInterface::ABSOLUTE_URL);
} else {
$data['linkNext'] = false;
}
//-> Canonical Link
$canonicalUrl = $this->generateUrl('blog_main', [], UrlGeneratorInterface::ABSOLUTE_URL);
if ($canonicalUrl != $request->getUri()) {
$data['canonical_link'] = $canonicalUrl;
} else {
$data['canonical_link'] = '';
}
//<- Canonical Link
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['columnRight'] = $this->getColumnRight($request);
$data['contentBottom'] = $this->getContentBottom($request);
$data ['customerTypeId'] = $customerTypeId;
return $this->render('AtechNetCoreBundle/Page/blogList.html.twig', $data);
}
return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction', []);
}
/**
* @Route("/reviews", name="review_list")
* @Route("/reviews", name="review_list_sk")
* @Route("/reviews", name="review_list_hu")
* @Route("/reviews", name="review_list_cz")
* @Route("/reviews", name="review_list_en")
* @param Request $request
* @return Response
* @throws InvalidArgumentException
*/
public function listReviewAction(Request $request): Response
{
$translator = $this->getTranslator();
$data['breadcrumbs'] = [];
$data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
$data['breadcrumbs'][] = [
'text' => $translator->trans('Client testimonials'),
'href' => $this->generateUrl('review_list'),
];
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['contentBottom'] = $this->getContentBottom($request);
return $this->render('AtechNetCoreBundle/Page/reviewList.html.twig', $data);
}
/**
* Product types for the review filter form
*
* @return array
*/
private function getProductTypeList($translator): array
{
$types = [];
$typesData = $this->getEntityManager()->getRepository(ProductType::class)
->findBy([
'id' => $this->getProductTypeIdListForReviewCategoryFilter(),
]);
foreach ($typesData as $type) {
$types[$type->getId()] = $translator->trans('Review ' . $type->getTitle());
}
$types['other'] = $translator->trans('Other');
return $types;
}
/**
* Product type Id list for the review filter form
*
* @return array
*/
private function getProductTypeIdListForReviewCategoryFilter(): array
{
return [
ProductType::PRODUCT_TYPE_ID_MONITOR,
ProductType::PRODUCT_TYPE_ID_NOTEBOOK,
ProductType::PRODUCT_TYPE_ID_PC,
ProductType::PRODUCT_TYPE_ID_TABLET,
ProductType::PRODUCT_TYPE_ID_PC_SET,
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE,
ProductType::PRODUCT_TYPE_ID_SMARTPHONE,
];
}
/**
* Quality statuses for the review filter form
*
* @param $translator
*
* @return array
*/
private function getQualityStatuses($translator): array
{
$qualityStatuses = Product::getQualityStatusChoices();
if (empty($qualityStatuses)) {
return [];
}
$statuses = [];
foreach ($qualityStatuses as $id => $title) {
if ($id == Product::QualityStatus_Platinum) {
continue;
}
if ($id != 0) {
$statuses[$id] = $translator->trans($title);
}
}
return $statuses;
}
/**
* @Route("/servis", name="service", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/servis", name="service_locale", defaults={"_locale":""})
* @param Request $request
* @return Response
* @throws InvalidArgumentException
*/
public function serviceAction(Request $request): Response
{
$data = [];
$data['form'] = $this->createForm(ServiceType::class, null, [
'locale' => $request->getLocale(),
])->createView();
$data['seoTitle'] = 'The service courier goes home!';
$data['indexable'] = true;
$data['seoDescription'] = 'SEO desc';
$data['title'] = $data['seoTitle'];
$multistore = $this->getMultiStoreHelper($request);
$domainId = $multistore->getDomainId();
switch ($domainId) {
case 1:
case 2:
$data['dataProtectionLink'] = '/informacie-o-ochrane-osobnych-udajov';
$data['claims'] = '/reklamacny-poriadok';
break;
case 3:
case 4:
$data['dataProtectionLink'] = '/adatkezelesi-tajekoztato';
$data['claims'] = '/reklamacio';
break;
default:
$data['dataProtectionLink'] = '/informacie-o-ochrane-osobnych-udajov';
$data['claims'] = '/reklamacny-poriadok';
}
$data['header'] = $this->getHeader($request);
$data['footer'] = $this->getFooter($request);
$data['contentBottom'] = $this->getContentBottom($request);
return $this->render('AtechNetCoreBundle/Page/service.html.twig', $data);
}
/**
* @Route("/servis/save", name="service_save", defaults={"_locale":""})
* @Route("/{_locale<%supported_locales%>?}/servis/save", name="service_save_locale", defaults={"_locale":""})
* @param Request $request
* @return Response
* @throws InvalidArgumentException
*/
public function saveServiceAction(Request $request): Response
{
$data = [];
$translator = $this->getTranslator();
$form = $this->createForm(ServiceType::class, null, [
'locale' => $request->getLocale(),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$captchaResponse = $request->request->get('g-recaptcha-response');
$captchaResult = $this->verifyGoogleCaptcha($captchaResponse);
if ($captchaResult) {
$formData = $form->getNormData();
$emailData['firstName'] = $formData['firstName'];
$emailData['lastName'] = $formData['lastName'];
$emailData['city'] = $formData['city'];
$emailData['street'] = $formData['street'];
$emailData['zip'] = $formData['zip'];
$emailData['phone'] = $formData['phone'];
$emailData['userEmail'] = $formData['email'];
$emailData['productType'] = $formData['productType'];
$emailData['errorType'] = $translator->trans(ServiceType::getErrorTypeChoices()[$formData['errorType']]);
$emailData['aestheticStatuses'] = '';
foreach ($formData['aestheticStatus'] as $aestheticStatusKey) {
if ($emailData['aestheticStatuses'] != '') {
$emailData['aestheticStatuses'] .= ', ';
}
$emailData['aestheticStatuses'] .= $translator->trans(ServiceType::getAestheticStatusChoices()[$aestheticStatusKey]);
}
$emailData['aestheticDescription'] = $formData['aestheticDescription'];
$emailData['accessories'] = '';
foreach ($formData['accessories'] as $accessoriesKey) {
if ($emailData['accessories'] != '') {
$emailData['accessories'] .= ', ';
}
$emailData['accessories'] .= $translator->trans(ServiceType::getAccessoriesChoices()[$accessoriesKey]);
}
$emailData['accessoriesDescription'] = $formData['accessoriesDescription'];
$emailData['dataBackup'] = $translator->trans(ServiceType::getDataBackupChoices()[$formData['dataBackup']]);
$emailData['errorDescription'] = $formData['errorDescription'];
$emailData['accountingDescription'] = $formData['accountingDescription'];
$emailData['subject'] = 'furbify service - ' . $emailData['productType'] . ' (' . $emailData['firstName'] . ' ' . $emailData['lastName'] . ')';
$emailData['locale'] = $request->getLocale();
$mailer = $this->getMailer();
$email = (new TemplatedEmail())
->subject($emailData['subject'])
->to('servis@furbify.eu')
->htmlTemplate('AtechNetCoreBundle/Email/service.html.twig')
->context($emailData);
$mailer->send($email);
} else {
$this->addFlash(
'error',
$translator->trans('Captcha check failed, please try again!')
);
}
} else {
return $this->redirectToRoute('service', [
'error' => 1,
]);
}
return $this->redirectToRoute('service', [
'success' => 1,
]);
}
}