initial commit
This commit is contained in:
472
Classes/Controller/MapController.php
Normal file
472
Classes/Controller/MapController.php
Normal file
@ -0,0 +1,472 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace A2G\A2gTravelBlog\Controller;
|
||||
|
||||
use \A2G\A2gMaps\Domain\Traits\InjectMarkerRepositoryTrait;
|
||||
use A2G\A2gTravelBlog\Domain\Traits\{
|
||||
InjectMapEntryRepositoryTrait,
|
||||
InjectTravelAuthorRepositoryTrait,
|
||||
InjectImageServiceTrait,
|
||||
InjectTravelPostRepositoryTrait,
|
||||
InjectTravelCategoryRepositoryTrait,
|
||||
};
|
||||
use A2G\A2gMaps\Utility\MapConfigUtility;
|
||||
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
|
||||
use TYPO3\CMS\Extbase\Object\ObjectManager;
|
||||
use TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext;
|
||||
use TYPO3\CMS\Fluid\View\TemplateView;
|
||||
use TYPO3\CMS\Fluid\View\StandaloneView;
|
||||
use T3G\AgencyPack\Blog\Constants;
|
||||
use TYPO3\CMS\Extbase\Mvc\Request;
|
||||
use TYPO3\CMS\Core\Utility\MathUtility;
|
||||
use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry;
|
||||
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
|
||||
|
||||
/**
|
||||
* This file is part of the "Products" Extension for TYPO3 CMS.
|
||||
*
|
||||
* For the full copyright and license information, please read the
|
||||
* LICENSE.txt file that was distributed with this source code.
|
||||
*
|
||||
* (c) 2021 Raphael Martin <raphy.martin@gmail.com>, none
|
||||
*/
|
||||
|
||||
/**
|
||||
* MapController
|
||||
*/
|
||||
class MapController extends ActionController {
|
||||
|
||||
use InjectMarkerRepositoryTrait;
|
||||
use InjectMapEntryRepositoryTrait;
|
||||
use InjectTravelAuthorRepositoryTrait;
|
||||
use InjectTravelPostRepositoryTrait;
|
||||
use InjectTravelCategoryRepositoryTrait;
|
||||
use InjectImageServiceTrait;
|
||||
|
||||
private static $mapIcons = null;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param UriBuilder $uriBuilder
|
||||
* @param TemplateView $sourceView
|
||||
* @param type $arguments
|
||||
* @param type $actionName
|
||||
* @param type $controllerName
|
||||
* @return string
|
||||
*/
|
||||
static private function generateContent(UriBuilder $uriBuilder, TemplateView &$sourceView, $arguments = [], $actionName = 'popup', $controllerName = 'Map'): StandaloneView {
|
||||
$templatePath = $controllerName . '/' . ucfirst($actionName);
|
||||
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
|
||||
$templateRootPaths = $sourceView->getTemplateRootPaths();
|
||||
$context = $objectManager->get(ControllerContext::class);
|
||||
$request = $objectManager->get(Request::class);
|
||||
$context->setRequest($request);
|
||||
$context->setUriBuilder($uriBuilder);
|
||||
/**
|
||||
* @var StandaloneView $view
|
||||
*/
|
||||
$view = $objectManager->get(StandaloneView::class);
|
||||
$view->setControllerContext($context);
|
||||
$view->setLayoutRootPaths($sourceView->getLayoutRootPaths());
|
||||
$view->setTemplateRootPaths($templateRootPaths);
|
||||
$view->setPartialRootPaths($sourceView->getPartialRootPaths());
|
||||
$view->setTemplate($templatePath);
|
||||
$arguments['today'] = (new \DateTime())->format('d.m.Y');
|
||||
|
||||
$view->assignMultiple($arguments);
|
||||
return $view;
|
||||
}
|
||||
|
||||
private function setMapMarkerIcons() {
|
||||
if (self::$mapIcons === null) {
|
||||
self::$mapIcons = [];
|
||||
$markers = $this->markerRepository->findAll();
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getMapIcon() !== null) {
|
||||
self::$mapIcons[] = [
|
||||
'uid' => 'i-' . $marker->getUid(),
|
||||
'icon' => $this->imageService->getImageUri($this->imageService->applyProcessingInstructions($this->imageService->getImage('', $marker->getMapIcon(), false), []), true)
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* action map
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapAction() {
|
||||
$layerIds = explode(',', $this->settings['layers']);
|
||||
$layerConfigs = MapConfigUtility::getMapLayerConfig($layerIds);
|
||||
if ($this->settings['useLayerSwitcher'] === '1') {
|
||||
for ($i = 0; $i < count($layerConfigs); $i++) {
|
||||
$layerConfigs[$i]['active'] = true;
|
||||
}
|
||||
}
|
||||
$this->uriBuilder->setTargetPageType(1652369512);
|
||||
$centerLat = 0.0;
|
||||
$centerLon = 0.0;
|
||||
switch ((int) $this->settings['mapType']) {
|
||||
case 0:
|
||||
$markers = $this->mapEntryRepository->findAll();
|
||||
$markerUri = $this->uriBuilder->uriFor('allMapMarkers', null, null, null, 'MapConfig');
|
||||
$zoom = 1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
$travelPost = $this->travelPostRepository->findByUid((int) $this->configurationManager->getContentObject()->data['pid']);
|
||||
if ($travelPost !== null && $travelPost->getDoktype() === Constants::DOKTYPE_BLOG_POST) {
|
||||
$markers = $travelPost->getRelMapEntries();
|
||||
foreach ($markers as $marker) {
|
||||
$centerLat = $centerLat + $marker->getLatitude();
|
||||
$centerLon = $centerLon + $marker->getLongitude();
|
||||
}
|
||||
$centerLat = $centerLat / count($markers);
|
||||
$centerLon = $centerLon / count($markers);
|
||||
$markerUri = $this->uriBuilder->uriFor('postMapMarkers', null, null, null, 'MapConfig');
|
||||
$zoom = 6;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
$cats = explode(',', $this->settings['showCategories']);
|
||||
$args = ['tx_a2gtravelblog_mapconfig' => ['categories' => $cats]];
|
||||
$travelPosts = $this->travelPostRepository->getFromCategoryUids($cats);
|
||||
$this->uriBuilder->setArguments($args);
|
||||
|
||||
$markerUri = $this->uriBuilder->uriFor('mapMarkersFromCategories', null, null, null, 'MapConfig');
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $travelPost) {
|
||||
$markers[$travelPost->getUid()] = $travelPost->getRelMapEntries()->current();
|
||||
$centerLat = $centerLat + $markers[$travelPost->getUid()]->getLatitude();
|
||||
$centerLon = $centerLon + $markers[$travelPost->getUid()]->getLongitude();
|
||||
}
|
||||
$centerLat = $centerLat / count($markers);
|
||||
$centerLon = $centerLon / count($markers);
|
||||
$zoom = 3;
|
||||
break;
|
||||
case 3:
|
||||
$authorUids = explode(',', $this->settings['showAuthors']);
|
||||
$args = ['tx_a2gtravelblog_mapconfig' => ['authors' => $authorUids]];
|
||||
$travelPosts = $this->travelPostRepository->getFromAuthorUids($authorUids);
|
||||
$this->uriBuilder->setArguments($args);
|
||||
$markerUri = $this->uriBuilder->uriFor('mapMarkersFromAuthor', null, null, null, 'MapConfig');
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $travelPost) {
|
||||
$markers[$travelPost->getUid()] = $travelPost->getRelMapEntries()->current();
|
||||
$centerLat = $centerLat + $markers[$travelPost->getUid()]->getLatitude();
|
||||
$centerLon = $centerLon + $markers[$travelPost->getUid()]->getLongitude();
|
||||
}
|
||||
$centerLat = $centerLat / count($markers);
|
||||
$centerLon = $centerLon / count($markers);
|
||||
$zoom = 2;
|
||||
break;
|
||||
default:
|
||||
$markers = [];
|
||||
$zoom = 1;
|
||||
break;
|
||||
}
|
||||
if ((int) $this->settings['zoom'] > 0) {
|
||||
$zoom = (int) $this->settings['zoom'];
|
||||
}
|
||||
if (count($markers) > 0) {
|
||||
$showMarkers = true;
|
||||
} else {
|
||||
$showMarkers = false;
|
||||
}
|
||||
$this->view->assignMultiple([
|
||||
'mapId' => 'a2g-map-' . uniqid(),
|
||||
'countMapLayers' => count($layerIds),
|
||||
'mapConfig' => \GuzzleHttp\json_encode(MapConfigUtility::getMapConfig(
|
||||
$layerIds,
|
||||
null,
|
||||
$showMarkers === true ? $markerUri : null,
|
||||
null,
|
||||
$zoom,
|
||||
18, $centerLon, $centerLat,
|
||||
true, true, true))
|
||||
]);
|
||||
}
|
||||
|
||||
private function getMarkersFromCategories(array $uids) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function getMarkers(int $uid = 0) {
|
||||
$travelPost = $this->travelPostRepository->findByUid($uid);
|
||||
if ($travelPost !== null && $travelPost->getDoktype() === Constants::DOKTYPE_BLOG_POST) {
|
||||
$markers = [];
|
||||
foreach ($travelPost->getRelMapEntries() as $post) {
|
||||
$markers[] = $post;
|
||||
}
|
||||
} else {
|
||||
$markers = [];
|
||||
$posts = $this->travelPostRepository->findAll();
|
||||
foreach ($posts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
}
|
||||
return $markers;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* action mapMarkersFromTag
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapMarkersFromTagAction() {
|
||||
$travelPosts = $this->travelPostRepository->getFromTagUids([(int)$_GET['tx_a2gtravelblog_mapconfig']['tag']]);
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker], 'popup')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapMarkersFromAuthorAction() {
|
||||
$travelPosts = $this->travelPostRepository->getFromAuthorUids($_GET['tx_a2gtravelblog_mapconfig']['authors']);
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker], 'popup')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapMarkersFromCategoriesAction() {
|
||||
|
||||
$travelPosts = $this->travelPostRepository->getFromCategoryUids($_GET['tx_a2gtravelblog_mapconfig']['categories']);
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker], 'popup')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function postMapMarkersAction() {
|
||||
$markers = $this->getMarkers((int) $this->configurationManager->getContentObject()->data['uid']);
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['mapEntry' => $marker], 'popupPost')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function allMapMarkersAction() {
|
||||
$markers = $this->getMarkers();
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker])->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
public function activeCountryGeojsonAction(){
|
||||
$travelCats=[];
|
||||
foreach($_GET['tx_a2gtravelblog_mapconfig']['categories'] as $uid){
|
||||
$travelCats[] = $this->travelCategoryRepository->findByUid((int)$uid);
|
||||
|
||||
}
|
||||
$isoCodes = [];
|
||||
foreach($travelCats as $travelCat){
|
||||
$isoCodes[$travelCat->getIsoA2CountryCode()] = null;
|
||||
}
|
||||
return \GuzzleHttp\json_encode(MapConfigUtility::getCountryFeatureCollectionsFromIsoCodeList($isoCodes));
|
||||
}
|
||||
|
||||
public function activeCountriesGeojsonAction(){
|
||||
$travelCats = $this->travelCategoryRepository->findAll();
|
||||
$isoCodes = [];
|
||||
foreach($travelCats as $travelCat){
|
||||
$isoCodes[$travelCat->getIsoA2CountryCode()] = self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'category' => $travelCat], 'popupCategory')->render();
|
||||
}
|
||||
return \GuzzleHttp\json_encode(MapConfigUtility::getCountryFeatureCollectionsFromIsoCodeList($isoCodes));
|
||||
}
|
||||
|
||||
/**
|
||||
* action mapConfig
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapConfigAction() {
|
||||
|
||||
$this->setMapMarkerIcons();
|
||||
$this->view->assignMultiple([
|
||||
'mapIcons' => \GuzzleHttp\json_encode(self::$mapIcons)
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* action ajaxListAction
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function ajaxListAction() {
|
||||
|
||||
}
|
||||
|
||||
// /**
|
||||
// * action show
|
||||
// *
|
||||
// * @param Ingredients $ingredient
|
||||
// * @return string|object|null|void
|
||||
// */
|
||||
// public function showAction(Ingredients $ingredient) {
|
||||
// $titleProvider = GeneralUtility::makeInstance(A2gPageTitleProvider::class);
|
||||
//
|
||||
// if($this->settings['pageTitleSuffix'] !== null && $this->settings['pageTitleSuffix'] !== '' && (strlen($ingredient->getTitle()) + strlen($this->settings['pageTitleSuffix'])) < 66 ){
|
||||
// $pageTitle = $ingredient->getTitle(). ' ' . $this->settings['pageTitleSuffix'];
|
||||
// } else {
|
||||
// $pageTitle = $ingredient->getTitle();
|
||||
// }
|
||||
// $titleProvider->setTitle($pageTitle);
|
||||
// $contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
|
||||
// $description = $contentObject->crop($ingredient->getDescription(), 125 . '|...|' . true);
|
||||
//
|
||||
// $uri = $this->uriBuilder->reset()->setCreateAbsoluteUri(true)->setTargetPageUid(
|
||||
// $GLOBALS['TSFE']->id)->uriFor('show', ['ingredient' => $ingredient], 'Ingredients', 'a2gProducts', 'ingredientsdetail');
|
||||
//
|
||||
// $metaTagManager = GeneralUtility::makeInstance(MetaTagManagerRegistry::class);
|
||||
//
|
||||
// $metaTagManager->getManagerForProperty('robots')->addProperty('robots', 'index, folow');
|
||||
// $metaTagManager->getManagerForProperty('og:type')->addProperty('og:type', 'website');
|
||||
// $metaTagManager->getManagerForProperty('twitter:card')->addProperty('twitter:card', 'summary_large_image');
|
||||
//
|
||||
// if ($ingredient->getTitle() !== '') {
|
||||
// $metaTagManager->getManagerForProperty('title')->addProperty('title', $pageTitle);
|
||||
// $metaTagManager->getManagerForProperty('og:title')->addProperty('og:title', $pageTitle);
|
||||
// $metaTagManager->getManagerForProperty('twitter:title')->addProperty('twitter:title', $pageTitle);
|
||||
// }
|
||||
// if ($ingredient->getDescription() !== '') {
|
||||
// $metaTagManager->getManagerForProperty('description')->addProperty('description', $description);
|
||||
// $metaTagManager->getManagerForProperty('og:description')->addProperty('og:description', $description);
|
||||
// $metaTagManager->getManagerForProperty('twitter:description')->addProperty('twitter:description', $description);
|
||||
// }
|
||||
// $metaTagManager->getManagerForProperty('og:url')->addProperty('og:url', $uri);
|
||||
// $metaTagManager->getManagerForProperty('twitter:url')->addProperty('twitter:url', $uri);
|
||||
//
|
||||
// if ($ingredient->getImage() !== null) {
|
||||
// $processedImage = $this->imageService->applyProcessingInstructions(
|
||||
// $this->imageService->getImage('', $ingredient->getImage(), false),
|
||||
// ['width' => '
|
||||
// 1200', 'height' => '630c']
|
||||
// );
|
||||
// $metaTagManager->getManagerForProperty('twitter:image')->addProperty('twitter:image', $this->imageService->getImageUri($processedImage, true));
|
||||
// $metaTagManager->getManagerForProperty('og:image')->addProperty('og:image', $this->imageService->getImageUri($processedImage, true));
|
||||
// }
|
||||
// $this->view->assign('ingredient', $ingredient);
|
||||
// }
|
||||
}
|
Reference in New Issue
Block a user