initial commit

This commit is contained in:
origin 2023-12-04 16:40:27 +01:00
commit 813b2d3da4
133 changed files with 50635 additions and 0 deletions

View 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);
// }
}

View File

@ -0,0 +1,123 @@
<?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 TravelPostController 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 timeline
*
* @return string|object|null|void
*/
public function timelineAction() {
$args=[];
switch ((int) $this->settings['timelineType']) {
case 2:
$cats = explode(',', $this->settings['showCategories']);
$travelPosts = $this->travelPostRepository->getFromCategoryUids($cats);
break;
case 3:
$authorUids = explode(',', $this->settings['showAuthors']);
$travelPosts = $this->travelPostRepository->getFromAuthorUids($authorUids);
$args['authors'] = $this->travelAuthorRepository->getFromUids($authorUids);
break;
default:
$travelPosts = $this->travelPostRepository->findAll();
break;
}
$args['posts'] = $travelPosts;
$this->view->assignMultiple($args);
}
}

View File

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Model;
use A2G\A2gMaps\Domain\Model\MapEntry as BaseMapEntry;
use TYPO3\CMS\Extbase\Domain\Model\FileReference;
use TYPO3\CMS\Extbase\Annotation\ORM\{
Cascade,
Lazy
};
use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
/**
* This file is part of the "altogether 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
*/
/**
* MapEntry
*/
class MapEntry extends BaseMapEntry {
/**
* relTravelPost
*
* @Cascade("remove")
* @Lazy
* @var TravelPost
*/
protected $relTravelPost = null;
/**
*
* @return TravelPost
*/
public function getRelTravelPost(): TravelPost {
if ($this->relTravelPost instanceof LazyLoadingProxy) {
$this->relTravelPost = $this->relTravelPost->_loadRealInstance();
}
return $this->relTravelPost;
}
/**
*
* @param TravelPost $relTravelPost
* @return void
*/
public function setRelTravelPost(TravelPost $relTravelPost): void {
$this->relTravelPost = $relTravelPost;
}
}

View File

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Model;
use T3G\AgencyPack\Blog\Domain\Model\Author;
use A2G\A2gTravelBlog\Domain\Model\TravelMarker;
use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
/**
* 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
*/
/**
* TravelAuthor
*/
class TravelAuthor extends Author {
/**
* relMapMarker
*
* @var TravelMarker
* @TYPO3\CMS\Extbase\Annotation\ORM\Cascade("remove")
* @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $relMapMarker = null;
/**
* Returns the relMapMarker
*
* @return TravelMarker $relMapMarker
*/
public function getRelMapMarker() {
if ($this->relMapMarker instanceof LazyLoadingProxy) {
$this->relMapMarker = $this->relMapMarker->_loadRealInstance();
}
return $this->relMapMarker;
}
/**
* Sets the relMapMarker
*
* @param TravelMarker $relMapMarker
* @return void
*/
public function setRelMapMarker(TravelMarker $relMapMarker) {
$this->relMapMarker = $relMapMarker;
}
}

View File

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Model;
use T3G\AgencyPack\Blog\Domain\Model\Category;
/**
* 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
*/
/**
* TravelCategory
*/
class TravelCategory extends Category {
/**
* isoA2CountryCode
*
* @var string
*/
protected $isoA2CountryCode = '';
public function getIsoA2CountryCode(): string {
return $this->isoA2CountryCode;
}
public function setIsoA2CountryCode(string $isoA2CountryCode): void {
$this->isoA2CountryCode = $isoA2CountryCode;
}
}

View File

@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Model;
use A2G\A2gMaps\Domain\Model\Marker;
use A2G\A2gTravelBlog\Domain\Model\TravelAuthor;
use TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy;
/**
* 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
*/
/**
* TravelMarker
*/
class TravelMarker extends Marker {
/**
* relTravelAuthor
*
* @var TravelAuthor
* @TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $relTravelAuthor = null;
/**
* Returns the relTravelAuthor
*
* @return TravelAuthor $relTravelAuthor
*/
public function getRelTravelAuthor() {
if ($this->relTravelAuthor instanceof LazyLoadingProxy) {
$this->relTravelAuthor = $this->relTravelAuthor->_loadRealInstance();
}
return $this->relTravelAuthor;
}
/**
* Sets the relTravelAuthor
*
* @param TravelAuthor $relTravelAuthor
* @return void
*/
public function setRelTravelAuthor(TravelAuthor $relTravelAuthor) {
$this->relTravelAuthor = $relTravelAuthor;
}
}

View File

@ -0,0 +1,86 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Model;
use \T3G\AgencyPack\Blog\Domain\Model\Post;
use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
/**
* 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
*/
/**
* TravelPost
*/
class TravelPost extends Post {
/**
* relMapEntries
*
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\A2G\A2gTravelBlog\Domain\Model\MapEntry>
*/
protected $relMapEntries = null;
/**
* Post constructor.
*/
public function __construct()
{
parent::__construct();
$this->initializeObject();
}
/**
* initializeObject
*/
public function initializeObject(): void
{
$this->relMapEntries = new ObjectStorage();
}
/**
* @return ObjectStorage
*/
public function getRelMapEntries(): ObjectStorage
{
return $this->relMapEntries;
}
/**
* @param ObjectStorage $relMapEntries
* @return TravelPost
*/
public function setRelMapEntries($relMapEntries): self
{
$this->relMapEntries = $relMapEntries;
return $this;
}
/**
* @param MapEntry $relMapEntry
* @return TravelPost
*/
public function addRelMapEntry(MapEntry $relMapEntry): self
{
$this->relMapEntries->attach($relMapEntry);
return $this;
}
/**
* @param MapEntry $relMapEntry
*
* @return TravelPost
*/
public function removeRelMapEntry(MapEntry $relMapEntry): self
{
$this->relMapEntries->detach($relMapEntry);
return $this;
}
}

View File

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Repository;
use TYPO3\CMS\Core\Utility\MathUtility;
/**
* 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
*/
/**
* The repository for MapEntry
*/
class MapEntryRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
/**
* @var array
*/
// protected $defaultOrderings = [
// 'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
// ];
static protected function mapInt($value){
if(MathUtility::canBeInterpretedAsInteger($value)){
return (int)$value;
}
return null;
}
public function getFromCategoryUids(array $uids){
$uidsFiltered = array_filter(array_map('self::mapInt', $uids));
$query = $this->createQuery();
$query->matching(
$query->logicalOr($query->in('relTravelPost.categories.uid', $uidsFiltered)));
return $query->execute();
}
public function initializeObject() {
$querySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$querySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($querySettings);
}
}

View File

@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Repository;
use TYPO3\CMS\Core\Utility\MathUtility;
/**
* This file is part of the "Travel Blog" 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
*/
/**
* The repository for TravelAuthor
*/
class TravelAuthorRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
/**
* @var array
*/
// protected $defaultOrderings = [
// 'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
// ];
static protected function mapInt($value){
if(MathUtility::canBeInterpretedAsInteger($value)){
return (int)$value;
}
return null;
}
public function getFromUids(array $uids){
$uidsFiltered = array_filter(array_map('self::mapInt', $uids));
$query = $this->createQuery();
$query->matching(
$query->logicalOr($query->in('uid', $uidsFiltered)));
return $query->execute();
}
public function initializeObject() {
$querySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$querySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($querySettings);
}
}

View File

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Repository;
use TYPO3\CMS\Core\Utility\MathUtility;
/**
* 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
*/
/**
* The repository for TravelPost
*/
class TravelCategoryRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
/**
* @var array
*/
// protected $defaultOrderings = [
// 'sorting' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING
// ];
//
static protected function mapInt($value){
if(MathUtility::canBeInterpretedAsInteger($value)){
return (int)$value;
}
return null;
}
public function initializeObject() {
$querySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$querySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($querySettings);
}
}

View File

@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Repository;
use TYPO3\CMS\Core\Utility\MathUtility;
/**
* 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
*/
/**
* The repository for TravelPost
*/
class TravelPostRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
/**
* @var array
*/
protected $defaultOrderings = [
'crdate' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
];
static protected function mapInt($value){
if(MathUtility::canBeInterpretedAsInteger($value)){
return (int)$value;
}
return null;
}
public function getFromCategoryUids(array $uids){
$uidsFiltered = array_filter(array_map('self::mapInt', $uids));
$query = $this->createQuery();
$query->matching($query->in('categories.uid', $uidsFiltered));
return $query->execute();
}
public function getFromAuthorUids(array $uids){
$uidsFiltered = array_filter(array_map('self::mapInt', $uids));
$query = $this->createQuery();
$query->matching($query->in('authors.uid', $uidsFiltered));
return $query->execute();
}
public function getFromTagUids(array $uids){
$uidsFiltered = array_filter(array_map('self::mapInt', $uids));
$query = $this->createQuery();
$query->matching($query->in('tags.uid', $uidsFiltered));
return $query->execute();
}
public function initializeObject() {
$querySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
$querySettings->setRespectStoragePage(false);
$this->setDefaultQuerySettings($querySettings);
}
}

View File

