<?php
namespace App\AtechNet\CoreBundle\Controller;
use App\AtechNet\CoreBundle\Entity\Domain;
use App\AtechNet\CoreBundle\Entity\Language;
use App\AtechNet\CoreBundle\Entity\SeoUrl;
use App\AtechNet\CoreBundle\Helper\Furbify\MultiStore;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class SeoUrlController extends AbstractController
{
/**
* @Route("/{slug}", name="seo", requirements={"slug"=".+"}, defaults={"_locale":""}, priority=-1)
*
* @param string $slug
* @param Request $request
* @return mixed
*/
public function indexAction(string $slug, Request $request)
{
// Entity Manager
$entityManager = $this->getEntityManager();
// Multi-Store
$multiStore = $this->getMultiStoreHelper($request);
mb_internal_encoding('UTF-8');
// Default Controller
$controller = 'App\AtechNet\CoreBundle\Controller\DefaultController::index';
// Parts of URL
$parts = explode('/', $slug);
// Remove any empty arrays from trailing
if (mb_strlen(end($parts)) == 0) {
array_pop($parts);
}
// Default Language
$defaultLanguageId = $multiStore->getDefaultLanguageId();
// Language
$languageId = $multiStore->getLanguageId();
if (isset($parts[0])) {
$language = $entityManager->getRepository(Language::class)->findOneByCode($parts[0]);
if ($language) {
$request->getSession()->set('languageId', $language->getId());
$request->getSession()->set('_locale', $language->getCode());
$request->setLocale($language->getCode());
MultiStore::setLocalDomain($request);
$languageId = $language->getId();
$multiStore->setLanguageSwitched(true);
array_shift($parts);
} else {
$language = $multiStore->getDefaultLanguage();
if ($language) {
$request->getSession()->set('languageId', $language->getId());
$request->getSession()->set('_locale', $language->getCode());
$request->setLocale($language->getCode());
MultiStore::setLocalDomain($request);
}
}
}
// Domain
$domainId = $multiStore->getDomainId();
if (in_array($domainId, MultiStore::getWholesaleDomainIDs())) {
switch ($domainId) {
case Domain::DOMAIN_ID_WS_SK:
$domainId = Domain::DOMAIN_ID_RT_SK;
break;
case Domain::DOMAIN_ID_WS_HU:
$domainId = Domain::DOMAIN_ID_RT_HU;
break;
case Domain::DOMAIN_ID_WS_CZ:
$domainId = Domain::DOMAIN_ID_RT_CZ;
break;
case Domain::DOMAIN_ID_WS_EU:
$domainId = Domain::DOMAIN_ID_RT_EU;
break;
}
}
// Update Default Controller
if (!$multiStore->isLanguageSwitched()) {
$controller = 'App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction';
}
// Redirect Before Processing
$redirectTo = $this->redirectToStaticPage($slug, $domainId);
if ( $redirectTo > 0 ) {
$redirect = $this->url($request)->link('page', [
'static_id' => $redirectTo
]);
return $this->redirect($redirect);
}
// Reset Bazaar Flag
$request->getSession()->set('isBazaarPage', false);
// Handle Bazaar Folder
if ( isset($parts[0]) && in_array($parts[0], [ 'bazar', 'bazaar' ]) ) {
if ( count($parts) > 1 ) {
array_shift($parts);
}
// Set Bazaar Flag
$request->getSession()->set('isBazaarPage', true);
}
// Controller Request
$params = [
'request' => $request,
];
foreach ($parts as $part) {
$seo_url = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'keyword' => $part,
'language' => $defaultLanguageId,
'archived' => false,
'domain' => [$domainId, null],
]);
if ($seo_url) {
$url = explode('=', $seo_url->getQuery());
if ($url[0] == 'product_id') {
$controller = 'App\AtechNet\CoreBundle\Controller\ProductController::showAction';
$params['productId'] = (int)$url[1];
break;
} elseif ($url[0] == 'category_id') {
$controller = 'App\AtechNet\CoreBundle\Controller\ProductController::listAction';
$params['categoryId'] = (int)$url[1];
} elseif ($url[0] == 'static_id') {
$controller = 'App\AtechNet\CoreBundle\Controller\PageController::showAction';
$params['pageId'] = (int)$url[1];
break;
} elseif ($url[0] == 'blog_id') {
$controller = 'App\AtechNet\CoreBundle\Controller\PageController::showBlogAction';
$params['blogId'] = (int)$url[1];
break;
} elseif ($url[0] == 'blog_category_id') {
$controller = 'App\AtechNet\CoreBundle\Controller\ProductController::listBlogAction';
$params['blogCategoryId'] = (int)$url[1];
break;
} else {
$controller = 'App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction';
}
} // If at least one SEO keyword does not exist in the URL to be loaded, it is treated as a 404 error page
else {
$controller = 'App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction';
break;
}
}
if ($controller == 'App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction') {
if (isset($parts[0]) && isset($parts[1])) {
if ($parts[0] == 'product') {
if ($parts[1] == 'search') {
$controller = 'App\AtechNet\CoreBundle\Controller\ProductController::searchAction';
} else {
$controller = 'App\AtechNet\CoreBundle\Controller\ProductController::showAction';
$params['productId'] = (int)$parts[1];
}
} elseif ($parts[0] == 'category') {
$controller = 'App\AtechNet\CoreBundle\Controller\ProductController::listAction';
$params['categoryId'] = (int)$parts[1];
} elseif ($parts[0] == 'page') {
$controller = 'App\AtechNet\CoreBundle\Controller\PageController:::showAction';
$params['pageId'] = (int)$parts[1];
} elseif ($parts[0] == 'blog') {
if (isset($parts[2]) && $parts[2] == 'category') {
$controller = 'App\AtechNet\CoreBundle\Controller\PageController::listBlogAction';
$params['blogCategoryId'] = (int)$parts[1];
} else {
$controller = 'App\AtechNet\CoreBundle\Controller\PageController::showBlogAction';
$params['blogId'] = (int)$parts[1];
}
}
}
}
if ($controller == 'App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction') {
$target = '';
$query = [];
foreach ($parts as $part) {
$archivedSeoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
'keyword' => $part,
'language' => $defaultLanguageId,
'archived' => true,
'domain' => [$domainId, null],
]);
if ($archivedSeoUrl) {
$url = explode('=', $archivedSeoUrl->getQuery());
if ($url[0] == 'product_id') {
$target = 'product';
$query = [
'product_id' => $url[1],
];
} elseif ($url[0] == 'category_id') {
$target = 'category';
if (isset($query['path'])) {
$query['path'] .= '_' . $url[1];
} else {
$query = [
'path' => $url[1],
];
}
} elseif ($url[0] == 'blog_id') {
$target = 'blog';
$query = [
'blog_id' => $url[1],
];
} elseif ($url[0] == 'static_id') {
$target = 'page';
$query = [
'static_id' => $url[1],
];
}
} // If the URL consists of several parts, we assume that one of the parts is not archived
else {
$validSeoUrl = $this->getEntityManager()->getRepository(SeoUrl::class)->findOneBy([
'keyword' => $part,
'language' => $languageId,
'archived' => false,
'domain' => [$domainId, null],
]);
if ($validSeoUrl) {
$url = explode('=', $validSeoUrl->getQuery());
if ($url[0] == 'category_id') {
$target = 'category';
if (isset($query['path'])) {
$query['path'] .= '_' . $url[1];
} else {
$query = [
'path' => $url[1],
];
}
}
}
}
}
if (!empty($target)) {
return $this->redirect($this->url($request)->link($target, $query), 301);
}
if (
!empty($request->get('fs')) &&
strpos($request->getPathInfo(), 'product') !== false
) {
$request->getSession()->set('blankPage', true);
}
}
// Use locale based on user settings
if ($multiStore->isLanguageSwitched()) {
$params['_locale'] = $request->getLocale();
}
return $this->forward($controller, $params);
}
/**
* @param string $slug
* @param int $domainId
*/
private function redirectToStaticPage(string $slug, int $domainId)
{
if ( $slug == 'vratenie-tovaru' && $domainId == Domain::DOMAIN_ID_RT_SK ) {
return 36;
}
if ( $slug == 'termek-visszakuldese' && $domainId == Domain::DOMAIN_ID_RT_HU ) {
return 31;
}
if ( $slug == 'vraceni-zbozi' && $domainId == Domain::DOMAIN_ID_RT_CZ ) {
// return 67;
}
return 0;
}
}