src/Controller/Frontend/FrontendController.php line 834
<?phpnamespace App\Controller\Frontend;use App\Traits\UrlTrait;use ReCaptcha\ReCaptcha;use Symfony\Component\Mime\Address;use Doctrine\ORM\EntityManagerInterface;use Doctrine\ORM\Query\ResultSetMapping;use Webbamboo\SpinnersCommon\Entity\City;use Webbamboo\SpinnersCommon\Entity\Page;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Webbamboo\SpinnersCommon\Entity\Article;use Webbamboo\SpinnersCommon\Entity\Company;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\Mailer\MailerInterface;use Webbamboo\SpinnersCommon\Entity\Counties;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\HttpKernel\KernelInterface;use Webbamboo\SpinnersCommon\Entity\Allpagesmeta;use Symfony\Component\HttpFoundation\RequestStack;use Webbamboo\SpinnersCommon\Entity\Generalsettings;use Webbamboo\SpinnersCommon\Manager\RedirectManager;use Symfony\Component\Form\Extension\Core\Type\TextType;use Symfony\Component\Form\Extension\Core\Type\HiddenType;use Webbamboo\SpinnersCommon\Repository\ArticleRepository;use Symfony\Component\Form\Extension\Core\Type\TextareaType;use Symfony\Component\HttpFoundation\Session\SessionInterface;use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;class FrontendController extends AbstractController{use UrlTrait;protected EntityManagerInterface $em;protected SessionInterface $session;protected MailerInterface $mailer;protected CsrfTokenManagerInterface $csrfTokenManager;protected ArticleRepository $articleRepository;public function __construct(EntityManagerInterface $em,RequestStack $requestStack,MailerInterface $mailer,CsrfTokenManagerInterface $csrfTokenManager,ArticleRepository $articleRepository){$this->em = $em;$this->session = $requestStack->getSession();$this->mailer = $mailer;$this->csrfTokenManager = $csrfTokenManager;$this->articleRepository = $articleRepository;}protected $contactForm = null;protected $fields = array('name' => 'Namn','email' => 'Email','recaptcha' => 'ReCaptcha');protected $submittedData = array();protected $articlesDefaults = null;private function constructForm(Request $request){$session = $request->getSession();$data = $session->get('form-data') ? $session->get('form-data') : $this->submittedData;$errors = $session->get('form-errors') ? $session->get('form-errors') : array();$token = $this->csrfTokenManager->getToken('form_csrf');$form = $this->createFormBuilder($data)->add('name', TextType::class, array('required' => false, 'attr' => array('class' => in_array('Namn', $errors) ? 'form-control input-sm req-error' : 'form-control input-sm')))->add('email', TextType::class, array('required' => false, 'attr' => array('class' => in_array('Email', $errors) ? 'form-control input-sm req-error' : 'form-control input-sm')))->add('emailConfirmation', TextType::class, array('required' => false, 'attr' => array('class' => in_array('Email', $errors) ? 'form-control input-sm req-error' : 'form-control input-sm')))->add('date', TextType::class, array('required' => false, 'attr' => array('class' => in_array('Datum', $errors) ? 'form-control input-sm req-error' : 'form-control input-sm')))->add('sqfeet', TextType::class, array('required' => false, 'attr' => array('class' => in_array('Meter', $errors) ? 'form-control input-sm req-error' : 'form-control input-sm')))->add('zip', TextType::class, array('required' => false, 'attr' => array('class' => in_array('Postnr', $errors) ? 'form-control input-sm req-error zipSelect2' : 'form-control input-sm zipSelect2')))->add('other', TextareaType::class, array('required' => false))->add('token', HiddenType::class, array('data' => $token))->add('route', HiddenType::class)->add('routeparams', HiddenType::class)->add('siteVersion', HiddenType::class)->getForm();$this->contactForm = $form;$session->set('form-errors', array());}private function getFormView(Request $request){if (is_null($this->contactForm)) {$this->constructForm($request);}return $this->contactForm->createView();}private function getForm(Request $request){if (is_null($this->contactForm)) {$this->constructForm($request);}return $this->contactForm;}private function validateEmail($email){$email = str_replace(" ", "", $email);if (filter_var($email, FILTER_VALIDATE_EMAIL) &&strpos($email, "mail.ru") === false &&strpos($email, "enersets") === false &&strpos($email, "avalins") === false &&strpos($email, "efastes") === false &&strpos($email, "eric.jones.z.mail@gmail.com") === false) {return true;} else {return false;}}private function isSpamBody($string){$lowercasedContent = strtolower($string);$dictionary = ['viagra'];$isInSpamDictionary = function() use($dictionary, $lowercasedContent) {foreach($dictionary as $word){if(strpos($lowercasedContent, $word) !== false){return true;}}return false;};$contains_cyrillic = (bool) preg_match('/[\p{Cyrillic}]/u', $lowercasedContent);if($isInSpamDictionary() || $contains_cyrillic){return true;}return false;}private function getErrorMessages($data = array()){//Run basic spam filtering$fields = $this->fields;$errors = array();foreach($data as $key => $value){if(strpos($value, '>>>_') !== false){$errors[] = 'Spam';} elseif ($key == 'other') {if ($this->isSpamBody($value)) {$errors[] = 'Spam';}}}//Validate required fieldsforeach ($fields as $name => $string) {if ($name == 'email') {if (!$this->validateEmail($data['email']) || $data['email'] !== $data['emailConfirmation']) {$errors[] = $string;}} else {if (is_null($data[$name])) {$errors[] = $string;}}}return array_unique($errors);}private function afterSuccessfulSubmit($data, $sourceUrl, $ip, $userAgent){$noSpaceMail = str_replace(" ", "", $data['email']);$url = 'https://stat.webbamboo.net/item';$data = array('target' => $sourceUrl,'name' => $data["name"],'email' => $noSpaceMail,'data' => $data,'ip' => $ip,'user_agent' => $userAgent);// use key 'http' even if you send the request to https://...$options = array('http' => array('header' => "Content-type: application/x-www-form-urlencoded\r\n",'method' => 'POST','content' => http_build_query($data)));$context = stream_context_create($options);$result = file_get_contents($url, false, $context);}private function sendConfirmation($data){$fromEmail = "kundtjanst@flyttstadning-direkt.se";$formName = "www.Flyttstadning-Direkt.se";$subject = "Tack för att du har kontaktat Flyttstadning-Direkt kundservice";$email = (new TemplatedEmail())->from(new Address($fromEmail, $formName))->to(new Address($data['email'], $data['name']))->subject($subject)// path of the Twig template to render->htmlTemplate('Frontend/confirmation.email.twig')// pass variables (name => value) to the template->context(['data' => $data,'subject' => $subject]);$email->getHeaders()->addTextHeader('X-MC-ReturnPathDomain', 'return-path.flyttstadning-direkt.se');$this->mailer->send($email);}#[Route("/form/parse", name: 'spinner_form_parse', methods: ['POST'])]public function parseformAction(Request $request){$this->constructForm($request);$form = $this->contactForm;$session = $request->getSession();if ($request->isMethod('POST')) {$form->handleRequest($request);$data = $form->getData();$noSpaceMail = str_replace(" ", "", $data['email']);//var_dump($this->get('request')->request->get('g-recaptcha-response'));die();$recaptchaResponse = $request->request->get('g-recaptcha-response');$recaptcha = new ReCaptcha('6LekmfwSAAAAAEczRJjfsornV2iFtgANNFocb7LV');$resp = $recaptcha->verify($recaptchaResponse);if ($resp->isSuccess()) {// verified!$data['recaptcha'] = 'ReCaptcha';} else {$data['recaptcha'] = null;//var_dump($errors = $resp->getErrorCodes());die();}$routeParameters = array();parse_str($data['routeparams'], $routeParameters);$errors = $this->getErrorMessages($data);if (empty($errors)) {$url = array("%C3%85", "%C3%A5","%C3%84", "%C3%A4","%C3%96", "%C3%B6",);$char = array("Å", "å","Ä", "ä","Ö", "ö",);$currentUrl = 'http://flyttstadning-direkt.se' . str_replace($url, $char, $this->generateUrl($data['route'], $routeParameters)) . '#contactForm';$cleanZip = trim(str_replace(" ", "", $data['zip']));$subject = 'Offert - Flyttstädning: '.$data['name'].' - '.intval($cleanZip).' ()';$email = (new TemplatedEmail())->from(new Address('form@flyttstadning-direkt.se', 'Flyttstadning-Direkt.se'))->to('smoth3r3d@gmail.com', 'mats@alyhr.se', 'lokedesu@gmail.com', 'oskar@alyhr.se')->replyTo(new Address($noSpaceMail, $data['name']))->subject($subject)// path of the Twig template to render->htmlTemplate('Frontend/email.html.twig')// pass variables (name => value) to the template->context(['data' => $data,'url' => $currentUrl,'ip' => $request->getClientIp(),'subject' => $subject]);$email->getHeaders()->addTextHeader('X-MC-ReturnPathDomain', 'return-path.flyttstadning-direkt.se');$this->mailer->send($email);//Success message in Flashbag//$session->set('form-errors', array());$session->set('form-data', array());$succString = 'Flyttstadning Direkt tackar dig för ditt intresse!';$this->addFlash('form-success', $succString);try{$this->afterSuccessfulSubmit($data, $currentUrl, $request->getClientIp(), $request->headers->get('User-Agent'));$this->sendConfirmation($data);} catch (\Exception $ex) {}} else {$session->set('form-errors', $errors);$session->set('form-data', $data);//Error messages in Flashbag$errString = 'Vänligen fyll i dom obligatoriska fälten: ' . implode(', ', $errors);$this->addFlash('form-error', $errString);}//Render the controllerswitch ($data['route']) {case 'spinner_front_city':$countypermalink = $routeParameters['countypermalink'];$citypermalink = $routeParameters['citypermalink'];return $this->redirect($this->generateUrl('spinner_front_city', array('citypermalink' => $citypermalink,'countypermalink' => $countypermalink)) . '#contactForm');break;case 'spinner_front_county':$countypermalink = $routeParameters['countypermalink'];return $this->redirect($this->generateUrl('spinner_front_county', array('countypermalink' => $countypermalink)) . '#contactForm');break;case 'spinner_front_company':$citypermalink = $routeParameters['citypermalink'];$companypermalink = $routeParameters['companypermalink'];return $this->redirect($this->generateUrl('spinner_front_company', array('citypermalink' => $citypermalink,'companypermalink' => $companypermalink)) . '#contactForm');break;case 'spinner_front_index':return $this->redirect($this->generateUrl('spinner_front_index', array()) . '#contactForm');break;case 'spinner_front_pages':$pagepermalink = $routeParameters['pagepermalink'];return $this->redirect($this->generateUrl('spinner_front_pages', array('pagepermalink' => $pagepermalink)) . '#contactForm');break;case 'spinner_front_articles_single':return $this->redirect($this->generateUrl('spinner_front_articles_single', array('articlepermalink' => $routeParameters['articlepermalink'])) . '#contactForm');break;}}}//Common functionsprivate function distance($lat1, $lon1, $lat2, $lon2, $unit){$theta = $lon1 - $lon2;$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));$dist = acos($dist);$dist = rad2deg($dist);$miles = $dist * 60 * 1.1515;$unit = strtoupper($unit);if ($unit == "K") {return ($miles * 1.609344);} elseif ($unit == "N") {return ($miles * 0.8684);} else {return $miles;}}private function generatePermalink($text){$t = strtolower($text);$url=array("%C3%85","%C3%A5","%C3%84","%C3%A4","%C3%96","%C3%B6","%E9","%E9");$char=array("Å","å","Ä","ä","Ö","ö","é","é");$str = str_replace($char, $url, $t);$str_new = str_replace(array(" ", ","), "", $str);return $str_new;}private function getMenuHeading(){return $this->em->getRepository(Generalsettings::class)->findOneBySetting('MenuHeading');}private function getAnalytics(){$AnalyticsCode = $this->em->getRepository(Generalsettings::class)->findOneBySetting('Analytics');return str_replace(array('<p>', '</p>', '<br />'), '', html_entity_decode($AnalyticsCode->getValueSanitized()));}private function getFormLabels(){$formData = $this->em->getRepository(Generalsettings::class)->findOneBySetting('formData');return unserialize($formData->getValue());}private function getCounties(){return $this->em->getRepository(Counties::class)->findAll();}private function getPages(){return $this->em->getRepository(Page::class)->findAll();}private function getHeaderAlt(){$HeaderAltObj = $this->em->getRepository(Generalsettings::class)->findOneBySetting('HeaderAlt');return str_replace(array('<p>', '</p>', '<br />'), '', html_entity_decode($HeaderAltObj->getValue()));}private function getCities($cid){$query = $this->em->createQuery("SELECT c FROM Webbamboo\SpinnersCommon\Entity\City c WHERE c.county = $cid ORDER BY c.name ASC");return $query->getResult();}private function getMostPopulatedCities($county){$cid = $county->getId();$query = $this->em->createQuery("SELECT c FROM Webbamboo\SpinnersCommon\Entity\City c WHERE c.county = $cid ORDER BY c.population DESC")->setMaxResults(10);return $query->getResult();}private function getClosestCities($city){$ID = $city->getId();//var_dump($ID, $city->getName());die();$latitude = $city->getLatitude();$longitude = $city->getLongitude();$cityResponse = array();$limit = 5;///Do the dew$rsm = new ResultSetMapping();// build rsm here$sqlT = "SELECT *, latitude, longitude, SQRT( POW(69.1 * (latitude - :lat), 2) + POW(69.1 * (:lon - longitude) * COS(latitude / 57.3), 2)) AS distance FROM City WHERE id != $ID ORDER BY distance LIMIT 0, $limit";$params = array('lat' => $latitude,'lon' => $longitude,);$stmt = $this->em->getConnection()->prepare($sqlT);if (version_compare(phpversion(), '7.3', '<')) {$result = $stmt->executeQuery($params);$citiesDistant = $result->fetchAllAssociative();}else{$result = $stmt->executeQuery($params);$citiesDistant = $result->fetchAllAssociative();}foreach ($citiesDistant as $city) {$objectCity = $this->em->getRepository(City::class)->findOneById($city['id']);$cityResponse[] = $objectCity;}return $cityResponse;}private function getCompanyResponse($city){$companies = $city->getCompanies();$latitude = $city->getLatitude();$longitude = $city->getLongitude();$companyResponse = array();if (count($companies) < 20) {$limit = 20;///Do the dew$rsm = new ResultSetMapping();// build rsm here$sqlT = "SELECT *, latitude, longitude, SQRT( POW(69.1 * (latitude - :lat), 2) + POW(69.1 * (:lon - longitude) * COS(latitude / 57.3), 2)) AS distance FROM Company ORDER BY distance LIMIT 0, $limit";$params = array('lat' => $latitude,'lon' => $longitude,);$stmt = $this->em->getConnection()->prepare($sqlT);if (version_compare(phpversion(), '7.3', '<')) {$result = $stmt->executeQuery($params);$companiesDistant = $result->fetchAllAssociative();}else{$result = $stmt->executeQuery($params);$companiesDistant = $result->fetchAllAssociative();}}foreach ($companies as $company) {$ccity = $company->getCityobj();$c = array();$c['id'] = $company->getId();$c['name'] = $company->getName();$c['phone'] = $company->getPhone();$c['street'] = $company->getStreet();$c['zip'] = $company->getZip();$c['cityname'] = $ccity->getName();//$c['distance'] = round($this->distance($company->getLatitude(), $company->getLongitude(), $city->getLatitude(), $city->getLongitude(), 'K'), 0);$c['distance'] = '';$c['permalink'] = $company->getPermalinkP();$c['citypermalink'] = $ccity->getPermalinkP();$c['countypermalink'] = $ccity->getCounty()->getPermalinkP();$c['description'] = $company->getDescription();//echo '<pre>';//var_dump($c['name'], $company->getLatitude(), $company->getLongitude(), $city->getLatitude(), $city->getLongitude(),$this->distance($company->getLatitude(), $company->getLongitude(), $city->getLatitude(), $city->getLongitude(), 'K'));$companyResponse[$company->getName()] = $c;}//Simupate getPermalinkP$url=array("%C3%85","%C3%A5","%C3%84","%C3%A4","%C3%96","%C3%B6",);$char=array("Å","å","Ä","ä","Ö","ö",);if (isset($companiesDistant)) {foreach ($companiesDistant as $company) {//var_dump($company['cityobj_id']);if (!is_null($company['cityobj_id'])) {$ccity = $this->em->getRepository(City::class)->findOneById($company['cityobj_id']);$c = array();$c['id'] = (int)$company['id'];$c['name'] = $company['name'];$c['phone'] = $company['phone'];$c['street'] = $company['street'];$c['zip'] = $company['zip'];$c['cityname'] = $ccity->getName();$c['distance'] = round($this->distance($company['latitude'], $company['longitude'], $city->getLatitude(), $city->getLongitude(), 'K'), 0);$c['permalink'] = str_replace($url, $char, $company['permalink']);$c['citypermalink'] = $ccity->getPermalinkP();$c['countypermalink'] = $ccity->getCounty()->getPermalinkP();$c['description'] = $company['description'] == 'none' ? '' : $company['description'];if (!isset($companyResponse[$company['name']]) && count($companyResponse) <= 20) {$companyResponse[$company['name']] = $c;}}}}return $companyResponse;}private function getCurrentCounty($countypermalink){return $this->em->getRepository(Counties::class)->findOneByPermalink($this->generatePermalink(strtolower($countypermalink)));}private function getCurrentCity($citypermalink, $county){//with join maybe$query = $this->em->getRepository(City::class)->createQueryBuilder('c')->innerJoin('c.county', 'co')->where('co.id = :countyId')->andWhere('c.permalink = :permalink')->setParameters(array('countyId' => $county->getId(),'permalink' => $this->generatePermalink(strtolower(str_replace(array("Å","Ä","Ö"), array("å","ä","ö",), $citypermalink))),))->getQuery();$city = $query->getResult();return $city[0];//return $this->em->getRepository('SpinnerBundle:City')->findOneByPermalink($this->generatePermalink(strtolower(str_replace(array("Å","Ä","Ö"),array("å","ä","ö",),$citypermalink))));}private function getCurrentPage($pagepermalink){return $this->em->getRepository(Page::class)->findOneByPermalink($this->generatePermalink($pagepermalink));}private function getCurrentArticle($articlepermalink){//var_dump($this->generatePermalink($articlepermalink));return $this->em->getRepository(Article::class)->findOneByPermalink($articlepermalink);}private function getCurrentCompany($companypermalink){return $this->em->getRepository(Company::class)->findOneByPermalink($this->generatePermalink(strtolower(str_replace(array("Å","Ä","Ö"), array("å","ä","ö",), $companypermalink))));}private function paginate($query){$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query, $fetchJoinCollection = false);//$paginator// ->getQuery()// ->setFirstResult($pageSize * ($currentPage - 1)) // set the offset// ->setMaxResults($pageSize); // set the limitreturn $paginator;}private function getArticlesDefaults(){$settings = $this->em->getRepository('Webbamboo\SpinnersCommon\Entity\Articlesettings')->findAll();$defaults = array();foreach ($settings as $s) {$defaults[$s->getSetting()] = $s->getValue();}return $defaults;}#[Route("/", name: 'spinner_front_index', methods: ['GET'], options: ['utf8' => true])]public function indexAction(Request $request){$h1 = $this->em->getRepository(Generalsettings::class)->findOneBySetting('H1Index');$metatitle = $this->em->getRepository(Generalsettings::class)->findOneBySetting('MetaTitleIndex');$metadescription = $this->em->getRepository(Generalsettings::class)->findOneBySetting('MetaDescriptionIndex');$content = $this->em->getRepository(Generalsettings::class)->findOneBySetting('ContentIndex')->getValue();$WTMeta = $this->em->getRepository(Generalsettings::class)->findOneBySetting('WebmasterToolsMeta');$wt = str_replace(array('<', '>', '<p>', '</p>'), array('<', '>', '', ''), $WTMeta->getValue());return $this->render('Frontend/index.html.twig',array('menuHeading' => $this->getMenuHeading(),'counties' => $this->getCounties(),'h1' => $h1->getValue(),'metatitle' => $metatitle->getValue(),'metadescription' => $metadescription->getValue(),'content' => $content,'pages' => $this->getPages(),'WTMeta' => $wt,'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels(),'defaults' => $this->getArticlesDefaults(),));}#[Route('/Flyttstädning-{countypermalink}', name: 'spinner_front_county', methods: ['GET'], options: ['utf8' => true])]#[Route('/flyttstädning-{countypermalink}', name: 'spinner_front_county_lowercase', methods: ['GET'], options: ['utf8' => true])]public function countyAction($countypermalink, Request $request){return $this->render('Frontend/county.html.twig',array('counties' => $this->getCounties(),'activecounty' => $this->getCurrentCounty($countypermalink),'cities' => $this->getCities($this->getCurrentCounty($countypermalink)->getId()),'menuHeading' => $this->getMenuHeading(),'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels(),'defaults' => $this->getArticlesDefaults(),'mostpopulated' => $this->getMostPopulatedCities($this->getCurrentCounty($countypermalink))));}#[Route('/Flyttstädning-{countypermalink}/Alla-orter', name: 'spinner_front_county_all', methods: ['GET'], options: ['utf8' => true], priority: 15)]public function countyallAction($countypermalink, Request $request){$currentCounty = $this->getCurrentCounty($countypermalink);$data = $this->em->getRepository('Webbamboo\SpinnersCommon\Entity\Allcitiesmeta')->findOneByCountyid($currentCounty->getId());return $this->render('Frontend/countyall.html.twig',array('counties' => $this->getCounties(),'data' => $data,'activecounty' => $currentCounty,'cities' => $this->getCities($currentCounty->getId()),'menuHeading' => $this->getMenuHeading(),'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels(),'defaults' => $this->getArticlesDefaults()));}#[Route('/Flyttstädning-{countypermalink}/image/{imagename}', name: 'spinner_front_county_thumbnail', methods: ['GET'], options: ['utf8' => true])]public function countythumbnailAction(Request $request, $countypermalink, $imagename, KernelInterface $appKernel){$county = $this->getCurrentCounty($countypermalink);if ($request->query->get('preview')) {$manual = true;} else {$manual = $county->getManual();}$imagename = $manual ? $county->getManualThumbnail().'-thumbnail.png' : $county->getThumbnail()->getPath().'-thumbnail.png';$imagepath = $appKernel->getProjectDir().'/public/county/'.$imagename;$headers = array('Content-Type' => 'image/png','Content-Disposition' => 'inline; filename="'.$imagename.'"');return new Response(file_get_contents($imagepath), 200, $headers);}#[Route('/Flyttstädning-{citypermalink}/{companypermalink}/image/{imagename}', name: 'spinner_front_company_thumbnail', methods: ['GET'], options: ['utf8' => true])]public function companythumbnailAction(Request $request,$citypermalink,$companypermalink,$imagename,KernelInterface $appKernel){$company = $this->getCurrentCompany($companypermalink, $citypermalink);if ($request->query->get('preview')) {$manual = true;} else {$manual = $company->getManual();}$imagename = $manual ? $company->getManualThumbnail().'-thumbnail.png' : $company->getThumbnail()->getPath().'-thumbnail.png';$imagepath = $appKernel->getProjectDir().'/public/company/'.$imagename;$headers = array('Content-Type' => 'image/png','Content-Disposition' => 'inline; filename="'.$imagename.'"');return new Response(file_get_contents($imagepath), 200, $headers);}#[Route('/{countypermalink}/Flyttstädning-{citypermalink}', name: 'spinner_front_city', methods: ['GET'], options: ['utf8' => true])]#[Route('/{countypermalink}/flyttstädning-{citypermalink}', name: 'spinner_front_city_lowercase', methods: ['GET'], options: ['utf8' => true])]public function cityAction($countypermalink, $citypermalink, Request $request){$currentCounty = $this->getCurrentCounty($countypermalink);$currentCity = $this->getCurrentCity($citypermalink, $currentCounty);$stickyCompany = $this->em->getRepository(Company::class)->findOneByName('FlyttstädningsAkuten AB');return $this->render('Frontend/city.html.twig',array('menuHeading' => $this->getMenuHeading(),'counties' => $this->getCounties(),'activecounty' => $currentCounty,'city' => $currentCity,'companies' => $this->getCompanyResponse($currentCity),'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'cities' => $this->getCities($currentCounty->getId()),'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels(),'defaults' => $this->getArticlesDefaults(),'closestcities' => $this->getClosestCities($currentCity),'sticky' => $stickyCompany));}#[Route('/{countypermalink}/Flyttstädning-{citypermalink}/image/{imagename}', name: 'spinner_front_city_thumbnail', methods: ['GET'], options: ['utf8' => true])]public function citythumbnailAction(Request $request,$countypermalink,$citypermalink,$imagename,KernelInterface $appKernel){$currentCounty = $this->getCurrentCounty($countypermalink);$city = $this->getCurrentCity($citypermalink, $currentCounty);if ($request->query->get('preview')) {$manual = true;} else {$manual = $city->getManual();}$imagename = ( $manual && $city->getManualThumbnail() ) ? $city->getManualThumbnail().'-thumbnail.png' : $city->getThumbnail()->getPath().'-thumbnail.png';$imagepath = $appKernel->getProjectDir().'/public/city/'.$imagename;$headers = array('Content-Type' => 'image/png','Content-Disposition' => 'inline; filename="'.$imagename.'"');return new Response(file_get_contents($imagepath), 200, $headers);}#[Route('/p/{pagepermalink}', name: 'spinner_front_pages', methods: ['GET'], options: ['utf8' => true], priority: 1)]public function pageAction($pagepermalink, Request $request){return $this->render('Frontend/page.html.twig',array('menuHeading' => $this->getMenuHeading(),'page' => $this->getCurrentPage($pagepermalink),'counties' => $this->getCounties(),'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels(),'defaults' => $this->getArticlesDefaults(),'isPage' => true));}private function getCompanyCity($latitude, $longitude, $citypermalink){//var_dump($latitude, $longitude, $citypermalink);die();$cityResponse = array();$limit = 1;///Do the dew$rsm = new ResultSetMapping();// build rsm here//var_dump($citypermalink, $latitude, $longitude);$lowerPermalink = strtolower($citypermalink);$sqlT = "SELECT *, latitude, longitude, SQRT( POW(69.1 * (latitude - :lat), 2) + POW(69.1 * (:lon - longitude) * COS(latitude / 57.3), 2)) AS distance FROM City WHERE permalink = :permalink OR permalink = :lower ORDER BY distance LIMIT 0, $limit";$params = array('lat' => $latitude,'lon' => $longitude,'permalink' => $this->generatePermalink(str_replace(array("Å","Ä","Ö"), array("å","ä","ö",), $citypermalink)),'lower' => $this->generatePermalink(strtolower(str_replace(array("Å","Ä","Ö"), array("å","ä","ö",), $citypermalink))));$stmt = $this->em->getConnection()->prepare($sqlT);if (version_compare(phpversion(), '7.3', '<')) {$result = $stmt->executeQuery($params);$citiesDistant = $result->fetchAllAssociative();}else{$result = $stmt->executeQuery($params);$citiesDistant = $result->fetchAllAssociative();}$cityID = $citiesDistant[0]['id'];return $this->em->getRepository(City::class)->findOneById($cityID);}#[Route('/Flyttstädning-{citypermalink}/{companypermalink}', name: 'spinner_front_company', methods: ['GET'], options: ['utf8' => true])]public function companyAction($citypermalink,$companypermalink,Request $request,RedirectManager $redirectManager){$company = $this->getCurrentCompany($companypermalink, $citypermalink);if ($company->getCityobj()->getPermalink() == $this->generatePermalink(strtolower(str_replace(array("Å","Ä","Ö"), array("å","ä","ö",), $citypermalink)))) {$currentCity = $company->getCityobj();} else {$currentCity = $this->getCompanyCity($company->getLatitude(), $company->getLongitude(), $citypermalink);}if ($redirectManager = $redirectManager->work($company->getId(), $currentCity->getId())) {return $this->redirect($redirectManager, 301);}//FlyttstädningsAkuten AB entry$stickyCompany = $this->em->getRepository(Company::class)->findOneByName('FlyttstädningsAkuten AB');return $this->render('Frontend/company.html.twig',array('menuHeading' => $this->getMenuHeading(),'counties' => $this->getCounties(),'activecounty' => $currentCity->getCounty(),'city' => $currentCity,'company' => $company,'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'cities' => $this->getCities($currentCity->getCounty()->getId()),'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels(),'defaults' => $this->getArticlesDefaults(),'closestcities' => $this->getClosestCities($currentCity),'sticky' => $stickyCompany));}#[Route('/a/', name: 'spinner_front_articles', methods: ['GET'], options: ['utf8' => true])]#[Route('/a/page{pagenumber}', name: 'spinner_front_articles_pages', methods: ['GET'], options: ['utf8' => true])]public function articlesloopAction($pagenumber=1){$paginator = $this->articleRepository->findPaginated($pagenumber);$metaData = $this->em->getRepository(Allpagesmeta::class)->findOneByPagenumber($pagenumber);$defaults = $this->getArticlesDefaults();if ($metaData) {$metaDescription = $metaData->getMetadescription() ? $metaData->getMetadescription() : $defaults['MetaDescriptionArticlesLoop'];$metaTitle = $metaData->getMetatitle() ? $metaData->getMetatitle() : $defaults['MetaTitleArticlesLoop'];} else {$metaDescription = $defaults['MetaDescriptionArticlesLoop'];$metaTitle = $defaults['MetaTitleArticlesLoop'];}return $this->render('Frontend/articlesloop.html.twig',array('articles' => $paginator->getIterator(),'totalItems' => $paginator->count(),'pagesCount' => ceil(count($paginator) / 20),'defaults' => $defaults,'currentPage' => $pagenumber,'counties' => $this->getCounties(),'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => htmlentities($this->getHeaderAlt()),'metaDescription' => $metaDescription,'metaTitle' => $metaTitle));}#[Route('/a/{articlepermalink}', name: 'spinner_front_articles_single', methods: ['GET'], options: ['utf8' => true])]public function articleAction($articlepermalink, Request $request){$article = $this->getCurrentArticle($articlepermalink);if($article->getStatus() === Article::STATUS_DRAFT){$this->denyAccessUnlessGranted('ROLE_ADMIN');}return $this->render('Frontend/page.html.twig',array('menuHeading' => $this->getMenuHeading(),'page' => $article,'counties' => $this->getCounties(),'pages' => $this->getPages(),'Analytics' => $this->getAnalytics(),'headerAlt' => $this->getHeaderAlt(),'defaults' => $this->getArticlesDefaults(),'isPage' => false,'form' => $this->getFormView($request),'formLabels' => $this->getFormLabels()));}}