@ -0,0 +1,35 @@
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Domain\Traits;
use TYPO3\CMS\Extbase\Service\ImageService;
/**
* Description of InjectImageServiceTrait
*
* @author Raphael Martin
*/
trait InjectImageServiceTrait {
/**
* imageService
*
* @var ImageService
*/
protected $imageService = null;
/**
* @param ImageService $imageService
*/
public function injectImageService(ImageService $imageService) {
$this->imageService = $imageService;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace A2G\A2gTravelBlog\Domain\Traits;
use A2G\A2gTravelBlog\Domain\Repository\MapEntryRepository;
/**y
* Description of InjectMapEntryRepositoryTrait
*
* @author Raphael Martin
*/
trait InjectMapEntryRepositoryTrait {
/**
*
* @var MapEntryRepository
*/
protected $mapEntryRepository = null;
/**
* @param MapEntryRepository $mapEntryRepository
*/
public function injectMapEntryRepository(MapEntryRepository $mapEntryRepository) {
$this->mapEntryRepository = $mapEntryRepository;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace A2G\A2gTravelBlog\Domain\Traits;
use A2G\A2gTravelBlog\Domain\Repository\TravelAuthorRepository;
/**y
* Description of InjectTravelAuthorRepositoryTrait
*
* @author Raphael Martin
*/
trait InjectTravelAuthorRepositoryTrait {
/**
*
* @var TravelAuthorRepository
*/
protected $travelAuthorRepository = null;
/**
* @param TravelAuthorRepository $travelAuthorRepository
*/
public function injectTravelAuthorRepository(TravelAuthorRepository $travelAuthorRepository) {
$this->travelAuthorRepository = $travelAuthorRepository;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace A2G\A2gTravelBlog\Domain\Traits;
use A2G\A2gTravelBlog\Domain\Repository\TravelCategoryRepository;
/**
* Description of InjectIngredientsRepositoryTrait
*
* @author Raphael Martin
*/
trait InjectTravelCategoryRepositoryTrait {
/**
*
* @var TravelCategoryRepository
*/
protected $travelCategoryRepository = null;
/**
* @param TravelCategoryRepository $travelCategoryRepository
*/
public function injectTravelCategoryRepository(TravelCategoryRepository $travelCategoryRepository) {
$this->travelCategoryRepository = $travelCategoryRepository;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace A2G\A2gTravelBlog\Domain\Traits;
use A2G\A2gTravelBlog\Domain\Repository\TravelPostRepository;
/**
* Description of InjectIngredientsRepositoryTrait
*
* @author Raphael Martin
*/
trait InjectTravelPostRepositoryTrait {
/**
*
* @var TravelPostRepository
*/
protected $travelPostRepository = null;
/**
* @param TravelPostRepository $travelPostRepository
*/
public function injectTravelPostRepository(TravelPostRepository $travelPostRepository) {
$this->travelPostRepository = $travelPostRepository;
}
}

View File

@ -0,0 +1,64 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Evaluation;
/**
* This file is part of the "tt_address" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
use A2G\A2gTravelBlog\Utility\EvalcoordinatesUtility;
/**
* Class for validation/evaluation of longitude to be used in 'eval' of TCA
* removes everything except numbers and digit-sign (dot). Fills coordinates up with zeros if too short
*/
class LatitudeEvaluation
{
/**
* JavaScript code for client side validation/evaluation
*
* @return string JavaScript code for client side validation/evaluation
*/
public function returnFieldJS()
{
// Nice to have: add javascript-code for evalution on blur
return '
return value;
';
}
/**
* Server-side validation/evaluation on saving the record
* Tests if latutide is between -90 and +90, fills up with zeros to mach decimal (14,12) in database
*
* @param string $value The field value to be evaluated
* @return string Evaluated field value
*/
public function evaluateFieldValue($value)
{
// test if we have any latitude
if ($value && $value !== '') {
return EvalcoordinatesUtility::formatLatitude($value);
}
return null;
}
/**
* Server-side validation/evaluation on opening the record
*
* @param array $parameters Array with key 'value' containing the field value from the database
* @return string Evaluated field value
*/
public function deevaluateFieldValue(array $parameters)
{
// test if we have any latitude
if ($parameters['value'] && $parameters['value'] !== '') {
$parameters['value'] = EvalcoordinatesUtility::formatLatitude($parameters['value']);
}
return $parameters['value'];
}
}

View File

@ -0,0 +1,64 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Evaluation;
/**
* This file is part of the "tt_address" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
use A2G\A2gTravelBlog\Utility\EvalcoordinatesUtility;
/**
* Class for validation/evaluation of Longitude to be used in 'eval' of TCA
* removes everything except numbers and digit-sign (dot). Fills coordinates up with zeros if too short
*/
class LongitudeEvaluation
{
/**
* JavaScript code for client side validation/evaluation
*
* @return string JavaScript code for client side validation/evaluation
*/
public function returnFieldJS()
{
// Nice to have: add javascript-code for evaluation on blur
return '
return value;
';
}
/**
* Server-side validation/evaluation on saving the record
* Tests if latitude is between -90 and +90, fills up with zeros to mach decimal (14,12) in database
*
* @param string $value The field value to be evaluated
* @return string Evaluated field value
*/
public function evaluateFieldValue($value)
{
// test if we have any longitude
if ($value && $value !== '') {
return EvalcoordinatesUtility::formatLongitude($value);
}
return null;
}
/**
* Server-side validation/evaluation on opening the record
*
* @param array $parameters Array with key 'value' containing the field value from the database
* @return string Evaluated field value
*/
public function deevaluateFieldValue(array $parameters)
{
// test if we have any longitude
if ($parameters['value'] && $parameters['value'] != '') {
$parameters['value'] = EvalcoordinatesUtility::formatLongitude($parameters['value']);
}
return $parameters['value'];
}
}

View File

@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\PageTitle;
use TYPO3\CMS\Core\PageTitle\AbstractPageTitleProvider;
/**
* Description of A2gPageTitleProvider
*
* @author Raphael Martin
*/
class A2gPageTitleProvider extends AbstractPageTitleProvider
{
/**
* @param string $title
*/
public function setTitle(string $title)
{
$this->title = $title;
}
}

View File

@ -0,0 +1,65 @@
<?php
declare(strict_types=1);
namespace A2G\A2gProducts\Utility;
use TYPO3\CMS\Extbase\Annotation as Extbase;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
/**
* Description of Canonical
*
* @author Raphael Martin raphael@web-crossing.com
*/
class CanonicalUtility {
/**
* objectManager
*
* @var \TYPO3\CMS\Extbase\Object\ObjectManager
* @Extbase\Inject
*/
protected $objectManager = null;
/**
* plugin
*
* @var string
*/
static private $plugin = 'tx_a2gproducts_a2gproductsdetail';
/**
* uidParamName
*
* @var string
*/
static private $uidParamName = 'resource';
/**
* setCanonical
*
* @param type $href
*/
public function setCanonical(&$href) {
$this->objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$main = GeneralUtility::_GET(self::$plugin);
if ($main[self::$uidParamName]) {
$uriBuilder = $this->objectManager->get(UriBuilder::class);
$uriBuilder->setCreateAbsoluteUri(true);
$uriBuilder->setArguments([self::$plugin => [self::$uidParamName => $main[self::$uidParamName]]]);
$configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
$settings = $configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT);
if (isset($settings['plugin.'][self::$plugin.'.']['settings.']['canonical']) && $settings['plugin.'][self::$plugin.'.']['settings.']['canonical'] !== 0) {
$uriBuilder->setTargetPageUid($settings['plugin.'][self::$plugin.'.']['settings.']['canonical']);
$href = $uriBuilder->build();
}
}
}
}

View File

@ -0,0 +1,95 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Utility;
/**
* This file is part of the "tt_address" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
/**
* Class EvalcoordinatesUtility
*/
class EvalcoordinatesUtility
{
const LATITUDE_UPPER = '90.00000000';
const LONGITUDE_UPPER = '180.00000000';
/**
* @param float $coordinate
* @return float evaluated and well-formed coordinate
*/
public static function formatLongitude(float $coordinate)
{
return self::validate((string)$coordinate, self::LONGITUDE_UPPER);
}
/**
* @param float $coordinate
* @return float evaluated and well-formed coordinate
*/
public static function formatLatitude(float $coordinate)
{
return self::validate((string)$coordinate, self::LATITUDE_UPPER);
}
/**
* @param string $coordinate
* @param string $upperRange
* @return string
*/
protected static function validate($coordinate, string $upperRange): string
{
if ($coordinate === '') {
return '.00000000';
}
// test if value is negative
$negative = '';
if ($coordinate[0] === '-') {
$negative = '-';
}
// remove all chars not being digits and point
// therefore we will get a number
$coordinate = preg_replace("/[^\d\.]/", '', $coordinate);
// split up string at first occurrence decimal point without losing data
$integerPart = strstr($coordinate, '.', true);
$decimalPart = strstr($coordinate, '.');
// if coordinate is given as integer (no decimal point)
if ($integerPart === false) {
$integerPart = $coordinate;
}
if ($decimalPart === false) {
$decimalPart = '00';
}
// remove all points from decimal-part
$decimalPart = preg_replace("/[^\d]/", '', $decimalPart);
// fill up with zeros or shorten to match our goal of decimal(latitude: 10,8 and longitude: 11,8) in DB
if (\strlen($decimalPart) >= 8) {
$decimalPart = substr($decimalPart, 0, 8);
} else {
$decimalPart = str_pad($decimalPart, 8, '0', STR_PAD_RIGHT);
}
// concatenate the whole string to a well-formed longitude and return
$coordinate = $integerPart . '.' . $decimalPart;
// test if value is in the possible range. longitude can be -180 to +180.
// latitude can be -90 to +90
// At this point, our minus, if there, is stored to 'negative'
// therefore we just test if integerpart is bigger than 90
if ($coordinate > $upperRange) {
$coordinate = $upperRange;
}
// reapply signed/unsigned and return
return $negative . $coordinate;
}
}

View File

@ -0,0 +1,237 @@
<?php
declare(strict_types=1);
namespace A2G\A2gTravelBlog\Utility;
use TYPO3\CMS\Extbase\Annotation as Extbase;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
/**
* Description of Canonical
*
* @author Raphael Martin raphael@web-crossing.com
*/
class MapConfigUtility {
/**
* uidParamName
*
* @var string
*/
static private $mapLayerConfigs = [
1 => [
"layer" => "osm",
"config" => [
],
"label"=>"osm_map_layer"
],
10 => [
"layer" => "stamen",
"config" => [
"layer" => "terrain"
],
"label" => "stamen_map_terrain"
],
11 => [
"layer" => "stamen",
"config" => [
"layer" => "watercolor"
],
"label" => "stamen_map_watercolor"
],
12 => [
"layer" => "stamen",
"config" => [
"layer" => "toner"
],
"label" => "stamen_map_toner"
],
100 => [
"layer" => "thunderforest",
"config" => [
"layer" => "cycle"
],
"label" => "thunderforest_map_cycle"
],
101 => [
"layer" => "thunderforest",
"config" => [
"layer" => "transport"
],
"label" => "thunderforest_map_transport"
],
102 => [
"layer" => "thunderforest",
"config" => [
"layer" => "landscape"
],
"label" => "thunderforest_map_landscape"
],
103 => [
"layer" => "thunderforest",
"config" => [
"layer" => "outdoors"
],
"label" => "thunderforest_map_outdoors"
],
104 => [
"layer" => "thunderforest",
"config" => [
"layer" => "atlas"
],
"label" => "thunderforest_map_atlas"
],
105 => [
"layer" => "thunderforest",
"config" => [
"layer" => "transport-dark"
],
"label" => "thunderforest_map_transport-dark"
],
106 => [
"layer" => "thunderforest",
"config" => [
"layer" => "spinal-map"
],
"label" => "thunderforest_map_spinal"
],
107 => [
"layer" => "thunderforest",
"config" => [
"layer" => "pioneer"
],
"label" => "thunderforest_map_pioneer"
],
108 => [
"layer" => "thunderforest",
"config" => [
"layer" => "neighbourhood"
],
"label" => "thunderforest_map_neighbourhood"
],
109 => [
"layer" => "thunderforest",
"config" => [
"layer" => "mobile-atlas"
],
"label" => "thunderforest_map_mobile-atlas"
],
200 => [
"layer" => "maptiler",
"config" => [
"layer" => "basic"
],
"label" => "maptiler_map_basic"
],
201 => [
"layer" => "maptiler",
"config" => [
"layer" => "basic-4326"
],
"label" => "maptiler_map_basic-4326"
],
202 => [
"layer" => "maptiler",
"config" => [
"layer" => "bright"
],
"label" => "maptiler_map_bright"
],
203 => [
"layer" => "maptiler",
"config" => [
"layer" => "openstreetmap"
],
"label" => "maptiler_map_openstreetmap"
],
204 => [
"layer" => "maptiler",
"config" => [
"layer" => "outdoor"
],
"label" => "maptiler_map_outdoor"
],
205 => [
"layer" => "maptiler",
"config" => [
"layer" => "pastel"
],
"label" => "maptiler_map_pastel"
],
206 => [
"layer" => "maptiler",
"config" => [
"layer" => "hybrid"
],
"label" => "maptiler_map_hybrid"
],
207 => [
"layer" => "maptiler",
"config" => [
"layer" => "streets"
],
"label" => "maptiler_map_streets"
],
208 => [
"layer" => "maptiler",
"config" => [
"layer" => "toner"
],
"label" => "maptiler_map_toner"
],
209 => [
"layer" => "maptiler",
"config" => [
"layer" => "topo"
],
"label" => "maptiler_map_topo"
],
210 => [
"layer" => "maptiler",
"config" => [
"layer" => "topographique"
],
"label" => "maptiler_map_topographique"
],
211 => [
"layer" => "maptiler",
"config" => [
"layer" => "voyager"
],
"label" => "maptiler_map_voyager"
],
212 => [
"layer" => "maptiler",
"config" => [
"layer" => "winter"
],
"label" => "maptiler_map_winter"
],
];
/**
* setCanonical
*
* @param type $href
*/
public static function getMapLayerConfig(array $mapLayerConfigIds) {
$out = [];
foreach($mapLayerConfigIds as $id){
$out[]=self::$mapLayerConfigs[$id];
}
return $out;
}
}

View File

@ -0,0 +1,73 @@
<?php
declare(strict_types = 1);
/*
* This file is part of the package t3g/blog.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
namespace A2G\A2gTravelBlog\ViewHelpers;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper;
use A2G\A2gMaps\Utility\MapConfigUtility;
class MapViewHelper extends AbstractTagBasedViewHelper
{
public function __construct()
{
$this->tagName = 'div';
parent::__construct();
}
/**
* Arguments Initialization.
*
* @throws \TYPO3\CMS\Fluid\Core\ViewHelper\Exception
* @throws \TYPO3Fluid\Fluid\Core\ViewHelper\Exception
*/
public function initializeArguments(): void
{
parent::initializeArguments();
$this->registerUniversalTagAttributes();
$this->registerArgument('category', 'int', 'categoryUid', true);
}
/**
* @return string the HTML <img>-Tag of the gravatar
*/
public function render(): string
{
// <div class="a2g-map"
// data-map-config='{"zoom":2,"maxZoom":18,
// "centerLon":0,"centerLat":0,
// "style": {
// "featureOverlay":{
// "stroke":{
// "color": "rgba(240,145,48,0.7)",
// "width": 4
// }
// }
// },
// "mapLayers":[{
// "layer": "country",
// "config": {
// "layer": "country",
// "countryGeoSource": "<f:uri.action action="activeCountriesGeojson" pluginName="MapConfig" controller="Map" extensionName="A2gTravelBlog" pageType="1652369512"></f:uri.action>"
// },
// "label": "country (free)",
// "active": true
// },{"layer":"osm","config":[],"label":"osm_map_layer","active":true}],
// "zoomSlider":true,
// "fullScreen":true}'></div>
//
/** @var GravatarProvider $gravatarProvider */
// $gravatarProvider = GeneralUtility::makeInstance(GravatarProvider::class);
// $src = $gravatarProvider->getAvatarUrl((new Author())->setEmail($this->arguments['email']));
$this->tag->addAttribute('data-map-config', '{}');
return $this->tag->render();
}
}

2
Configuration/.htaccess Normal file
View File

@ -0,0 +1,2 @@
Order deny,allow
Deny from all

View File

@ -0,0 +1,22 @@
<?php
declare(strict_types=1);
return [
A2G\A2gTravelBlog\Domain\Model\TravelPost::class => [
'tableName' => 'pages',
],
A2G\A2gTravelBlog\Domain\Model\TravelAuthor::class => [
'tableName' => 'tx_blog_domain_model_author',
],
A2G\A2gTravelBlog\Domain\Model\MapEntry::class => [
'tableName' => 'tx_a2gmaps_domain_model_mapentry',
],
A2G\A2gTravelBlog\Domain\Model\TravelMarker::class => [
'tableName' => 'tx_a2gmaps_domain_model_marker',
],
A2G\A2gTravelBlog\Domain\Model\TravelCategory::class => [
'tableName' => 'sys_category',
]
];

View File

@ -0,0 +1,338 @@
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Function</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.mapType>
<label>mapType</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">travel map overview</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">travel post detail map</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">travel post categorie map</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">travel post author map</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
</items>
</config>
<onChange>reload</onChange>
</settings.mapType>
<settings.showAuthors>
<label>show authors</label>
<config>
<type>group</type>
<allowed>tx_blog_domain_model_author</allowed>
<fieldControl>
<editPopup>
<disabled>false</disabled>
</editPopup>
<addRecord>
<disabled>false</disabled>
</addRecord>
<listModule>
<disabled>false</disabled>
</listModule>
</fieldControl>
</config>
<displayCond>FIELD:settings.mapType:=:3</displayCond>
</settings.showAuthors>
<settings.showCategories>
<label>show categories</label>
<config>
<type>group</type>
<allowed>sys_category</allowed>
<fieldControl>
<editPopup>
<disabled>false</disabled>
</editPopup>
<addRecord>
<disabled>false</disabled>
</addRecord>
<listModule>
<disabled>false</disabled>
</listModule>
</fieldControl>
</config>
<displayCond>FIELD:settings.mapType:=:2</displayCond>
</settings.showCategories>
<settings.controllsPositions>
<label>position from map controll stuff</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">hide</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">top</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">bottom</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">both</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
</items>
</config>
</settings.controllsPositions>
<settings.useLayerSwitcher>
<label>use layer switcher ( slider )</label>
<config>
<type>check</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">yes</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
</config>
<onChange>reload</onChange>
</settings.useLayerSwitcher>
<settings.layerSwitcherValue>
<label>layer switcher init value ( slider )</label>
<config>
<type>input</type>
<eval>trim,int</eval>
<size>3</size> </config>
<displayCond>FIELD:settings.useLayerSwitcher:=:1</displayCond>
</settings.layerSwitcherValue>
<settings.zoom>
<label>map zoom ( 0 = auto zoom )</label>
<config>
<type>input</type>
<eval>trim,int</eval>
<size>2</size>
<range type="array">
<lower>0</lower>
<upper>18</upper>
</range>
<default>2</default>
<slider>
<step>1</step>
<width>200</width>
</slider>
</config>
</settings.zoom>
<settings.maxZoom>
<label>map max zoom</label>
<config>
<type>input</type>
<eval>trim,int</eval>
<size>2</size>
<range type="array">
<lower>1</lower>
<upper>18</upper>
</range>
<default>18</default>
<slider>
<step>1</step>
<width>200</width>
</slider>
</config>
</settings.maxZoom>
<settings.showLayerSelect>
<label>show layer select</label>
<config>
<type>check</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">yes</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
</config>
</settings.showLayerSelect>
<settings.showMyPositionButton>
<label>show my position button ( checkbox )</label>
<config>
<type>check</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">yes</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
</config>
</settings.showMyPositionButton>
<settings.showRemoveMarkerButton>
<label>show remove marker button</label>
<config>
<type>check</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">yes</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
</config>
</settings.showRemoveMarkerButton>
<settings.useFullscreenButton>
<label>show fullscreen button</label>
<config>
<type>check</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">yes</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
</config>
</settings.useFullscreenButton>
<settings.useZoomSlider>
<label>show zoom slider</label>
<config>
<type>check</type>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">yes</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
</items>
</config>
</settings.useZoomSlider>
<settings.layers>
<label>Selectable Layers</label>
<config>
<type>select</type>
<renderType>selectMultipleSideBySide</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">osm</numIndex>
<numIndex index="1">1</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">stamen terrain</numIndex>
<numIndex index="1">10</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">stamen watercolor</numIndex>
<numIndex index="1">11</numIndex>
</numIndex>
<numIndex index="3" type="array">
<numIndex index="0">stamen toner</numIndex>
<numIndex index="1">12</numIndex>
</numIndex>
<numIndex index="4" type="array">
<numIndex index="0">thunderfores openCycleMap</numIndex>
<numIndex index="1">100</numIndex>
</numIndex>
<numIndex index="5" type="array">
<numIndex index="0">thunderfores transport</numIndex>
<numIndex index="1">101</numIndex>
</numIndex>
<numIndex index="6" type="array">
<numIndex index="0">thunderfores landscape</numIndex>
<numIndex index="1">102</numIndex>
</numIndex>
<numIndex index="7" type="array">
<numIndex index="0">thunderfores outdoors</numIndex>
<numIndex index="1">103</numIndex>
</numIndex>
<numIndex index="8" type="array">
<numIndex index="0">thunderfores atlas</numIndex>
<numIndex index="1">104</numIndex>
</numIndex>
<numIndex index="9" type="array">
<numIndex index="0">thunderfores transport-dark</numIndex>
<numIndex index="1">105</numIndex>
</numIndex>
<numIndex index="10" type="array">
<numIndex index="0">thunderfores spinal-map</numIndex>
<numIndex index="1">106</numIndex>
</numIndex>
<numIndex index="11" type="array">
<numIndex index="0">thunderfores pioneer</numIndex>
<numIndex index="1">107</numIndex>
</numIndex>
<numIndex index="12" type="array">
<numIndex index="0">thunderfores neighbourhout</numIndex>
<numIndex index="1">108</numIndex>
</numIndex>
<numIndex index="13" type="array">
<numIndex index="0">thunderfores mobile-atlas</numIndex>
<numIndex index="1">109</numIndex>
</numIndex>
<numIndex index="14" type="array">
<numIndex index="0">maptiler basic</numIndex>
<numIndex index="1">200</numIndex>
</numIndex>
<numIndex index="15" type="array">
<numIndex index="0">maptiler basic (EPSG:4326)</numIndex>
<numIndex index="1">201</numIndex>
</numIndex>
<numIndex index="16" type="array">
<numIndex index="0">maptiler bright</numIndex>
<numIndex index="1">202</numIndex>
</numIndex>
<numIndex index="17" type="array">
<numIndex index="0">maptiler openstreetmap</numIndex>
<numIndex index="1">203</numIndex>
</numIndex>
<numIndex index="18" type="array">
<numIndex index="0">maptiler outdoor</numIndex>
<numIndex index="1">204</numIndex>
</numIndex>
<numIndex index="19" type="array">
<numIndex index="0">maptiler pastel</numIndex>
<numIndex index="1">205</numIndex>
</numIndex>
<numIndex index="20" type="array">
<numIndex index="0">maptiler satelit hybrid</numIndex>
<numIndex index="1">206</numIndex>
</numIndex>
<numIndex index="21" type="array">
<numIndex index="0">maptiler streets</numIndex>
<numIndex index="1">207</numIndex>
</numIndex>
<numIndex index="22" type="array">
<numIndex index="0">maptiler toner</numIndex>
<numIndex index="1">208</numIndex>
</numIndex>
<numIndex index="23" type="array">
<numIndex index="0">maptiler topo</numIndex>
<numIndex index="1">209</numIndex>
</numIndex>
<numIndex index="24" type="array">
<numIndex index="0">maptiler topographique</numIndex>
<numIndex index="1">210</numIndex>
</numIndex>
<numIndex index="25" type="array">
<numIndex index="0">maptiler voyager</numIndex>
<numIndex index="1">211</numIndex>
</numIndex>
<numIndex index="26" type="array">
<numIndex index="0">maptiler winter</numIndex>
<numIndex index="1">212</numIndex>
</numIndex>
</items>
<minitems>1</minitems>
</config>
</settings.layers>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>

View File

@ -0,0 +1,76 @@
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Function</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<settings.timelineType>
<label>timeline type</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items type="array">
<numIndex index="0" type="array">
<numIndex index="0">all posts in timeline</numIndex>
<numIndex index="1">0</numIndex>
</numIndex>
<numIndex index="1" type="array">
<numIndex index="0">travel post categorie timeline</numIndex>
<numIndex index="1">2</numIndex>
</numIndex>
<numIndex index="2" type="array">
<numIndex index="0">travel post author timeline</numIndex>
<numIndex index="1">3</numIndex>
</numIndex>
</items>
</config>
<onChange>reload</onChange>
</settings.timelineType>
<settings.showAuthors>
<label>show authors</label>
<config>
<type>group</type>
<allowed>tx_blog_domain_model_author</allowed>
<fieldControl>
<editPopup>
<disabled>false</disabled>
</editPopup>
<addRecord>
<disabled>false</disabled>
</addRecord>
<listModule>
<disabled>false</disabled>
</listModule>
</fieldControl>
</config>
<displayCond>FIELD:settings.timelineType:=:3</displayCond>
</settings.showAuthors>
<settings.showCategories>
<label>show categories</label>
<config>
<type>group</type>
<allowed>sys_category</allowed>
<fieldControl>
<editPopup>
<disabled>false</disabled>
</editPopup>
<addRecord>
<disabled>false</disabled>
</addRecord>
<listModule>
<disabled>false</disabled>
</listModule>
</fieldControl>
</config>
<displayCond>FIELD:settings.timelineType:=:2</displayCond>
</settings.showCategories>
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>

View File

@ -0,0 +1,5 @@
services:
_defaults:
autowire: true
autoconfigure: true
public: false

View File

@ -0,0 +1,155 @@
<?php //
/*
* This file is part of the package t3g/blog.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
if (!defined('TYPO3')) {
die('Access denied.');
}
$ll = 'LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:';
//
//// Add folder configuration
//$GLOBALS['TCA']['pages']['columns']['module']['config']['items'][] = [
// 0 => $ll . 'blog-folder',
// 1 => 'blog',
// 2 => 'record-folder-contains-blog',
//];
//$GLOBALS['TCA']['pages']['ctrl']['typeicon_classes']['contains-blog'] = 'record-folder-contains-blog';
//
//// Add new page types as possible select item:
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
// 'pages',
// 'doktype',
// [
// 'LLL:EXT:blog/Resources/Private/Language/locallang_tca.xlf:pages.doktype.blog-post',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST,
// 'record-blog-post',
// ],
// '1',
// 'after'
//);
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
// 'pages',
// 'doktype',
// [
// 'LLL:EXT:blog/Resources/Private/Language/locallang_tca.xlf:pages.doktype.blog-page',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE,
// 'record-blog-page',
// ],
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST,
// 'after'
//);
//
//// Add icon for new page types:
//\TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule(
// $GLOBALS['TCA']['pages'],
// [
// 'ctrl' => [
// 'typeicon_classes' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => 'record-blog-page',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE . '-root' => 'record-blog-page-root',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST => 'record-blog-post',
// ],
// ],
// 'types' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST => $GLOBALS['TCA']['pages']['types'][\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT],
// ],
// ]
//);
//\TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule(
// $GLOBALS['TCA']['pages'],
// [
// 'ctrl' => [
// 'typeicon_classes' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => 'record-blog-page',
// ],
// ],
// 'types' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => $GLOBALS['TCA']['pages']['types'][\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT],
// ],
// ]
//);
//
// Register fields
$GLOBALS['TCA']['pages']['columns'] = array_replace_recursive(
$GLOBALS['TCA']['pages']['columns'],
[
'rel_map_entries' => [
'exclude' => true,
'label' => '' . $ll . 'pages.rel_coordinate',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_a2gmaps_domain_model_mapentry',
'foreign_table_where' => ' AND tx_a2gmaps_domain_model_mapentry.sys_language_uid IN (###REC_FIELD_sys_language_uid###,-1) ',
'foreign_field' => 'rel_travel_post',
'size' => 10,
'autoSizeMax' => 30,
// 'foreign_sortby' => 'sorting',
'minitems' => 0,
'maxitems' => 10,
'appearance' => [
'collapseAll' => 1,
'expandSingle' => 1,
],
],
],
'authors' => [
'label' => $ll . 'pages.authors',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'multiple' => 0,
'foreign_table' => 'tx_blog_domain_model_author',
'foreign_table_where' => 'AND tx_blog_domain_model_author.sys_language_uid IN (0,-1) ORDER BY tx_blog_domain_model_author.name ASC',
'MM' => 'tx_blog_post_author_mm',
'minitems' => 0,
'maxitems' => 99999,
'behaviour' => [
'allowLanguageSynchronization' => true
]
],
],
'tags' => [
'label' => $ll . 'pages.tags',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'size' => 10,
'minitems' => 0,
'maxitems' => 9999,
'autoSizeMax' => 10,
'multiple' => 0,
'foreign_table' => 'tx_blog_domain_model_tag',
'foreign_table_where' => 'AND tx_blog_domain_model_tag.sys_language_uid IN (0,-1) ORDER BY tx_blog_domain_model_tag.title ASC',
'MM' => 'tx_blog_tag_pages_mm',
'behaviour' => [
'allowLanguageSynchronization' => true
]
],
]
]
);
//
///** @noinspection UnsupportedStringOffsetOperationsInspection */
//$GLOBALS['TCA']['pages']['types'][\T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST]['columnsOverrides'] = [
// 'categories' => [
// 'config' => [
// 'foreign_table_where' => 'AND sys_category.sys_language_uid IN (0,-1) AND sys_category.pid = ###PAGE_TSCONFIG_ID###',
// ]
// ]
//];
//
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette('pages', 'rel_coordinate', 'rel_map_entries');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
'pages',
'--div--;' . $ll . 'pages.tabs.travel_blog,
--palette--;' . $ll . 'pages.palettes.travel_blog; rel_coordinate'
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST
);

View File

@ -0,0 +1,21 @@
<?php
defined('TYPO3_MODE') || die();
/***************
* TypoScript: Full Package
* This includes the full setup including all configurations
*/
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile(
'a2g_travel_blog',
'Configuration/TypoScript',
'Altogether Travel Blog: Full Package'
);
/***************
* TypoScript: Base Package
*/
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile(
'a2g_travel_blog',
'Configuration/TypoScript/Base',
'Altogether Travel Blog: Base Package'
);

View File

@ -0,0 +1,41 @@
<?php
defined('TYPO3_MODE') || die();
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'A2gTravelBlog',
'timeline',
'Travel Blog Timeline'
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'A2gTravelBlog',
'map',
'Travel Blog Map'
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'A2gTravelBlog',
'mapConfig',
'Travel Blog Map Config'
);
$pluginSignatures = [
'a2gtravelblog_timeline' => 'flexform_timeline',
'a2gtravelblog_map' => 'flexform_map'
];
foreach ($pluginSignatures as $pluginSignature => $flexform) {
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue($pluginSignature, 'FILE:EXT:a2g_travel_blog/Configuration/FlexForms/' . $flexform . '.xml');
// \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
// // 'list_type' does not apply here
// '*',
// // Flexform configuration schema file
// 'FILE:EXT:example/Configuration/FlexForms/Registration.xml',
// // ctype
// $pluginSignature
//);
}

View File

@ -0,0 +1,813 @@
<?php
//
/*
* This file is part of the package t3g/blog.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
if (!defined('TYPO3')) {
die('Access denied.');
}
$ll = 'LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:';
//
//// Add folder configuration
//$GLOBALS['TCA']['pages']['columns']['module']['config']['items'][] = [
// 0 => $ll . 'blog-folder',
// 1 => 'blog',
// 2 => 'record-folder-contains-blog',
//];
//$GLOBALS['TCA']['pages']['ctrl']['typeicon_classes']['contains-blog'] = 'record-folder-contains-blog';
//
//// Add new page types as possible select item:
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
// 'pages',
// 'doktype',
// [
// 'LLL:EXT:blog/Resources/Private/Language/locallang_tca.xlf:pages.doktype.blog-post',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST,
// 'record-blog-post',
// ],
// '1',
// 'after'
//);
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
// 'pages',
// 'doktype',
// [
// 'LLL:EXT:blog/Resources/Private/Language/locallang_tca.xlf:pages.doktype.blog-page',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE,
// 'record-blog-page',
// ],
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST,
// 'after'
//);
//
//// Add icon for new page types:
//\TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule(
// $GLOBALS['TCA']['pages'],
// [
// 'ctrl' => [
// 'typeicon_classes' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => 'record-blog-page',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE . '-root' => 'record-blog-page-root',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST => 'record-blog-post',
// ],
// ],
// 'types' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST => $GLOBALS['TCA']['pages']['types'][\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT],
// ],
// ]
//);
//\TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule(
// $GLOBALS['TCA']['pages'],
// [
// 'ctrl' => [
// 'typeicon_classes' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => 'record-blog-page',
// ],
// ],
// 'types' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => $GLOBALS['TCA']['pages']['types'][\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT],
// ],
// ]
//);
//
// Register fields
$GLOBALS['TCA']['sys_category']['columns'] = array_replace_recursive(
$GLOBALS['TCA']['sys_category']['columns'],
[
'iso_a2_country_code' => [
'exclude' => true,
'label' => '' . $ll . 'category.iso_a2_country_code',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
[
"no map relation",
""
],
[
"Afghanistan",
"AF"
],
[
"Angola",
"AO"
],
[
"Albania",
"AL"
],
[
"United Arab Emirates",
"AE"
],
[
"Argentina",
"AR"
],
[
"Armenia",
"AM"
],
[
"Antarctica",
"AQ"
],
[
"Fr. S. Antarctic Lands",
"TF"
],
[
"Australia",
"AU"
],
[
"Austria",
"AT"
],
[
"Azerbaijan",
"AZ"
],
[
"Burundi",
"BI"
],
[
"Belgium",
"BE"
],
[
"Benin",
"BJ"
],
[
"Burkina Faso",
"BF"
],
[
"Bangladesh",
"BD"
],
[
"Bulgaria",
"BG"
],
[
"Bahamas",
"BS"
],
[
"Bosnia and Herz.",
"BA"
],
[
"Belarus",
"BY"
],
[
"Belize",
"BZ"
],
[
"Bolivia",
"BO"
],
[
"Brazil",
"BR"
],
[
"Brunei",
"BN"
],
[
"Bhutan",
"BT"
],
[
"Botswana",
"BW"
],
[
"Central African Rep.",
"CF"
],
[
"Canada",
"CA"
],
[
"Switzerland",
"CH"
],
[
"Chile",
"CL"
],
[
"China",
"CN"
],
[
"Cte d'Ivoire",
"CI"
],
[
"Cameroon",
"CM"
],
[
"Dem. Rep. Congo",
"CD"
],
[
"Congo",
"CG"
],
[
"Colombia",
"CO"
],
[
"Costa Rica",
"CR"
],
[
"Cuba",
"CU"
],
[
"Cyprus",
"CY"
],
[
"Czech Rep.",
"CZ"
],
[
"Germany",
"DE"
],
[
"Djibouti",
"DJ"
],
[
"Denmark",
"DK"
],
[
"Dominican Rep.",
"DO"
],
[
"Algeria",
"DZ"
],
[
"Ecuador",
"EC"
],
[
"Egypt",
"EG"
],
[
"Eritrea",
"ER"
],
[
"Spain",
"ES"
],
[
"Estonia",
"EE"
],
[
"Ethiopia",
"ET"
],
[
"Finland",
"FI"
],
[
"Fiji",
"FJ"
],
[
"Falkland Is.",
"FK"
],
[
"France",
"FR"
],
[
"Gabon",
"GA"
],
[
"United Kingdom",
"GB"
],
[
"Georgia",
"GE"
],
[
"Ghana",
"GH"
],
[
"Guinea",
"GN"
],
[
"Gambia",
"GM"
],
[
"Guinea-Bissau",
"GW"
],
[
"Eq. Guinea",
"GQ"
],
[
"Greece",
"GR"
],
[
"Greenland",
"GL"
],
[
"Guatemala",
"GT"
],
[
"Guyana",
"GY"
],
[
"Honduras",
"HN"
],
[
"Croatia",
"HR"
],
[
"Haiti",
"HT"
],
[
"Hungary",
"HU"
],
[
"Indonesia",
"ID"
],
[
"India",
"IN"
],
[
"Ireland",
"IE"
],
[
"Iran",
"IR"
],
[
"Iraq",
"IQ"
],
[
"Iceland",
"IS"
],
[
"Israel",
"IL"
],
[
"Italy",
"IT"
],
[
"Jamaica",
"JM"
],
[
"Jordan",
"JO"
],
[
"Japan",
"JP"
],
[
"Kazakhstan",
"KZ"
],
[
"Kenya",
"KE"
],
[
"Kyrgyzstan",
"KG"
],
[
"Cambodia",
"KH"
],
[
"Korea",
"KR"
],
[
"Kuwait",
"KW"
],
[
"Lao PDR",
"LA"
],
[
"Lebanon",
"LB"
],
[
"Liberia",
"LR"
],
[
"Libya",
"LY"
],
[
"Sri Lanka",
"LK"
],
[
"Lesotho",
"LS"
],
[
"Lithuania",
"LT"
],
[
"Luxembourg",
"LU"
],
[
"Latvia",
"LV"
],
[
"Morocco",
"MA"
],
[
"Moldova",
"MD"
],
[
"Madagascar",
"MG"
],
[
"Mexico",
"MX"
],
[
"Macedonia",
"MK"
],
[
"Mali",
"ML"
],
[
"Myanmar",
"MM"
],
[
"Montenegro",
"ME"
],
[
"Mongolia",
"MN"
],
[
"Mozambique",
"MZ"
],
[
"Mauritania",
"MR"
],
[
"Malawi",
"MW"
],
[
"Malaysia",
"MY"
],
[
"Namibia",
"NA"
],
[
"New Caledonia",
"NC"
],
[
"Niger",
"NE"
],
[
"Nigeria",
"NG"
],
[
"Nicaragua",
"NI"
],
[
"Netherlands",
"NL"
],
[
"Norway",
"NO"
],
[
"Nepal",
"NP"
],
[
"New Zealand",
"NZ"
],
[
"Oman",
"OM"
],
[
"Pakistan",
"PK"
],
[
"Panama",
"PA"
],
[
"Peru",
"PE"
],
[
"Philippines",
"PH"
],
[
"Papua New Guinea",
"PG"
],
[
"Poland",
"PL"
],
[
"Puerto Rico",
"PR"
],
[
"Dem. Rep. Korea",
"KP"
],
[
"Portugal",
"PT"
],
[
"Paraguay",
"PY"
],
[
"Palestine",
"PS"
],
[
"Qatar",
"QA"
],
[
"Romania",
"RO"
],
[
"Russia",
"RU"
],
[
"Rwanda",
"RW"
],
[
"W. Sahara",
"EH"
],
[
"Saudi Arabia",
"SA"
],
[
"Sudan",
"SD"
],
[
"S. Sudan",
"SS"
],
[
"Senegal",
"SN"
],
[
"Solomon Is.",
"SB"
],
[
"Sierra Leone",
"SL"
],
[
"El Salvador",
"SV"
],
[
"Somalia",
"SO"
],
[
"Serbia",
"RS"
],
[
"Suriname",
"SR"
],
[
"Slovakia",
"SK"
],
[
"Slovenia",
"SI"
],
[
"Sweden",
"SE"
],
[
"Swaziland",
"SZ"
],
[
"Syria",
"SY"
],
[
"Chad",
"TD"
],
[
"Togo",
"TG"
],
[
"Thailand",
"TH"
],
[
"Tajikistan",
"TJ"
],
[
"Turkmenistan",
"TM"
],
[
"Timor-Leste",
"TL"
],
[
"Trinidad and Tobago",
"TT"
],
[
"Tunisia",
"TN"
],
[
"Turkey",
"TR"
],
[
"Taiwan",
"TW"
],
[
"Tanzania",
"TZ"
],
[
"Uganda",
"UG"
],
[
"Ukraine",
"UA"
],
[
"Uruguay",
"UY"
],
[
"United States",
"US"
],
[
"Uzbekistan",
"UZ"
],
[
"Venezuela",
"VE"
],
[
"Vietnam",
"VN"
],
[
"Vanuatu",
"VU"
],
[
"Yemen",
"YE"
],
[
"South Africa",
"ZA"
],
[
"Zambia",
"ZM"
],
[
"Zimbabwe",
"ZW"
]
],
],
]
]
);
//
///** @noinspection UnsupportedStringOffsetOperationsInspection */
//$GLOBALS['TCA']['pages']['types'][\T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST]['columnsOverrides'] = [
// 'categories' => [
// 'config' => [
// 'foreign_table_where' => 'AND sys_category.sys_language_uid IN (0,-1) AND sys_category.pid = ###PAGE_TSCONFIG_ID###',
// ]
// ]
//];
//
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette('sys_category', 'travel_blog_fields', 'iso_a2_country_code');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
'sys_category',
'--div--;' . $ll . 'pages.tabs.travel_blog,
--palette--;' . $ll . 'pages.palettes.travel_blog; travel_blog_fields'
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST
);

View File

@ -0,0 +1,99 @@
<?php //
/*
* This file is part of the package t3g/blog.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
if (!defined('TYPO3')) {
die('Access denied.');
}
$ll = 'LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:';
//
//// Add folder configuration
//$GLOBALS['TCA']['pages']['columns']['module']['config']['items'][] = [
// 0 => $ll . 'blog-folder',
// 1 => 'blog',
// 2 => 'record-folder-contains-blog',
//];
//$GLOBALS['TCA']['pages']['ctrl']['typeicon_classes']['contains-blog'] = 'record-folder-contains-blog';
//
//// Add new page types as possible select item:
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
// 'pages',
// 'doktype',
// [
// 'LLL:EXT:blog/Resources/Private/Language/locallang_tca.xlf:pages.doktype.blog-post',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST,
// 'record-blog-post',
// ],
// '1',
// 'after'
//);
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
// 'pages',
// 'doktype',
// [
// 'LLL:EXT:blog/Resources/Private/Language/locallang_tca.xlf:pages.doktype.blog-page',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE,
// 'record-blog-page',
// ],
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST,
// 'after'
//);
//
//// Add icon for new page types:
//\TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule(
// $GLOBALS['TCA']['pages'],
// [
// 'ctrl' => [
// 'typeicon_classes' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => 'record-blog-page',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE . '-root' => 'record-blog-page-root',
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST => 'record-blog-post',
// ],
// ],
// 'types' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_POST => $GLOBALS['TCA']['pages']['types'][\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT],
// ],
// ]
//);
//\TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule(
// $GLOBALS['TCA']['pages'],
// [
// 'ctrl' => [
// 'typeicon_classes' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => 'record-blog-page',
// ],
// ],
// 'types' => [
// (string) \T3G\AgencyPack\Blog\Constants::DOKTYPE_BLOG_PAGE => $GLOBALS['TCA']['pages']['types'][\TYPO3\CMS\Core\Domain\Repository\PageRepository::DOKTYPE_DEFAULT],
// ],
// ]
//);
//
// Register fields
$GLOBALS['TCA']['tx_blog_domain_model_author']['columns'] = array_replace_recursive(
$GLOBALS['TCA']['tx_blog_domain_model_author']['columns'],
[
'rel_map_marker' => [
'exclude' => true,
'label' => 'LLL:EXT:a2g_maps/Resources/Private/Language/locallang_db.xlf:relMarker',
'config' => [
'type' => 'select',
'renderType' => 'selectSingleBox',
'foreign_table' => 'tx_a2gmaps_domain_model_marker',
'foreign_table_where' => ' AND tx_a2gmaps_domain_model_marker.sys_language_uid IN (###REC_FIELD_sys_language_uid###,-1) '
]
]
]
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette('tx_blog_domain_model_author', 'travelblog_map_icon', 'rel_map_marker');
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
'tx_blog_domain_model_author',
'--div--;' . $ll . 'pages.tabs.travel_blog,
--palette--;' . $ll . 'pages.palettes.travel_blog; travelblog_map_icon'
);

View File

@ -0,0 +1,36 @@
<?php
/*
* This file is part of the package t3g/blog.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
if (!defined('TYPO3')) {
die('Access denied.');
}
$ll = 'LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:';
$GLOBALS['TCA']['tx_a2gmaps_domain_model_mapentry']['columns'] = array_replace_recursive(
$GLOBALS['TCA']['tx_a2gmaps_domain_model_mapentry']['columns'],
[
'rel_travel_post' => [
'label' => 'rel_travel_post',
'config' => [
'type' => 'select',
'renderType'=> 'selectSingle',
'foreign_table' => 'pages',
'foreign_table_where' => ' AND pages.sys_language_uid IN (###REC_FIELD_sys_language_uid###,-1) ',
],
]
]
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette('tx_a2gmaps_domain_model_mapentry', 'travelblog_rel_post', 'travelblog_rel_post');
//\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
// 'tx_blog_domain_model_author',
// '--div--;' . $ll . 'pages.tabs.travel_blog,
// --palette--;' . $ll . 'pages.palettes.travel_blog; travelblog_map_icon'
//);

View File

@ -0,0 +1,27 @@
<?php
/*
* This file is part of the package t3g/blog.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
if (!defined('TYPO3')) {
die('Access denied.');
}
$ll = 'LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:';
$GLOBALS['TCA']['tx_a2gmaps_domain_model_marker']['columns'] = array_replace_recursive(
$GLOBALS['TCA']['tx_a2gmaps_domain_model_marker']['columns'],
[
'rel_travel_author' => [
'label' => 'rel_travel_author',
'config' => [
'type' => 'passthrough'
]
]
]
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette('tx_a2gmaps_domain_model_marker', 'travel_author', 'rel_travel_author');

View File

@ -0,0 +1,4 @@
##################
#### TsConfig ####
##################
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:a2g_travel_blog/Configuration/TsConfig/Page/Wizards.tsconfig">

View File

@ -0,0 +1,28 @@
################################
#### CONTENT ELEMENT WIZARD ####
################################
mod.wizards.newContentElement.wizardItems.a2gTravelBlog {
after = common, menu, special, forms, plugins, blog
header = LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:wizard.group.travel_blog
elements {
a2gtravelblog_map {
iconIdentifier = a2g_travelblog-plugin-map
title = LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:plugin.map.title
description = LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:plugin.map.description
tt_content_defValues {
CType = list
list_type = a2gtravelblog_map
}
}
a2gtravelblog_timeline {
iconIdentifier = a2g_travelblog-plugin-timeline
title = LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:plugin.timeline.title
description = LLL:EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf:plugin.timeline.description
tt_content_defValues {
CType = list
list_type = a2gtravelblog_timeline
}
}
}
show = *
}

View File

@ -0,0 +1,17 @@
plugin.tx_a2gtravelblog {
view {
# cat=altogether travel blog/file; type=string; label=Path to template root (FE)
templateRootPath = EXT:a2g_travel_blog/Resources/Private/Templates/
# cat=altogether travel blog/file; type=string; label=Path to template partials (FE)
partialRootPath = EXT:a2g_travel_blog/Resources/Private/Partials/
# cat=altogether travel blog/file; type=string; label=Path to template layouts (FE)
layoutRootPath = EXT:a2g_travel_blog/Resources/Private/Layouts/
}
persistence {
# cat=altogether travel blog//a; type=string; label=Default storage PID
storagePid =
}
settings {
}
}

View File

@ -0,0 +1,63 @@
plugin.tx_a2gtravelmap_timeline {
view {
templateRootPaths.0 = EXT:blog/Resources/Private/Templates/
templateRootPaths.1 = EXT:a2g_travel_blog/Resources/Private/Templates/
templateRootPaths.2 = {$plugin.tx_a2gtravelblog.view.templateRootPath}
partialRootPaths.0 = EXT:blog/Resources/Private/Partials/
partialRootPaths.1 = EXT:a2g_travel_blog/Resources/Private/Partials/
partialRootPaths.2 = {$plugin.tx_a2gtravelblog.view.partialRootPath}
layoutRootPaths.0 = EXT:blog/Resources/Private/Layouts/
layoutRootPaths.1 = EXT:a2g_travel_blog/Resources/Private/Layouts/
layoutRootPaths.2 = {$plugin.tx_a2gtravelblog.view.layoutRootPath}
}
persistence {
storagePid = {$plugin.tx_a2gtravelblog.persistence.storagePid}
#recursive = 1
}
}
plugin.tx_a2gtravelmap_map {
view {
templateRootPaths.0 = EXT:blog/Resources/Private/Templates/
templateRootPaths.1 = EXT:a2g_travel_blog/Resources/Private/Templates/
templateRootPaths.2 = {$plugin.tx_a2gtravelblog.view.templateRootPath}
partialRootPaths.0 = EXT:blog/Resources/Private/Partials/
partialRootPaths.1 = EXT:a2g_travel_blog/Resources/Private/Partials/
partialRootPaths.2 = {$plugin.tx_a2gtravelblog.view.partialRootPath}
layoutRootPaths.0 = EXT:blog/Resources/Private/Layouts/
layoutRootPaths.1 = EXT:a2g_travel_blog/Resources/Private/Layouts/
layoutRootPaths.2 = {$plugin.tx_a2gtravelblog.view.layoutRootPath}
}
settings {
defaultMapMarker = {$plugin.tx_a2gmaps.settings.defaultMapMarker}
authorPageUid = {$plugin.tx_blog.settings.authorUid}
}
persistence {
storagePid = {$plugin.tx_a2gtravelblog.persistence.storagePid}
#recursive = 1
}
}
a2gTravelBlogMapMarkers = PAGE
a2gTravelBlogMapMarkers {
typeNum = 1652369512
config {
disableAllHeaderCode = 1
admPanel = 0
additionalHeaders.10.header = Content-type:application/json
xhtml_cleaning = 0
debug = 0
no_cache = 0
}
10 = USER
10 {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = A2gTravelBlog
pluginName = mapConfig
vendorName = Altogether
controller = Map
settings < plugin.tx_a2gtravelmap_map.settings
persistence < plugin.tx_a2gtravelmap_map.persistence
view < plugin.tx_a2gtravelmap_map.view
}
}

View File

@ -0,0 +1,2 @@
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:a2g_travel_blog/Configuration/TypoScript/Base/constants.typoscript">

View File

@ -0,0 +1,3 @@
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:a2g_travel_blog/Configuration/TypoScript/Base/setup.typoscript">
#<INCLUDE_TYPOSCRIPT: source="FILE:EXT:a2g_travel_blog/Configuration/TypoScript/GoogleAnalytics/setup.typoscript">

9
LICENSE Normal file
View File

@ -0,0 +1,9 @@
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

1
README.md Normal file
View File

@ -0,0 +1 @@
# a2g_travel_blog

View File

@ -0,0 +1,11 @@
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache >= 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang.xlf" date="2021-11-18T10:42:07Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="product_list.product_detail_link" resname="product_list.product_detail_link">
<source>detail</source>
<target>mehr erfahren</target>
</trans-unit>
<trans-unit id="product.product_nr" resname="product.product_nr">
<source>article nr</source>
<target>Artikel Nr</target>
</trans-unit>
<trans-unit id="product_list.search" resname="product_list.search">
<source>search</source>
<target>suchen</target>
</trans-unit>
<trans-unit id="product_list.advanced_search" resname="product_list.advanced_search">
<source>advanced search</source>
<target>erweiterte Suche</target>
</trans-unit>
<trans-unit id="product_list.search_input_placeholder" resname="product_list.search_input_placeholder">
<source>search</source>
<target>suche</target>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>related products</source>
<target>Produkte mit dieser Zutat</target>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
<target>Verwendete Zutaten</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh_tx_a2gproducts_domain_model_products.xlf" date="2021-11-18T11:17:01Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="nr.description" resname="nr.description">
<source>product nr</source>
<target>Produkt Nr</target>
</trans-unit>
<trans-unit id="title.description" resname="title.description">
<source>product title &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
<target>Produkt Titel / Name &lt;br/&gt;
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</target>
</trans-unit>
<trans-unit id="description.description" resname="description.description">
<source>description &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
<target>Produkt Beschreibung &lt;br/&gt;
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</target>
</trans-unit>
<trans-unit id="image.description" resname="image.description">
<source>product list image &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
<target>Produkt Listen Bild &lt;br/&gt;
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</target>
</trans-unit>
<trans-unit id="images.description" resname="images.description">
<source>images</source>
<target>Produkt Detail Seiten Bild Slider</target>
</trans-unit>
<trans-unit id="rel_category.description" resname="rel_category.description">
<source>relCategory</source>
<target>Produkt Kategorie ( Verwendet für Filter )</target>
</trans-unit>
<trans-unit id="rel_filter_values.description" resname="rel_filter_values.description">
<source>relFilterValues</source>
<target>Filterbare Optionen
von dem FIlter aus der Kategorie</target>
</trans-unit>
<trans-unit id="path_segment.description" resname="path_segment.description">
<source>url segment generated from the product title</source>
<target>URL Segment generiert aus dem Produk-Titel</target>
</trans-unit>
<trans-unit id="description_html.description" resname="description_html.description">
<source>farmateable description </source>
<target>Formatierbare Beschreibung unter der Beschreibung</target>
</trans-unit>
<trans-unit id="rel_ingedients.description" resname="rel_ingedients.description">
<source>ingredients</source>
<target>Verwendete Inhaltsstoffe, Bauteile oder Zutaten</target>
</trans-unit>
<trans-unit id="rel_productvariants.description" resname="rel_productvariants.description">
<source></source>
<target></target>
</trans-unit>
<trans-unit id="rel_delivery_costs.description" resname="rel_delivery_costs.description">
<source>deliverycosts conditions per each product</source>
<target>Liefergebühren abzüge zuschläge pro Produkt</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,296 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" target-language="de" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_db.xlf" date="2022-01-25T14:39:22Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="tx_a2gproducts_domain_model_products" resname="tx_a2gproducts_domain_model_products">
<source>Products</source>
<target>Produkte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.nr" resname="tx_a2gproducts_domain_model_products.nr">
<source>Nr</source>
<target></target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.title" resname="tx_a2gproducts_domain_model_products.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.description" resname="tx_a2gproducts_domain_model_products.description">
<source>Description</source>
<target>Beschreibung</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.image" resname="tx_a2gproducts_domain_model_products.image">
<source>Image</source>
<target>Bild</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.images" resname="tx_a2gproducts_domain_model_products.images">
<source>Images</source>
<target>Bilder</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.net_price" resname="tx_a2gproducts_domain_model_products.net_price">
<source>Net Price</source>
<target>Netto Preis</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.gross_price" resname="tx_a2gproducts_domain_model_products.gross_price">
<source>Gross Price</source>
<target>Brutto Preis</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.rel_category" resname="tx_a2gproducts_domain_model_products.rel_category">
<source>Category</source>
<target>Kategorie</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_products.rel_filter_values" resname="tx_a2gproducts_domain_model_products.rel_filter_values">
<source>Filter Values</source>
<target>Filter Werte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories" resname="tx_a2gproducts_domain_model_categories">
<source>Categories</source>
<target>Kategorien</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.title" resname="tx_a2gproducts_domain_model_categories.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.description" resname="tx_a2gproducts_domain_model_categories.description">
<source>Description</source>
<target>Beschreibung</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.image" resname="tx_a2gproducts_domain_model_categories.image">
<source>Image</source>
<target>Bild</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_categories.rel_filters" resname="tx_a2gproducts_domain_model_categories.rel_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters" resname="tx_a2gproducts_domain_model_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.title" resname="tx_a2gproducts_domain_model_filters.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.filter_type" resname="tx_a2gproducts_domain_model_filters.filter_type">
<source>Filter Type</source>
<target>Filter Typ</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.db_operation_max" resname="tx_a2gproducts_domain_model_filters.db_operation_max">
<source>Db Operation Max</source>
<target>Db Operation Max</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.db_operation_min" resname="tx_a2gproducts_domain_model_filters.db_operation_min">
<source>Db Operation Min</source>
<target>Db Operation Min</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filters.rel_filter_option" resname="tx_a2gproducts_domain_model_filters.rel_filter_option">
<source>Filter Option</source>
<target>Filter Option</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions" resname="tx_a2gproducts_domain_model_filteroptions">
<source>Filter Options</source>
<target>Filter Optionen</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.title" resname="tx_a2gproducts_domain_model_filteroptions.title">
<source>Title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.value_min" resname="tx_a2gproducts_domain_model_filteroptions.value_min">
<source>Value Min</source>
<target>min. Wert</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filteroptions.value_max" resname="tx_a2gproducts_domain_model_filteroptions.value_max">
<source>Value Max</source>
<target>max. Wert</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues" resname="tx_a2gproducts_domain_model_filtervalues">
<source>Filter Values</source>
<target>Filter Werte</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues.value" resname="tx_a2gproducts_domain_model_filtervalues.value">
<source>Value</source>
<target>Wert</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_filtervalues.rel_filters" resname="tx_a2gproducts_domain_model_filtervalues.rel_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductslist.name" resname="tx_a2g_products_a2gproductslist.name">
<source>Altogether Products - Product List</source>
<target>Altogether Produkte - Produktliste</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductslist.description" resname="tx_a2g_products_a2gproductslist.description">
<source></source>
<target>Liste der Produkte mit filter und such Möglichkeit.</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductsdetail.name" resname="tx_a2g_products_a2gproductsdetail.name">
<source>Altogether Products - Product Detail</source>
<target>Altogether Produkte - Produkt Detail Seite</target>
</trans-unit>
<trans-unit id="tx_a2g_products_a2gproductsdetail.description" resname="tx_a2g_products_a2gproductsdetail.description">
<source></source>
<target>Detailseite eines Produktes</target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientslist.name" resname="tx_a2g_products_ingredientslist.name">
<source>Altogether Products - Ingredients List</source>
<target>Altogether Produkte - Liste der Inhaltsstoffe</target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientslist.description" resname="tx_a2g_products_ingredientslist.description">
<source></source>
<target></target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientsdetail.name" resname="tx_a2g_products_ingredientsdetail.name">
<source>Altogether Products - Ingredients Detail</source>
<target>Altogether Produkte - Inhaltsstoffe Detail Seite</target>
</trans-unit>
<trans-unit id="tx_a2g_products_ingredientsdetail.description" resname="tx_a2g_products_ingredientsdetail.description">
<source></source>
<target></target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_ingredients" resname="tx_a2gproducts_domain_model_ingredients">
<source>Ingredients</source>
<target>Inhaltstoffe</target>
</trans-unit>
<trans-unit id="title" resname="title">
<source>title</source>
<target>Titel</target>
</trans-unit>
<trans-unit id="description" resname="description">
<source>description</source>
<target>Beschreibung</target>
</trans-unit>
<trans-unit id="image" resname="image">
<source>image</source>
<target>Bild</target>
</trans-unit>
<trans-unit id="rel_filters" resname="rel_filters">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="value_min" resname="value_min">
<source>min value</source>
<target>min. Wert</target>
</trans-unit>
<trans-unit id="value_max" resname="value_max">
<source>max value</source>
<target>max. Wert</target>
</trans-unit>
<trans-unit id="filter_type" resname="filter_type">
<source>filter type</source>
<target>Filter Typ</target>
</trans-unit>
<trans-unit id="db_operation_min" resname="db_operation_min">
<source>operation min</source>
<target>min. Operant</target>
</trans-unit>
<trans-unit id="db_operation_max" resname="db_operation_max">
<source>operation max</source>
<target>max. Operant</target>
</trans-unit>
<trans-unit id="rel_filter_option" resname="rel_filter_option">
<source>filter option</source>
<target>Filter Optionen</target>
</trans-unit>
<trans-unit id="value" resname="value">
<source>value</source>
<target>Wert</target>
</trans-unit>
<trans-unit id="images" resname="images">
<source>images</source>
<target>Bilder</target>
</trans-unit>
<trans-unit id="rel_products" resname="rel_products">
<source>products</source>
<target>Produkte</target>
</trans-unit>
<trans-unit id="product_nr" resname="product_nr">
<source>product nr</source>
<target>Produkt Nr.</target>
</trans-unit>
<trans-unit id="rel_category" resname="rel_category">
<source>category</source>
<target>Kateogie</target>
</trans-unit>
<trans-unit id="rel_filter_values" resname="rel_filter_values">
<source>filter values</source>
<target>Filter Werte</target>
</trans-unit>
<trans-unit id="rel_ingredients" resname="rel_ingredients">
<source>ingredients</source>
<target>Inhaltsstoffe</target>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
<target>verwendete Zutaten</target>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>products with this ingredient</source>
<target>Produkte mit dieser Zutat</target>
</trans-unit>
<trans-unit id="filter_type.useFilterOptions" resname="filter_type.useFilterOptions">
<source>just use Filter Options</source>
<target>Filteroptionen verwenden</target>
</trans-unit>
<trans-unit id="slug" resname="slug">
<source>slug</source>
<target>Url Segment</target>
</trans-unit>
<trans-unit id="images_tab" resname="images_tab">
<source>Images</source>
<target>Bilder</target>
</trans-unit>
<trans-unit id="product_variants_tab" resname="product_variants_tab">
<source>Varainats</source>
<target>Varianten</target>
</trans-unit>
<trans-unit id="filters_tab" resname="filters_tab">
<source>Filters</source>
<target>Filter</target>
</trans-unit>
<trans-unit id="ingredients_tab" resname="ingredients_tab">
<source>Ingredients</source>
<target>Inhaltsstoffe</target>
</trans-unit>
<trans-unit id="rel_productvariants" resname="rel_productvariants">
<source>Product-Variants</source>
<target>Produkt Varianten</target>
</trans-unit>
<trans-unit id="description_html" resname="description_html">
<source>Description ( RTE )</source>
<target>Beschreibung ( RTE )</target>
</trans-unit>
<trans-unit id="selectabel_product_attribute_tab" resname="selectabel_product_attribute_tab">
<source>Product Options</source>
<target>Produkt Optionen</target>
</trans-unit>
<trans-unit id="rel_selectableattribute" resname="rel_selectableattribute">
<source>Selectable Produkt Options</source>
<target>Wählbare Produkt Optionen</target>
</trans-unit>
<trans-unit id="rel_brand" resname="rel_brand">
<source></source>
<target>Marke</target>
</trans-unit>
<trans-unit id="tx_a2gproducts_domain_model_brands" resname="tx_a2gproducts_domain_model_brands">
<source></source>
<target>Marken</target>
</trans-unit>
<trans-unit id="seo_image1x1" resname="seo_image1x1">
<source>SEO Image 1x1</source>
<target></target>
</trans-unit>
<trans-unit id="seo_image4x3" resname="seo_image4x3">
<source>SEO Image 4x3</source>
<target></target>
</trans-unit>
<trans-unit id="seo_image16x9" resname="seo_image16x9">
<source>SEO Image 16x9</source>
<target></target>
</trans-unit>
<trans-unit id="seo_tab" resname="seo_tab">
<source>SEO</source>
<target></target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang.xlf" date="2021-11-18T10:42:07Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="product_list.product_detail_link" resname="product_list.product_detail_link">
<source>detail</source>
</trans-unit>
<trans-unit id="product.product_nr" resname="product.product_nr">
<source>article nr</source>
</trans-unit>
<trans-unit id="product_list.search" resname="product_list.search">
<source>search</source>
</trans-unit>
<trans-unit id="product_list.advanced_search" resname="product_list.advanced_search">
<source>advanced search</source>
</trans-unit>
<trans-unit id="product_list.search_input_placeholder" resname="product_list.search_input_placeholder">
<source>search</source>
</trans-unit>
<trans-unit id="related_products" resname="related_products">
<source>related products</source>
</trans-unit>
<trans-unit id="used_ingredients" resname="used_ingredients">
<source>used ingredients</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="title.description" resname="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="description.description" resname="description.description">
<source>description</source>
</trans-unit>
<trans-unit id="image.description" resname="image.description">
<source>image</source>
</trans-unit>
<trans-unit id="rel_filters.description" resname="rel_filters.description">
<source>relFilters</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="title.description" resname="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="value_min.description" resname="value_min.description">
<source>valueMin</source>
</trans-unit>
<trans-unit id="value_max.description" resname="value_max.description">
<source>valueMax</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="title.description" resname="title.description">
<source>title</source>
</trans-unit>
<trans-unit id="filter_type.description" resname="filter_type.description">
<source>filterType</source>
</trans-unit>
<trans-unit id="db_operation_max.description" resname="db_operation_max.description">
<source>dbOperationMax</source>
</trans-unit>
<trans-unit id="db_operation_min.description" resname="db_operation_min.description">
<source>dbOperationMin</source>
</trans-unit>
<trans-unit id="rel_filter_option.description" resname="rel_filter_option.description">
<source>relFilterOption</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh" date="2021-08-16T12:03:54Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="value.description" resname="value.description">
<source>value</source>
</trans-unit>
<trans-unit id="rel_filters.description" resname="rel_filters.description">
<source>relFilters</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:a2g_products/Resources/Private/Language/locallang_csh_tx_a2gproducts_domain_model_products.xlf" date="2021-11-18T11:17:01Z" product-name="a2g_products">
<header/>
<body>
<trans-unit id="nr.description" resname="nr.description">
<source>product nr</source>
</trans-unit>
<trans-unit id="title.description" resname="title.description">
<source>product title &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
</trans-unit>
<trans-unit id="description.description" resname="description.description">
<source>description &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
</trans-unit>
<trans-unit id="image.description" resname="image.description">
<source>product list image &lt;br/&gt;
for Search Engin Optimation ( SEO ) and link preview ( &lt;a href=&quot;https://ogp.me/&quot;&gt;open graph&lt;/a&gt; )</source>
</trans-unit>
<trans-unit id="images.description" resname="images.description">
<source>images</source>
</trans-unit>
<trans-unit id="rel_category.description" resname="rel_category.description">
<source>relCategory</source>
</trans-unit>
<trans-unit id="rel_filter_values.description" resname="rel_filter_values.description">
<source>relFilterValues</source>
</trans-unit>
<trans-unit id="path_segment.description" resname="path_segment.description">
<source>url segment generated from the product title</source>
</trans-unit>
<trans-unit id="description_html.description" resname="description_html.description">
<source>farmateable description </source>
</trans-unit>
<trans-unit id="rel_ingedients.description" resname="rel_ingedients.description">
<source>ingredients</source>
</trans-unit>
<trans-unit id="rel_productvariants.description" resname="rel_productvariants.description">
<source></source>
</trans-unit>
<trans-unit id="rel_delivery_costs.description" resname="rel_delivery_costs.description">
<source>deliverycosts conditions per each product</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:a2g_travel_blog/Resources/Private/Language/locallang_db.xlf" date="2021-11-14T20:20:24Z" product-name="a2g_travel_blog">
<header/>
<body>
<trans-unit id="pages.rel_coordinate" xml:space="preserve">
<source>Coordinate</source>
</trans-unit>
<trans-unit id="pages.tabs.travel_blog" xml:space="preserve">
<source>Travel Blog</source>
</trans-unit>
<trans-unit id="pages.palettes.travel_blog" xml:space="preserve">
<source>Travel Blog</source>
</trans-unit>
<trans-unit id="a2gtravelblog_map.name" xml:space="preserve">
<source>Travel Blog Map</source>
</trans-unit>
<trans-unit id="a2gtravelblog_timeline.name" xml:space="preserve">
<source>Travel Blog Timeline</source>
</trans-unit>
<trans-unit id="wizard.group.travel_blog" xml:space="preserve">
<source>Travel Blog</source>
</trans-unit>
<trans-unit id="plugin.map.title" xml:space="preserve">
<source>Travel Blog Map</source>
</trans-unit>
<trans-unit id="plugin.map.description" xml:space="preserve">
<source> altogether Travel Blog Map</source>
</trans-unit>
<trans-unit id="plugin.timeline.title" xml:space="preserve">
<source>Travel Blog Timeline</source>
</trans-unit>
<trans-unit id="plugin.timeline.description" xml:space="preserve">
<source> altogether Travel Blog Timeline</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="a2g-travel-blog">
<f:render section="content" />
</div>
</html>

View File

@ -0,0 +1,5 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<div class="a2g-travel-blog-popup">
<f:render section="content" />
</div>
</html>

View File

@ -0,0 +1,15 @@
<f:section name="Author">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M13.687 11.587c-1.476-.421-2.507-.998-3.533-1.394-.099-.322-.333-.893-.39-2.205.706-.712 1.212-1.716 1.212-2.525V3.537C10.976 2.137 9.838 1 8.35 1h-.7c-1.4 0-2.626 1.137-2.626 2.537v1.926c0 .816.512 1.831 1.228 2.544-.024 1.288-.266 1.856-.381 2.178-1.035.394-2.071.979-3.558 1.403 0 0-1.226.7-1.313 3.413h14c-.087-2.801-1.313-3.414-1.313-3.414z"/></g></svg>
</f:section>
<f:section name="Category">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M2 1.5v13a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5v-13a.5.5 0 0 0-.5-.5h-11a.5.5 0 0 0-.5.5zM13 14H3v-3h.586l1.707 1.707.293.293H10.414l.293-.293L12.414 11H13v3zm-1-4l-2 2H6l-2-2H3V2h10v8h-1z"/><path d="M11 4H5v1h6V4zM11 6H5v1h6V6zM11 8H5v1h6V8z"/></g></svg>
</f:section>
<f:section name="Comment">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M3 3h10v8.75L11 10H3V3M2 2v9h8.5l3.5 3V2H2z"/><path d="M4 4h8v2H4zM4 7h6v1H4z"/></g></svg>
</f:section>
<f:section name="Published">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M8 2.6c3.1 0 5.4 2.4 5.4 5.4S11 13.4 8 13.4 2.5 11.1 2.5 8 4.9 2.6 8 2.6M8 1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z"/><path d="M7 4.1V8l4.1 2.5c.2-.3.4-.5.5-.9L8 7.4V4c-.3 0-.7.1-1 .1z"/></g></svg>
</f:section>
<f:section name="Tag">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M6.657 1H1v5.656l8.485 8.485 5.657-5.657L6.657 1zM1.99 6.232V1.99h4.243l7.495 7.494-4.243 4.243L1.99 6.232z"/><path d="M3.475 3.475A1.75 1.75 0 1 0 5.952 5.95a1.75 1.75 0 0 0-2.477-2.475zm.707.707a.75.75 0 1 1 1.061 1.06.75.75 0 0 1-1.061-1.06zM6.126 8.602l2.475-2.475 3.535 3.536-2.475 2.474z"/></g></svg>
</f:section>

View File

@ -0,0 +1,7 @@
<f:if condition="{image}">
<f:variable name="height" value="{f:if(condition: settings.height, then: settings.height, else: '400c')}" />
<f:variable name="width" value="{f:if(condition: settings.width, then: settings.width, else: '1140')}" />
<figure class="blogimage blogimage--featured">
<f:image loading="lazy" image="{image}" alt="{image.alternative}" title="{image.title}" height="{height}" width="{width}" />
</figure>
</f:if>

View File

@ -0,0 +1,15 @@
<f:flashMessages as="flashMessages">
<f:for each="{flashMessages}" as="flashMessage">
<f:switch expression="{flashMessage.severity}">
<f:case value="-1"><f:variable name="class" value="info" /></f:case>
<f:case value="0"><f:variable name="class" value="success" /></f:case>
<f:case value="1"><f:variable name="class" value="warning" /></f:case>
<f:case value="2"><f:variable name="class" value="danger" /></f:case>
<f:defaultCase><f:variable name="class" value="notice" /></f:defaultCase>
</f:switch>
<div class="alert alert-{class}" role="alert">
<div class="alert__title">{flashMessage.title}</div>
<div class="alert__message">{flashMessage.message}</div>
</div>
</f:for>
</f:flashMessages>

View File

@ -0,0 +1,17 @@
<f:form.validationResults>
<f:if condition="{validationResults.flattenedErrors}">
<div class="errors">
<f:for each="{validationResults.flattenedErrors}" as="errors" key="propertyPath">
<div class="alert alert-danger" role="alert">
<div class="alert__message">
<ul class="alert__list">
<f:for each="{errors}" as="error">
<li><span>{error}</span></li>
</f:for>
</ul>
</div>
</div>
</f:for>
</div>
</f:if>
</f:form.validationResults>

View File

@ -0,0 +1,18 @@
<f:section name="LinkedIn">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M15 2v12c0 .6-.5 1-1 1H2c-.6 0-1-.5-1-1V2c0-.6.5-1 1-1h12c.5 0 1 .5 1 1zM5.1 6.4h-2V13h2.1V6.4zm.2-2.3c0-.7-.5-1.2-1.2-1.2s-1.2.5-1.2 1.2.5 1.2 1.2 1.2c.6 0 1.2-.5 1.2-1.2zm7.6 4.8c0-2-1.3-2.8-2.5-2.8-.8 0-1.6.4-2.1 1.1v-.8H6.4V13h2.1V9.4C8.3 8.7 8.9 8 9.6 8h.1c.7 0 1.1.4 1.1 1.4v3.5h2.1v-4z"/></g></svg>
</f:section>
<f:section name="Rss">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M2 4c5.514 0 10 4.486 10 10h2C14 7.372 8.628 2 2 2v2z"/><path d="M2 8c3.308 0 6 2.692 6 6h2a8 8 0 0 0-8-8v2zM3.5 14a1.5 1.5 0 0 1 0-3 1.5 1.5 0 0 1 0 3z"/></g></svg>
</f:section>
<f:section name="Twitter">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M5.4 13.7c5.3 0 8.2-4.4 8.2-8.2v-.4c.6-.4 1-.9 1.4-1.5-.5.2-1.1.4-1.6.5.6-.4 1-.9 1.3-1.6-.6.3-1.2.6-1.8.7-.5-.6-1.3-.9-2.1-.9-1.6 0-2.9 1.3-2.9 2.9 0 .2 0 .4.1.7-2.5-.2-4.6-1.3-6-3.1-.3.5-.4 1-.4 1.5 0 1 .5 1.9 1.3 2.4-.5 0-.9-.1-1.3-.4 0 1.4 1 2.6 2.3 2.8-.3.1-.5.2-.8.2-.2 0-.4 0-.5-.1.4 1.1 1.4 2 2.7 2-1 .8-2.2 1.2-3.6 1.2H1c1.3.8 2.8 1.3 4.4 1.3"/></g></svg>
</f:section>
<f:section name="Instagram">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M8 2.261c1.869 0 2.09.007 2.829.041.682.031 1.053.145 1.3.241.327.127.56.279.805.524s.397.478.524.805c.096.247.21.617.241 1.3.033.738.04.959.04 2.828s-.007 2.09-.041 2.829c-.031.682-.145 1.053-.241 1.3-.127.327-.279.56-.524.805a2.168 2.168 0 0 1-.805.524c-.247.096-.617.21-1.3.241-.737.033-.959.04-2.828.04s-2.091-.007-2.829-.041c-.682-.031-1.053-.145-1.3-.241a2.168 2.168 0 0 1-.805-.524 2.168 2.168 0 0 1-.524-.805c-.096-.247-.21-.617-.241-1.3-.033-.738-.04-.959-.04-2.828s.007-2.09.041-2.829c.031-.682.145-1.053.241-1.3.127-.327.279-.56.524-.805.245-.244.478-.396.805-.523.247-.096.617-.21 1.3-.241.738-.034.959-.041 2.828-.041M8 1c-1.901 0-2.139.008-2.886.042-.745.034-1.254.152-1.699.325-.46.179-.851.418-1.24.807-.389.389-.629.78-.807 1.24-.174.446-.292.955-.326 1.7C1.008 5.861 1 6.099 1 8c0 1.901.008 2.139.042 2.886.034.745.152 1.254.325 1.699.179.46.418.851.807 1.24.389.389.78.629 1.24.807.445.173.954.291 1.699.325.748.035.986.043 2.887.043s2.139-.008 2.886-.042c.745-.034 1.254-.152 1.699-.325.46-.179.851-.418 1.24-.807.389-.389.629-.78.807-1.24.173-.445.291-.954.325-1.699.035-.748.043-.986.043-2.887s-.008-2.139-.042-2.886c-.034-.745-.152-1.254-.325-1.699a3.435 3.435 0 0 0-.807-1.24 3.422 3.422 0 0 0-1.24-.807c-.445-.173-.954-.291-1.699-.325C10.139 1.008 9.901 1 8 1z"/><path d="M8 4.405a3.596 3.596 0 1 0 .001 7.191A3.596 3.596 0 0 0 8 4.405zm0 5.928a2.333 2.333 0 1 1 0-4.666 2.333 2.333 0 0 1 0 4.666z"/><circle cx="11.737" cy="4.263" r=".84"/></g></svg>
</f:section>
<f:section name="Website">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M8 1C4.1 1 1 4.1 1 8s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7zm5.2 4h-2.5c-.2-1.1-.6-2.1-1-2.7 1.5.4 2.7 1.4 3.5 2.7zM10 8c0 .7-.1 1.4-.1 2H6.1c0-.6-.1-1.3-.1-2s.1-1.4.1-2h3.7c.1.6.2 1.3.2 2zm-2 6c-.5 0-1.2-1.1-1.7-3h3.3c-.4 1.9-1.1 3-1.6 3zM6.3 5C6.8 3.1 7.5 2 8 2s1.2 1.1 1.7 3H6.3zm0-2.7c-.4.6-.8 1.6-1 2.7H2.8c.8-1.3 2-2.3 3.5-2.7zM2.4 6h2.8C5 6.6 5 7.3 5 8s0 1.4.1 2H2.4C2.1 9.4 2 8.7 2 8s.1-1.4.4-2zm.4 5h2.5c.2 1.1.6 2.1 1 2.7-1.5-.4-2.7-1.4-3.5-2.7zm6.9 2.7c.4-.7.8-1.6 1-2.7h2.5c-.8 1.3-2 2.3-3.5 2.7zm3.9-3.7h-2.8c.2-.6.2-1.3.2-2s0-1.4-.1-2h2.8c.2.6.3 1.3.3 2s-.1 1.4-.4 2z"/></g></svg>
</f:section>
<f:section name="Xing">
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16" aria-hidden="true" role="img" focusable="false"><g fill="currentColor"><path d="M7.084 6.561c-.056.103-.787 1.387-2.19 3.859-.153.259-.337.391-.553.391H2.307c-.241 0-.378-.234-.266-.45l2.156-3.79c.006 0 .006-.003 0-.009L2.826 4.199c-.135-.243.009-.44.265-.44h2.034c.228 0 .416.128.562.381l1.397 2.421zm6.871-5.12L9.456 9.345v.009l2.862 5.205c.121.222.006.441-.266.441h-2.037c-.237 0-.425-.125-.562-.381L6.566 9.354l4.524-7.973c.143-.253.324-.381.546-.381h2.053c.25 0 .384.209.266.441z"/></g></svg>
</f:section>

View File

@ -0,0 +1,80 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers" data-namespace-typo3-fluid="true">
<picture>
<f:for each="{variants}" key="name" as="variant">
<f:variable name="breakpoint">{variant.breakpoint as integer}</f:variable>
<f:variable name="width">{variant.width as integer}</f:variable>
<f:variable name="height" value="" />
<f:if condition="{width}">
<f:if condition="{variant.aspectRatio}">
<f:variable name="aspectRatio">{variant.aspectRatio as float}</f:variable>
<f:variable name="height">{width / aspectRatio}</f:variable>
<f:variable name="height">{height as integer}</f:variable>
</f:if>
<f:variable name="mediaQuery">{f:if(condition: breakpoint, then: 'media="(min-width: {breakpoint}px)"')}</f:variable>
<f:if condition="{variant.sizes}">
<f:variable name="srcset" value="" />
<f:for each="{variant.sizes}" key="sizeKey" as="sizeConfig" iteration="iteration">
<f:variable name="sizeWidth">{sizeConfig.multiplier as float}</f:variable>
<f:variable name="sizeWidth">{sizeWidth * width}</f:variable>
<f:variable name="sizeHeight" value="" />
<f:if condition="{height}">
<f:then>
<f:variable name="sizeHeight">{sizeConfig.multiplier as float}</f:variable>
<f:variable name="sizeHeight">{sizeHeight * height}</f:variable>
<f:variable name="sizeUrl">{f:uri.image(image: file, cropVariant: name, width: '{sizeWidth}c', height: '{sizeHeight}c',absolute:'true')}</f:variable>
</f:then>
<f:else>
<f:if condition="{maxWidth} < {sizeWidth}">
<f:then>
<f:variable name="sizeUrl">{f:uri.image(image: file, cropVariant: 'default', width: maxWidth, absolute:'true')}</f:variable>
</f:then>
<f:else>
<f:variable name="sizeUrl">{f:uri.image(image: file, cropVariant: 'default', width: sizeWidth, absolute:'true')}</f:variable>
</f:else>
</f:if>
</f:else>
</f:if>
<f:variable name="srcset">{srcset}{sizeUrl} {sizeKey}{f:if(condition: iteration.isLast, else: ',')}</f:variable>
</f:for>
</f:if>
<source data-variant="{name}" {f:if(condition: sizeHeight, then: 'data-width="{width}" data-height="{sizeHeight}"', else: 'data-maxwidth="{width}"')} {mediaQuery->f:format.raw()} srcset="{srcset}">
</f:if>
</f:for>
<f:variable name="defaultWidth" value="{variants.default.width}" />
<f:variable name="defaultAspectRatio" value="{variants.default.aspectRatio}" />
<f:if condition="{defaultAspectRatio}">
<f:variable name="aspectRatio">{defaultAspectRatio as float}</f:variable>
<f:variable name="defaultHeight">{defaultWidth / aspectRatio}</f:variable>
<f:variable name="defaultHeight">{defaultHeight as integer}c</f:variable>
</f:if>
<f:if condition="{defaultHeight}">
<f:then>
<f:variable name="src" value="{f:uri.image(image: file, cropVariant: 'default', width: defaultWidth, height: defaultHeight, absolute:'true')}" />
</f:then>
<f:else>
<f:if condition="{maxWidth}">
<f:then>
<f:variable name="src" value="{f:uri.image(image: file, cropVariant: 'default', width: maxWidth, absolute:'true')}" />
</f:then>
<f:else>
<f:variable name="src" value="{f:uri.image(image: file, cropVariant: 'default', width: defaultWidth, absolute:'true')}" />
</f:else>
</f:if>
</f:else>
</f:if>
<f:variable name="finalWidth" value="{bk2k:data.imageInfo(src: src, property: 'width')}" />
<f:variable name="finalHeight" value="{bk2k:data.imageInfo(src: src, property: 'height')}" />
<f:if condition="itemprop">
<f:then>
<img loading="lazy" itemprop="image" src="{src}" width="{finalWidth}" height="{finalHeight}" intrinsicsize="{finalWidth}x{finalHeight}" title="{file.properties.title}" alt="{file.properties.alternative}">
</f:then>
<f:else>
<img loading="lazy" src="{src}" width="{finalWidth}" height="{finalHeight}" intrinsicsize="{finalWidth}x{finalHeight}" title="{file.properties.title}" alt="{file.properties.alternative}">
</f:else>
</f:if>
</picture>
</html>

View File

@ -0,0 +1,36 @@
<div class="postlist{f:if(condition: type, then: ' postlist--{type}')}">
<f:if condition="{pagination} && {pagination.paginatedItems}">
<f:then>
<f:if condition="{settings.lists.pagination.insertAbove}">
<f:render partial="Pagination/Pagination" arguments="{pagination: pagination}" />
</f:if>
<div class=" card-group-element card-group-element-align-left card-group-element-columns-2">
<f:for each="{pagination.paginatedItems}" iteration="iterator" as="post">
<blogvh:cache post="{post}" />
<f:render partial="List/Post" arguments="{_all}" />
</f:for>
</div>
<f:if condition="{settings.lists.pagination.insertBelow}">
<f:render partial="Pagination/Pagination" arguments="{pagination: pagination}" />
</f:if>
</f:then>
<f:else if="{posts}">
<f:for each="{posts}" iteration="iterator" as="post">
<blogvh:cache post="{post}" />
<f:render partial="List/Post" arguments="{_all}" />
</f:for>
</f:else>
<f:else>
<div class="alert alert-info" role="alert">
<strong><f:translate key="list.no_posts.title" /></strong><br><f:translate key="list.no_posts.message" />
</div>
</f:else>
</f:if>
</div>

View File

@ -0,0 +1,19 @@
<div class="bloglist__item bloglist__item--archiveyear" data-blog-archive-year="{year}">
<h2 class="bloglist__title" itemprop="name">
<blogvh:link.archive year="{year}" title="{year}">{year}</blogvh:link.archive>
</h2>
<div class="bloglist__content">
<ul class="bloglinklist">
<f:for each="{months}" as="month">
<li class="bloglinklist__item" data-blog-archive-year="{year}" data-blog-archive-month="{month.month}">
<blogvh:link.archive class="bloglinklist__itemlink" year="{year}" month="{month.month}" title="{f:format.date(format: '{settings.archive.monthDateFormat} {settings.archive.yearDateFormat}', date: month.timestamp)}">
<span class="bloglinklist__itemtitle">{f:format.date(format: '{settings.archive.monthDateFormat}', date: month.timestamp)}</span>
<f:if condition="{settings.archive.showCounter} == 1">
<span class="bloglinklist__itemcount">{month.count}</span>
</f:if>
</blogvh:link.archive>
</li>
</f:for>
</ul>
</div>
</div>

View File

@ -0,0 +1,22 @@
<div class="bloglist__item--author card" data-blog-author="{author.uid}">
<div class="card-body">
<div class="bloglist__image">
<f:variable name="avatarsize" value="{settings.authors.avatar.provider.size as integer}" />
<f:if condition="{avatarsize}"><f:else><f:variable name="avatarsize" value="32" /></f:else></f:if>
<img loading="lazy" class="bloglist__imageavatar blogavatar" height="{avatarsize}" width="{avatarsize}" src="{author.avatar}" itemprop="image">
</div>
<h2 class="bloglist__title" itemprop="name">
<blogvh:link.author author="{author}" />
</h2>
<f:if condition="{author.bio}">
<p class="bloglist__description" itemprop="description">
<f:format.crop maxCharacters="200" append="&nbsp;[...]">{author.bio}</f:format.crop>
</p>
</f:if>
<blogvh:link.author class="bloglist__link" author="{author}">
<f:translate key="list.show.author" />
</blogvh:link.author>
</div>
</div>

View File

@ -0,0 +1,18 @@
<div class="card-group-element-item">
<div class=" bloglist__item--category card" data-blog-category="{category.uid}">
<div class="card-body">
<h2 class="bloglist__title" itemprop="name">
<blogvh:link.category category="{category}" />
</h2>
<f:if condition="{category.description}">
<p class="bloglist__description" itemprop="description">
<f:format.crop maxCharacters="200" append="&nbsp;[...]">{category.description}</f:format.crop>
</p>
</f:if>
<blogvh:link.category class="bloglist__link" category="{category}">
<f:translate key="list.show.discover" default="entdecken"/>
</blogvh:link.category>
</div>
</div>
</div>

View File

@ -0,0 +1,27 @@
<article class="card-group-element-item" data-blog-tag="{f:if(condition: post.tags, then: post.tags.0.uid, else: 0)}" data-blog-category="{f:if(condition: post.categories, then: post.categories.0.uid, else: 0)}">
<div class="card">
<div class="card-body">
<f:if condition="{post.featuredImage}">
<blogvh:link.post post="{post}" class="postlist__featuredimage" additionalAttributes="{aria-hidden: 'true'}" tabindex="-1">
<f:render partial="General/FeaturedImage" arguments="{image: post.featuredImage, settings: settings.lists.featuredImage}" />
</blogvh:link.post>
</f:if>
<h2 class="postlist__posttitle" itemprop="name"><blogvh:link.post post="{post}" /></h2>
<f:render partial="Meta/ListHeader" arguments="{_all}" />
<f:if condition="{post.abstract}">
<f:then>
<p class="postlist__postdescription" itemprop="description">{post.abstract}</p>
</f:then>
<f:else>
<p class="postlist__postdescription" itemprop="description">{post.description}</p>
</f:else>
</f:if>
<f:render partial="Meta/ListFooter" arguments="{_all}" />
</div>
</div>
</article>

View File

@ -0,0 +1,25 @@
<html xmlns:dc="http://purl.org/dc/elements/1.1/" data-namespace-typo3-fluid="true">
<f:spaceless>
<item>
<title>{post.title}</title>
<link><blogvh:link.post post="{post}" returnUri="true" createAbsoluteUri="true" /></link>
<f:if condition="{settings.comments.active} && {post.commentsActive}">
<comments><blogvh:link.post post="{post}" section="comments" returnUri="true" createAbsoluteUri="true" /></comments>
</f:if>
<pubDate><f:format.date date="{post.publishDate}" format="r" /></pubDate>
<f:if condition="{post.authors}">
<f:for each="{post.authors}" as="author">
<dc:creator>{author.name}</dc:creator>
</f:for>
</f:if>
<guid><blogvh:link.post post="{post}" returnUri="true" createAbsoluteUri="true" /></guid>
<description><f:if condition="{post.abstract}"><f:then>{post.abstract}</f:then><f:else>{post.description}</f:else></f:if></description>
<f:if condition="{post.featuredImage}">
<enclosure
length="{post.featuredImage.originalResource.size}"
type="{post.featuredImage.originalResource.mimeType}"
url="{f:uri.image(image: post.featuredImage, absolute: '1')}" />
</f:if>
</item>
</f:spaceless>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
<div class="bloglist__item bloglist__item--tag" data-blog-tag="{tag.uid}">
<h2 class="bloglist__title" itemprop="name">
<blogvh:link.tag tag="{tag}" />
</h2>
<f:if condition="{tag.description}">
<p class="bloglist__description" itemprop="description">
<f:format.crop maxCharacters="200" append="&nbsp;[...]">{tag.description}</f:format.crop>
</p>
</f:if>
<blogvh:link.tag class="bloglist__link" tag="{tag}">
<f:translate key="list.show.tag" />
</blogvh:link.tag>
</div>

View File

@ -0,0 +1,31 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:bk2k="http://typo3.org/ns/BK2K/BootstrapPackage/ViewHelpers" data-namespace-typo3-fluid="true">
<f:if condition="{settings.useLayerSwitcher} === '1' && {settings.controllsPositions} === '2'">
<input class="a2g-map-layer-swipe form-range" type="range" style="width: 100%" value="{settings.layerSwitcherValue}">
</f:if>
<div class="d-flex justify-content-center">
<f:if condition="{settings.showRemoveMarkerButton} === '1'">
<div class="m-3 form-check form-switch">
<input id="{mapId}-hide-marker-{settings.controllsPositions}" class="form-check-input a2g-map-marker-visible-switcher" type="checkbox">
<label for="{mapId}-hide-marker-{settings.controllsPositions}" class="form-check-label">hide marker</label>
</div>
</f:if>
<f:if condition="{settings.showMyPositionButton} === '1'">
<div class="m-3 form-check form-switch">
<input id="{mapId}-lacate-me-{settings.controllsPositions}" class="form-check-input a2g-map-geolocate-me" type="checkbox">
<label for="{mapId}-hide-marker-{settings.controllsPositions}" class="form-check-label">locate me</label>
</div>
</f:if>
<f:if condition="{settings.showLayerSelect} === '1' && {countMapLayers}>1">
<div class="m-3">
<label>Geometry type &nbsp;</label>
<select class="a2g-map-layer-select">
</select>
</div>
</f:if>
</div>
<f:if condition="{settings.useLayerSwitcher} === '1' && ( {settings.controllsPositions} === '1' || {settings.controllsPositions} === '3'} )">
<input class="a2g-map-layer-swipe form-range" type="range" style="width: 100%" value="{settings.layerSwitcherValue}">
</f:if>
</html>

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="default" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,31 @@
<f:variable name="name">authors</f:variable>
<f:variable name="icon"><f:render partial="General/BlogIcons" section="Author" optional="true" /></f:variable>
<f:variable name="prefix"><f:translate key="meta.authors.author"/></f:variable>
<f:if condition="{post.authors}">
<f:if condition="{post.authors -> f:count()} > 1">
<f:variable name="prefix"><f:translate key="meta.authors.authors"/></f:variable>
</f:if>
<f:render partial="Meta/Rendering/Item" arguments="{name: name, icon: icon, prefix: prefix}" contentAs="content">
<ul class="postmetagroup__list">
<f:for each="{post.authors}" as="author">
<li>
<span class="postmetagroup__listitem" data-blog-author="{author.uid}">
<f:if condition="{avatarSettings.enable}">
<f:variable name="avatarsize" value="{avatarSettings.size as integer}" />
<f:if condition="{avatarsize}"><f:else><f:variable name="avatarsize" value="24" /></f:else></f:if>
<span class="postmetagroup__listprefix"><img loading="lazy" class="postmetagroup__listavatar blogavatar" height="{avatarsize}" width="{avatarsize}" src="{author.avatar}" itemprop="image"></span>
</f:if>
<span class="postmetagroup__listtext" data-prefix="{f:translate(key:'meta.authors.author')}"><f:render section="ProfileLink" arguments="{author: author}" contentAs="content">{author.name}</f:render></span>
</span>
</li>
</f:for>
</ul>
</f:render>
</f:if>
<f:section name="ProfileLink">
<f:if condition="{author.detailsPage} || {settings.authorUid}">
<f:then><blogvh:link.author rel="author" author="{author}"><span itemprop="name">{content}</span></blogvh:link.author></f:then>
<f:else><span itemprop="name">{content}</span></f:else>
</f:if>
</f:section>

View File

@ -0,0 +1,20 @@
<f:variable name="name">categories</f:variable>
<f:variable name="icon"><f:render partial="General/BlogIcons" section="Category" optional="true" /></f:variable>
<f:variable name="prefix"><f:translate key="meta.categories.category"/></f:variable>
<f:if condition="{post.categories}">
<f:if condition="{post.categories -> f:count()} > 1">
<f:variable name="prefix"><f:translate key="meta.categories.categories"/></f:variable>
</f:if>
<f:render partial="Meta/Rendering/Item" arguments="{name: name, icon: icon, prefix: prefix}" contentAs="content">
<ul class="postmetagroup__list">
<f:for each="{post.categories}" as="postCategory">
<li>
<span class="postmetagroup__listitem" data-blog-category="{postCategory.uid}">
<span class="postmetagroup__listtext"><blogvh:link.category category="{postCategory}" /></span>
</span>
</li>
</f:for>
</ul>
</f:render>
</f:if>

View File

@ -0,0 +1,23 @@
<f:variable name="name">comments</f:variable>
<f:variable name="icon"><f:render partial="General/BlogIcons" section="Comment" optional="true" /></f:variable>
<f:variable name="prefix"><f:translate key="meta.comments.join_conversation"/></f:variable>
<f:variable name="text"><f:translate key="meta.comments.comments"/></f:variable>
<f:if condition="{settings.comments.active} && {post.commentsActive}">
<f:variable name="commentCount" value="{post.activeComments -> f:count()}" />
<f:if condition="{settings.comments.disqus._typoScriptNodeValue} != 1">
<f:if condition="{commentCount} == 0">
<f:variable name="prefix"><f:translate key="meta.comments.start_conversation"/></f:variable>
<f:variable name="text"><f:translate key="meta.comments.has_comments" arguments="{0: commentCount}"/></f:variable>
</f:if>
<f:if condition="{commentCount} == 1">
<f:variable name="text"><f:translate key="meta.comments.has_comment" arguments="{0: commentCount}"/></f:variable>
</f:if>
<f:if condition="{commentCount} >= 1">
<f:variable name="text"><f:translate key="meta.comments.has_comments" arguments="{0: commentCount}"/></f:variable>
</f:if>
</f:if>
<f:render partial="Meta/Rendering/Item" arguments="{name: name, icon: icon, prefix: prefix}" contentAs="content">
<blogvh:link.post post="{post}" section="comments">{text}</blogvh:link.post>
</f:render>
</f:if>

View File

@ -0,0 +1,10 @@
<f:variable name="name">published</f:variable>
<f:variable name="icon"><f:render partial="General/BlogIcons" section="Published" optional="true" /></f:variable>
<f:variable name="prefix"><f:translate key="meta.published.published"/></f:variable>
<f:render partial="Meta/Rendering/Item" arguments="{name: name, icon: icon, prefix: prefix}" contentAs="content">
<blogvh:link.post post="{post}" rel="bookmark">
<f:if condition="!{publishDateFormat}"><f:variable name="dateformat" value="%d.%m.%Y" /></f:if>
<time datetime="{f:format.date(format: '%Y-%m-%dT%H:%M:%S-%z', date: post.publishDate)}" itemprop="datepublished">{f:format.date(format: publishDateFormat, date: post.publishDate)}</time>
</blogvh:link.post>
</f:render>

View File

@ -0,0 +1,20 @@
<f:variable name="name">tags</f:variable>
<f:variable name="icon"><f:render partial="General/BlogIcons" section="Tag" optional="true" /></f:variable>
<f:variable name="prefix"><f:translate key="meta.tags.tag"/></f:variable>
<f:if condition="{post.tags}">
<f:if condition="{post.tags -> f:count()} > 1">
<f:variable name="prefix"><f:translate key="meta.tags.tags"/></f:variable>
</f:if>
<f:render partial="Meta/Rendering/Item" arguments="{name: name, icon: icon, prefix: prefix}" contentAs="content">
<ul class="postmetagroup__list">
<f:for each="{post.tags}" as="postTag">
<li>
<span class="postmetagroup__listitem" data-blog-tag="{postTag.uid}">
<span class="postmetagroup__listtext"><blogvh:link.tag tag="{postTag}" /></span>
</span>
</li>
</f:for>
</ul>
</f:render>
</f:if>

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="listfooter" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="listheader" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="postfooter" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="postheader" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,3 @@
<div class="postmetagroup postmetagroup--{settings.meta.{metatype}.modifier} postmetagroup--type-{metatype}">
{content -> f:format.raw()}
</div>

View File

@ -0,0 +1,12 @@
<f:if condition="!{name}"><f:variable name="name">default</f:variable></f:if>
<div class="postmetagroup__item postmetagroup__item--{name}">
<f:if condition="{icon}">
<div class="postmetagroup__icon">
<span class="blogicon">{icon -> f:format.raw()}</span>
</div>
</f:if>
<div class="postmetagroup__body">
<f:if condition="{prefix}"><div class="postmetagroup__prefix">{prefix -> f:format.raw()}</div></f:if>
<f:if condition="{content}"><div class="postmetagroup__content">{content -> f:format.raw()}</div></f:if>
</div>
</div>

View File

@ -0,0 +1,23 @@
<f:if condition="!{metatype}"><f:variable name="metatype" value="default" /></f:if>
<f:variable name="modifier" value="{settings.meta.{metatype}.modifier}" />
<f:if condition="{settings.meta.{metatype}.enable}">
<f:render partial="Meta/Rendering/Group" arguments="{_all}" contentAs="content">
<f:if condition="{settings.meta.{metatype}.elements.authors.enable}">
<f:variable name="avatarSettings" value="{settings.meta.{metatype}.elements.authors.avatar}" />
<f:render partial="Meta/Elements/Authors" arguments="{_all}" />
</f:if>
<f:if condition="{settings.meta.{metatype}.elements.categories.enable}">
<f:render partial="Meta/Elements/Categories" arguments="{_all}" />
</f:if>
<f:if condition="{settings.meta.{metatype}.elements.tags.enable}">
<f:render partial="Meta/Elements/Tags" arguments="{_all}" />
</f:if>
<f:if condition="{settings.meta.{metatype}.elements.published.enable}">
<f:variable name="publishDateFormat" value="{settings.meta.{metatype}.elements.published.format}" />
<f:render partial="Meta/Elements/Published" arguments="{_all}" />
</f:if>
<f:if condition="{settings.meta.{metatype}.elements.comments.enable}">
<f:render partial="Meta/Elements/Comments" arguments="{_all}" />
</f:if>
</f:render>
</f:if>

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="teaserfooter" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,2 @@
<f:variable name="metatype" value="teaserheader" />
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />

View File

@ -0,0 +1,7 @@
<div class="tx-blog-post-list">
<ul>
<f:for each="{posts}" as="post">
<li>{f:format.date(format: '{settings.lists.posts.dateFormat}', date: post.publishDate)} <blogvh:link.post post="{post}" /></li>
</f:for>
</ul>
</div>

View File

@ -0,0 +1,22 @@
<div class="card-group-element-item">
<article class="postteaser__post card" data-blog-tag="{f:if(condition: post.tags, then: post.tags.0.uid, else: 0)}" data-blog-category="{f:if(condition: post.categories, then: post.categories.0.uid, else: 0)}">
<div class="card-body">
<f:if condition="{post.featuredImage}">
<blogvh:link.post post="{post}" class="postteaser__featuredimage" additionalAttributes="{aria-hidden: 'true'}" tabindex="-1">
<f:render partial="General/FeaturedImage" arguments="{image: post.featuredImage, settings: settings.teaser.featuredImage}" />
</blogvh:link.post>
</f:if>
<h2 class="postteaser__posttitle" itemprop="name"><blogvh:link.post post="{post}" /></h2>
<f:render partial="Meta/TeaserHeader" arguments="{_all}" />
<f:if condition="{post.abstract}">
<f:then>
<p class="postteaser__postdescription" itemprop="description">{post.abstract}</p>
</f:then>
<f:else>
<p class="postteaser__postdescription" itemprop="description">{post.description}</p>
</f:else>
</f:if>
<f:render partial="Meta/TeaserFooter" arguments="{_all}" />
</div>
</article>
</div>

View File

@ -0,0 +1,6 @@
<div class="card-group-element card-group-element-columns-3 card-group-element-align-center postteaser{f:if(condition: type, then: ' postteaser--{type}')}" data-blog-postcount="{posts -> f:count()}">
<f:for each="{posts}" iteration="iterator" as="post">
<blogvh:cache post="{post}" />
<f:render partial="Teaser/Post" arguments="{_all}" />
</f:for>
</div>

View File

@ -0,0 +1,38 @@
<div class="postlist{f:if(condition: type, then: ' postlist--{type}')} timeline">
<f:if condition="{pagination} && {pagination.paginatedItems}">
<f:then>
<f:if condition="{settings.lists.pagination.insertAbove}">
<f:render partial="Pagination/Pagination" arguments="{pagination: pagination}" />
</f:if>
<f:for each="{pagination.paginatedItems}" iteration="iterator" as="post">
<div class="timeline-item">
<blogvh:cache post="{post}" />
<f:render partial="List/PostTimeline" arguments="{_all}" />
</div>
</f:for>
<f:if condition="{settings.lists.pagination.insertBelow}">
<f:render partial="Pagination/Pagination" arguments="{pagination: pagination}" />
</f:if>
</f:then>
<f:else if="{posts}">
<f:for each="{posts}" iteration="iterator" as="post">
<div class="timeline-item">
<blogvh:cache post="{post}" />
<f:render partial="List/PostTimeline" arguments="{_all}" />
</div>
</f:for>
</f:else>
<f:else>
<div class="alert alert-info" role="alert">
<strong><f:translate key="list.no_posts.title" /></strong><br><f:translate key="list.no_posts.message" />
</div>
</f:else>
</f:if>
</div>

View File

@ -0,0 +1,12 @@
<f:layout name="Post" />
<f:section name="Content">
<f:if condition="{post.authors}">
<div class="postauthors">
<f:for each="{post.authors}" as="author">
<f:render partial="Post/Author" arguments="{_all}" />
</f:for>
</div>
</f:if>
</f:section>

View File

@ -0,0 +1,12 @@
<f:layout name="Post" />
<f:section name="Content">
<footer class="postfooter">
<f:if condition="{settings.meta.postfooter.enable}">
<div class="postfooter__meta">
<f:render partial="Meta/PostFooter" arguments="{_all}" />
</div>
</f:if>
</footer>
</f:section>

View File

@ -0,0 +1,18 @@
<f:layout name="Post" />
<f:section name="Content">
<header class="postheader">
<f:if condition="{post.featuredImage}">
<div class="postheader__featuredimage">
<f:render partial="General/FeaturedImage" arguments="{image: post.featuredImage, settings: settings.post.featuredImage}" />
</div>
</f:if>
<h1 class="postheader__title">{post.title}</h1>
<f:if condition="{settings.meta.postheader.enable}">
<div class="postheader__meta">
<f:render partial="Meta/PostHeader" arguments="{_all}" />
</div>
</f:if>
</header>
</f:section>

View File

@ -0,0 +1,4 @@
<f:layout name="Default" />
<f:section name="Content">
<f:render partial="TeaserList" arguments="{_all}"/>
</f:section>

View File

@ -0,0 +1,4 @@
<f:layout name="Default" />
<f:section name="Content">
<f:render partial="List" arguments="{_all}"/>
</f:section>

View File

@ -0,0 +1,68 @@
<f:layout name="Default" />
<f:section name="Content">
<f:if condition="{author}">
<f:then>
<header class="blogarchiveheader blogarchiveheader--author">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext">
<f:translate key="headline.author.simple" />:
{author.name}
</span>
<blogvh:link.author class="blogarchiveheader__titlelink" rss="true" author="{author}">
<span class="blogicon"><f:render partial="General/SocialIcons" section="Rss" optional="true" /></span>
</blogvh:link.author>
</h1>
<f:if condition="{author.bio}">
<div class="blogarchiveheader__description">
<p>{author.bio}</p>
</div>
</f:if>
<f:if condition="{author.allTags}">
<div class="blogarchiveheader__taxonomy blogarchiveheader__taxonomy--tags">
<ul class="blogtaglist">
<f:for each="{author.allTags}" as="tag">
<li class="blogtaglist__item"><blogvh:link.tag class="blogbadge" tag="{tag}"/></li>
</f:for>
</ul>
</div>
</f:if>
<div class="a2g-map-wrap">
<div class="ol-popup a2g-map-popup d-none" >
<a href="#" class="ol-popup-closer a2g-map-popup-closer"></a>
<div class="a2g-map-popup-content"></div>
</div>
<div class="a2g-map"
data-marker-source="<f:uri.action action='mapMarkersFromAuthor' arguments='{authors: {0: author.uid}}' pluginName='MapConfig' controller='Map' extensionName='A2gTravelBlog' pageType='1652369512'></f:uri.action>"
data-map-config='{"zoom":2,"maxZoom":18,"centerLon":0,"centerLat":0,"mapLayers":[{"layer":"osm","config":[],"label":"osm_map_layer","active":true}],"zoomSlider":true,"fullScreen":true}'></div>
</div>
</header>
<f:render partial="Timeline" arguments="{_all}" />
<f:if condition="{settings.authorUid}">
<footer class="blogarchivefooter blogarchivefooter--author">
<div class="blogarchivefooter__backlink">
<f:link.page pageUid="{settings.authorUid}">
<f:translate key="list.backlink.authors" />
</f:link.page>
</div>
</footer>
</f:if>
</f:then>
<f:else>
<header class="blogarchiveheader blogarchiveheader--authors">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext"><f:translate key="headline.authors" /></span>
</h1>
</header>
<div class="bloglist bloglist--authors card-group-element card-group-element-columns-2 card-group-element-align-center">
<f:for each="{authors}" as="author">
<f:render partial="List/Author" arguments="{_all}" />
</f:for>
</div>
</f:else>
</f:if>
</f:section>

View File

@ -0,0 +1,96 @@
<f:layout name="Default" />
<f:section name="Content">
<f:if condition="{category}">
<f:then>
<header class="blogarchiveheader blogarchiveheader--category">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext">
<f:translate key="headline.traveldestination.simple" default="Reiseziel"/>:
{category.title}
</span>
<blogvh:link.category class="blogarchiveheader__titlelink" rss="true" category="{category}">
<span class="blogicon"><f:render partial="General/SocialIcons" section="Rss" optional="true" /></span>
</blogvh:link.category>
</h1>
<div class="blogarchiveheader__description">
<p>{category.description}</p>
</div>
<bk2k:data.imageVariants as="variants" variants="{variants}" multiplier="{columnConfig.multiplier}" gutters="{columnConfig.gutters}" corrections="{columnConfig.corrections}" />
<div class="a2g-map-wrap me-3">
<div class="ol-popup a2g-map-popup d-none" >
<a href="#" class="ol-popup-closer a2g-map-popup-closer"></a>
<div class="a2g-map-popup-content"></div>
</div>
<div class="a2g-map"
data-marker-source="<f:uri.action action='mapMarkersFromCategories' arguments='{categories:{0:category.uid}}' pluginName='MapConfig' controller='Map' extensionName='A2gTravelBlog' pageType='1652369512'></f:uri.action>"
data-map-config='{"zoom":2,"maxZoom":18,"centerLon":0,"centerLat":0,"centerCountry": true,"style": {"featureOverlay":{"stroke":{"color": "rgba(240,145,48,0.7)","width": 4}}},"mapLayers":[{"layer": "country","config": {"layer": "country","countryGeoSource": "<f:uri.action action="activeCountryGeojson" arguments="{categories:{0:category.uid}}" pluginName="MapConfig" controller="Map" extensionName="A2gTravelBlog" pageType="1652369512"></f:uri.action>"},"label": "country (free)","active": true},{"layer":"osm","config":[],"label":"osm_map_layer","active":true}],"zoomSlider":true,"fullScreen":true}'></div>
</div>
</header>
<f:render partial="List" arguments="{_all}" />
<f:if condition="{settings.categoryUid} || {category.content}">
<footer class="blogarchivefooter blogarchivefooter--category">
<f:if condition="{settings.categoryUid}">
<div class="blogarchivefooter__backlink">
<f:link.page pageUid="{settings.categoryUid}">
<f:translate key="list.backlink.categories" />
</f:link.page>
</div>
</f:if>
<f:if condition="{category.content}">
<div class="blogarchivefooter__content">
<f:cObject typoscriptObjectPath="lib.blog.contentElementRendering">{category.contentElementUidList}</f:cObject>
</div>
</f:if>
</footer>
</f:if>
</f:then>
<f:else>
<header class="blogarchiveheader blogarchiveheader--categories">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext">
<f:translate key="headline.traveldestinations" default="Reiseziele"/>
</span>
</h1>
</header>
<div class="a2g-map-wrap mb-3">
<div class="ol-popup a2g-map-popup d-none" >
<a href="#" class="ol-popup-closer a2g-map-popup-closer"></a>
<div class="a2g-map-popup-content"></div>
</div>
<div class="a2g-map"
data-map-config='{"zoom":2,"maxZoom":18,
"centerLon":0,"centerLat":0,
"style": {
"featureOverlay":{
"stroke":{
"color": "rgba(240,145,48,0.7)",
"width": 4
}
}
},
"mapLayers":[{
"layer": "country",
"config": { "layer": "country", "countryGeoSource": "<f:uri.action action="activeCountriesGeojson" pluginName="MapConfig" controller="Map" extensionName="A2gTravelBlog" pageType="1652369512"></f:uri.action>" },"label": "country (free)","active": true },{"layer":"osm","config":[],"label":"osm_map_layer","active":true}], "zoomSlider":true,"fullScreen":true}'></div>
</div>
<div class="bloglist bloglist--categories card-group-element card-group-element-columns-3 card-group-element-align-center">
<f:for each="{categories}" as="category">
<f:render partial="List/Category" arguments="{_all}" />
</f:for>
</div>
</f:else>
</f:if>
</f:section>

View File

@ -0,0 +1,47 @@
<f:layout name="Default" />
<f:section name="Content">
<f:if condition="!{archiveData}">
<f:then>
<f:comment>If a year/+month is selected show posts matching.</f:comment>
<header class="blogarchiveheader blogarchiveheader--archive">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext">
<f:if condition="{month}">{f:format.date(format: '{settings.widgets.archive.monthDateFormat}', date: timestamp)}</f:if> {year}
</span>
<blogvh:link.archive class="blogarchiveheader__titlelink" rss="true" year="{year}" month="{month}">
<span class="blogicon"><f:render partial="General/SocialIcons" section="Rss" optional="true" /></span>
</blogvh:link.archive>
</h1>
</header>
<f:render partial="List" arguments="{_all}" />
<f:if condition="{settings.authorUid}">
<footer class="blogarchivefooter blogarchivefooter--archive">
<div class="blogarchivefooter__backlink">
<f:link.page pageUid="{settings.archiveUid}">
<f:translate key="list.backlink.archive" />
</f:link.page>
</div>
</footer>
</f:if>
</f:then>
<f:else>
<f:comment>If year is missing show an overview of the archive.</f:comment>
<header class="blogarchiveheader blogarchiveheader--archive">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext">
<f:translate key="headline.archive"/>
</span>
</h1>
</header>
<div class="bloglist bloglist--archive">
<f:for each="{archiveData}" as="months" key="year">
<f:render partial="List/Archive" arguments="{_all}" />
</f:for>
</div>
</f:else>
</f:if>
</f:section>

View File

@ -0,0 +1,64 @@
<f:layout name="Default" />
<f:section name="Content">
<f:if condition="{tag}">
<f:then>
<header class="blogarchiveheader blogarchiveheader--tag">
<h1 class="blogarchiveheader__title">
<span class="page__titletext">
<f:translate key="headline.tag.simple" />:
{tag.title}
</span>
<blogvh:link.tag class="page__titlelink" rss="true" tag="{tag}">
<span class="blogicon"><f:render partial="General/SocialIcons" section="Rss" optional="true" /></span>
</blogvh:link.tag>
</h1>
<div class="blogarchiveheader__description">
<p>{tag.description}</p>
</div>
<div class="a2g-map-wrap">
<div class="ol-popup a2g-map-popup d-none" >
<a href="#" class="ol-popup-closer a2g-map-popup-closer"></a>
<div class="a2g-map-popup-content"></div>
</div>
<div class="a2g-map"
data-marker-source="<f:uri.action action='mapMarkersFromTag' arguments='{tag: tag.uid}' pluginName='MapConfig' controller='Map' extensionName='A2gTravelBlog' pageType='1652369512'></f:uri.action>"
data-map-config='{"zoom":2,"maxZoom":18,"centerLon":0,"centerLat":0,"mapLayers":[{"layer":"osm","config":[],"label":"osm_map_layer","active":true}],"zoomSlider":true,"fullScreen":true}'></div>
</div>
</header>
<f:render partial="List" arguments="{_all}" />
<f:if condition="{settings.tagUid} || {tag.content}">
<footer class="blogarchivefooter blogarchivefooter--tag">
<f:if condition="{settings.tagUid}">
<div class="blogarchivefooter__backlink">
<f:link.page pageUid="{settings.tagUid}">
<f:translate key="list.backlink.tags" />
</f:link.page>
</div>
</f:if>
<f:if condition="{tag.content}">
<div class="blogarchivefooter__content">
<f:cObject typoscriptObjectPath="lib.blog.contentElementRendering">{tag.contentElementUidList}</f:cObject>
</div>
</f:if>
</footer>
</f:if>
</f:then>
<f:else>
<header class="blogarchiveheader blogarchiveheader--tags">
<h1 class="blogarchiveheader__title">
<span class="blogarchiveheader__titletext">
<f:translate key="headline.tags" />
</span>
</h1>
</header>
<div class="bloglist bloglist--tag">
<f:for each="{tags}" as="tag">
<f:render partial="List/Tag" arguments="{_all}" />
</f:for>
</div>
</f:else>
</f:if>
</f:section>

View File

@ -0,0 +1,4 @@
<f:layout name="Default" />
<f:section name="Content">
<f:render partial="List" arguments="{_all}"/>
</f:section>

Some files were not shown because too many files have changed in this diff Show More