initial commit
This commit is contained in:
commit
813b2d3da4
472
Classes/Controller/MapController.php
Normal file
472
Classes/Controller/MapController.php
Normal file
@ -0,0 +1,472 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace A2G\A2gTravelBlog\Controller;
|
||||
|
||||
use \A2G\A2gMaps\Domain\Traits\InjectMarkerRepositoryTrait;
|
||||
use A2G\A2gTravelBlog\Domain\Traits\{
|
||||
InjectMapEntryRepositoryTrait,
|
||||
InjectTravelAuthorRepositoryTrait,
|
||||
InjectImageServiceTrait,
|
||||
InjectTravelPostRepositoryTrait,
|
||||
InjectTravelCategoryRepositoryTrait,
|
||||
};
|
||||
use A2G\A2gMaps\Utility\MapConfigUtility;
|
||||
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
|
||||
use TYPO3\CMS\Extbase\Object\ObjectManager;
|
||||
use TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext;
|
||||
use TYPO3\CMS\Fluid\View\TemplateView;
|
||||
use TYPO3\CMS\Fluid\View\StandaloneView;
|
||||
use T3G\AgencyPack\Blog\Constants;
|
||||
use TYPO3\CMS\Extbase\Mvc\Request;
|
||||
use TYPO3\CMS\Core\Utility\MathUtility;
|
||||
use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry;
|
||||
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
|
||||
|
||||
/**
|
||||
* This file is part of the "Products" Extension for TYPO3 CMS.
|
||||
*
|
||||
* For the full copyright and license information, please read the
|
||||
* LICENSE.txt file that was distributed with this source code.
|
||||
*
|
||||
* (c) 2021 Raphael Martin <raphy.martin@gmail.com>, none
|
||||
*/
|
||||
|
||||
/**
|
||||
* MapController
|
||||
*/
|
||||
class MapController extends ActionController {
|
||||
|
||||
use InjectMarkerRepositoryTrait;
|
||||
use InjectMapEntryRepositoryTrait;
|
||||
use InjectTravelAuthorRepositoryTrait;
|
||||
use InjectTravelPostRepositoryTrait;
|
||||
use InjectTravelCategoryRepositoryTrait;
|
||||
use InjectImageServiceTrait;
|
||||
|
||||
private static $mapIcons = null;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param UriBuilder $uriBuilder
|
||||
* @param TemplateView $sourceView
|
||||
* @param type $arguments
|
||||
* @param type $actionName
|
||||
* @param type $controllerName
|
||||
* @return string
|
||||
*/
|
||||
static private function generateContent(UriBuilder $uriBuilder, TemplateView &$sourceView, $arguments = [], $actionName = 'popup', $controllerName = 'Map'): StandaloneView {
|
||||
$templatePath = $controllerName . '/' . ucfirst($actionName);
|
||||
$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
|
||||
$templateRootPaths = $sourceView->getTemplateRootPaths();
|
||||
$context = $objectManager->get(ControllerContext::class);
|
||||
$request = $objectManager->get(Request::class);
|
||||
$context->setRequest($request);
|
||||
$context->setUriBuilder($uriBuilder);
|
||||
/**
|
||||
* @var StandaloneView $view
|
||||
*/
|
||||
$view = $objectManager->get(StandaloneView::class);
|
||||
$view->setControllerContext($context);
|
||||
$view->setLayoutRootPaths($sourceView->getLayoutRootPaths());
|
||||
$view->setTemplateRootPaths($templateRootPaths);
|
||||
$view->setPartialRootPaths($sourceView->getPartialRootPaths());
|
||||
$view->setTemplate($templatePath);
|
||||
$arguments['today'] = (new \DateTime())->format('d.m.Y');
|
||||
|
||||
$view->assignMultiple($arguments);
|
||||
return $view;
|
||||
}
|
||||
|
||||
private function setMapMarkerIcons() {
|
||||
if (self::$mapIcons === null) {
|
||||
self::$mapIcons = [];
|
||||
$markers = $this->markerRepository->findAll();
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getMapIcon() !== null) {
|
||||
self::$mapIcons[] = [
|
||||
'uid' => 'i-' . $marker->getUid(),
|
||||
'icon' => $this->imageService->getImageUri($this->imageService->applyProcessingInstructions($this->imageService->getImage('', $marker->getMapIcon(), false), []), true)
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* action map
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapAction() {
|
||||
$layerIds = explode(',', $this->settings['layers']);
|
||||
$layerConfigs = MapConfigUtility::getMapLayerConfig($layerIds);
|
||||
if ($this->settings['useLayerSwitcher'] === '1') {
|
||||
for ($i = 0; $i < count($layerConfigs); $i++) {
|
||||
$layerConfigs[$i]['active'] = true;
|
||||
}
|
||||
}
|
||||
$this->uriBuilder->setTargetPageType(1652369512);
|
||||
$centerLat = 0.0;
|
||||
$centerLon = 0.0;
|
||||
switch ((int) $this->settings['mapType']) {
|
||||
case 0:
|
||||
$markers = $this->mapEntryRepository->findAll();
|
||||
$markerUri = $this->uriBuilder->uriFor('allMapMarkers', null, null, null, 'MapConfig');
|
||||
$zoom = 1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
$travelPost = $this->travelPostRepository->findByUid((int) $this->configurationManager->getContentObject()->data['pid']);
|
||||
if ($travelPost !== null && $travelPost->getDoktype() === Constants::DOKTYPE_BLOG_POST) {
|
||||
$markers = $travelPost->getRelMapEntries();
|
||||
foreach ($markers as $marker) {
|
||||
$centerLat = $centerLat + $marker->getLatitude();
|
||||
$centerLon = $centerLon + $marker->getLongitude();
|
||||
}
|
||||
$centerLat = $centerLat / count($markers);
|
||||
$centerLon = $centerLon / count($markers);
|
||||
$markerUri = $this->uriBuilder->uriFor('postMapMarkers', null, null, null, 'MapConfig');
|
||||
$zoom = 6;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
$cats = explode(',', $this->settings['showCategories']);
|
||||
$args = ['tx_a2gtravelblog_mapconfig' => ['categories' => $cats]];
|
||||
$travelPosts = $this->travelPostRepository->getFromCategoryUids($cats);
|
||||
$this->uriBuilder->setArguments($args);
|
||||
|
||||
$markerUri = $this->uriBuilder->uriFor('mapMarkersFromCategories', null, null, null, 'MapConfig');
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $travelPost) {
|
||||
$markers[$travelPost->getUid()] = $travelPost->getRelMapEntries()->current();
|
||||
$centerLat = $centerLat + $markers[$travelPost->getUid()]->getLatitude();
|
||||
$centerLon = $centerLon + $markers[$travelPost->getUid()]->getLongitude();
|
||||
}
|
||||
$centerLat = $centerLat / count($markers);
|
||||
$centerLon = $centerLon / count($markers);
|
||||
$zoom = 3;
|
||||
break;
|
||||
case 3:
|
||||
$authorUids = explode(',', $this->settings['showAuthors']);
|
||||
$args = ['tx_a2gtravelblog_mapconfig' => ['authors' => $authorUids]];
|
||||
$travelPosts = $this->travelPostRepository->getFromAuthorUids($authorUids);
|
||||
$this->uriBuilder->setArguments($args);
|
||||
$markerUri = $this->uriBuilder->uriFor('mapMarkersFromAuthor', null, null, null, 'MapConfig');
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $travelPost) {
|
||||
$markers[$travelPost->getUid()] = $travelPost->getRelMapEntries()->current();
|
||||
$centerLat = $centerLat + $markers[$travelPost->getUid()]->getLatitude();
|
||||
$centerLon = $centerLon + $markers[$travelPost->getUid()]->getLongitude();
|
||||
}
|
||||
$centerLat = $centerLat / count($markers);
|
||||
$centerLon = $centerLon / count($markers);
|
||||
$zoom = 2;
|
||||
break;
|
||||
default:
|
||||
$markers = [];
|
||||
$zoom = 1;
|
||||
break;
|
||||
}
|
||||
if ((int) $this->settings['zoom'] > 0) {
|
||||
$zoom = (int) $this->settings['zoom'];
|
||||
}
|
||||
if (count($markers) > 0) {
|
||||
$showMarkers = true;
|
||||
} else {
|
||||
$showMarkers = false;
|
||||
}
|
||||
$this->view->assignMultiple([
|
||||
'mapId' => 'a2g-map-' . uniqid(),
|
||||
'countMapLayers' => count($layerIds),
|
||||
'mapConfig' => \GuzzleHttp\json_encode(MapConfigUtility::getMapConfig(
|
||||
$layerIds,
|
||||
null,
|
||||
$showMarkers === true ? $markerUri : null,
|
||||
null,
|
||||
$zoom,
|
||||
18, $centerLon, $centerLat,
|
||||
true, true, true))
|
||||
]);
|
||||
}
|
||||
|
||||
private function getMarkersFromCategories(array $uids) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function getMarkers(int $uid = 0) {
|
||||
$travelPost = $this->travelPostRepository->findByUid($uid);
|
||||
if ($travelPost !== null && $travelPost->getDoktype() === Constants::DOKTYPE_BLOG_POST) {
|
||||
$markers = [];
|
||||
foreach ($travelPost->getRelMapEntries() as $post) {
|
||||
$markers[] = $post;
|
||||
}
|
||||
} else {
|
||||
$markers = [];
|
||||
$posts = $this->travelPostRepository->findAll();
|
||||
foreach ($posts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
}
|
||||
return $markers;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* action mapMarkersFromTag
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapMarkersFromTagAction() {
|
||||
$travelPosts = $this->travelPostRepository->getFromTagUids([(int)$_GET['tx_a2gtravelblog_mapconfig']['tag']]);
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker], 'popup')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapMarkersFromAuthorAction() {
|
||||
$travelPosts = $this->travelPostRepository->getFromAuthorUids($_GET['tx_a2gtravelblog_mapconfig']['authors']);
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker], 'popup')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapMarkersFromCategoriesAction() {
|
||||
|
||||
$travelPosts = $this->travelPostRepository->getFromCategoryUids($_GET['tx_a2gtravelblog_mapconfig']['categories']);
|
||||
$markers = [];
|
||||
foreach ($travelPosts as $post) {
|
||||
if (count($post->getRelMapEntries()) > 0) {
|
||||
$markers[] = $post->getRelMapEntries()->current();
|
||||
}
|
||||
}
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker], 'popup')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function postMapMarkersAction() {
|
||||
$markers = $this->getMarkers((int) $this->configurationManager->getContentObject()->data['uid']);
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['mapEntry' => $marker], 'popupPost')->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
/**
|
||||
* action mapMarkers
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function allMapMarkersAction() {
|
||||
$markers = $this->getMarkers();
|
||||
$out = [
|
||||
"type" => "FeatureCollection",
|
||||
"totalFeatures" => count($markers),
|
||||
"csr" => MapConfigUtility::getMarkerCsr(),
|
||||
"features" => []
|
||||
];
|
||||
foreach ($markers as $marker) {
|
||||
if ($marker->getRelMarker() !== null) {
|
||||
$tmpIcon = "i-" . $marker->getRelMarker()->getUid();
|
||||
} else if ($marker->getRelTravelPost()->getAuthors()->count() > 0) {
|
||||
$author = $this->travelAuthorRepository->findByUid($marker->getRelTravelPost()->getAuthors()->current()->getUid());
|
||||
$tmpIcon = $author === null || $author->getRelMapMarker() === null ? null : "i-" . $author->getRelMapMarker()->getUid();
|
||||
} else {
|
||||
$tmpIcon = null;
|
||||
}
|
||||
$out["features"][] = MapConfigUtility::getMarker($marker, $tmpIcon, self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'mapEntry' => $marker])->render());
|
||||
}
|
||||
return \GuzzleHttp\json_encode($out);
|
||||
}
|
||||
|
||||
public function activeCountryGeojsonAction(){
|
||||
$travelCats=[];
|
||||
foreach($_GET['tx_a2gtravelblog_mapconfig']['categories'] as $uid){
|
||||
$travelCats[] = $this->travelCategoryRepository->findByUid((int)$uid);
|
||||
|
||||
}
|
||||
$isoCodes = [];
|
||||
foreach($travelCats as $travelCat){
|
||||
$isoCodes[$travelCat->getIsoA2CountryCode()] = null;
|
||||
}
|
||||
return \GuzzleHttp\json_encode(MapConfigUtility::getCountryFeatureCollectionsFromIsoCodeList($isoCodes));
|
||||
}
|
||||
|
||||
public function activeCountriesGeojsonAction(){
|
||||
$travelCats = $this->travelCategoryRepository->findAll();
|
||||
$isoCodes = [];
|
||||
foreach($travelCats as $travelCat){
|
||||
$isoCodes[$travelCat->getIsoA2CountryCode()] = self::generateContent($this->uriBuilder, $this->view, ['settings' => $this->settings, 'category' => $travelCat], 'popupCategory')->render();
|
||||
}
|
||||
return \GuzzleHttp\json_encode(MapConfigUtility::getCountryFeatureCollectionsFromIsoCodeList($isoCodes));
|
||||
}
|
||||
|
||||
/**
|
||||
* action mapConfig
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function mapConfigAction() {
|
||||
|
||||
$this->setMapMarkerIcons();
|
||||
$this->view->assignMultiple([
|
||||
'mapIcons' => \GuzzleHttp\json_encode(self::$mapIcons)
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* action ajaxListAction
|
||||
*
|
||||
* @return string|object|null|void
|
||||
*/
|
||||
public function ajaxListAction() {
|
||||
|
||||
}
|
||||
|
||||
// /**
|
||||
// * action show
|
||||
// *
|
||||
// * @param Ingredients $ingredient
|
||||
// * @return string|object|null|void
|
||||
// */
|
||||
// public function showAction(Ingredients $ingredient) {
|
||||
// $titleProvider = GeneralUtility::makeInstance(A2gPageTitleProvider::class);
|
||||
//
|
||||
// if($this->settings['pageTitleSuffix'] !== null && $this->settings['pageTitleSuffix'] !== '' && (strlen($ingredient->getTitle()) + strlen($this->settings['pageTitleSuffix'])) < 66 ){
|
||||
// $pageTitle = $ingredient->getTitle(). ' ' . $this->settings['pageTitleSuffix'];
|
||||
// } else {
|
||||
// $pageTitle = $ingredient->getTitle();
|
||||
// }
|
||||
// $titleProvider->setTitle($pageTitle);
|
||||
// $contentObject = GeneralUtility::makeInstance(ContentObjectRenderer::class);
|
||||
// $description = $contentObject->crop($ingredient->getDescription(), 125 . '|...|' . true);
|
||||
//
|
||||
// $uri = $this->uriBuilder->reset()->setCreateAbsoluteUri(true)->setTargetPageUid(
|
||||
// $GLOBALS['TSFE']->id)->uriFor('show', ['ingredient' => $ingredient], 'Ingredients', 'a2gProducts', 'ingredientsdetail');
|
||||
//
|
||||
// $metaTagManager = GeneralUtility::makeInstance(MetaTagManagerRegistry::class);
|
||||
//
|
||||
// $metaTagManager->getManagerForProperty('robots')->addProperty('robots', 'index, folow');
|
||||
// $metaTagManager->getManagerForProperty('og:type')->addProperty('og:type', 'website');
|
||||
// $metaTagManager->getManagerForProperty('twitter:card')->addProperty('twitter:card', 'summary_large_image');
|
||||
//
|
||||
// if ($ingredient->getTitle() !== '') {
|
||||
// $metaTagManager->getManagerForProperty('title')->addProperty('title', $pageTitle);
|
||||
// $metaTagManager->getManagerForProperty('og:title')->addProperty('og:title', $pageTitle);
|
||||
// $metaTagManager->getManagerForProperty('twitter:title')->addProperty('twitter:title', $pageTitle);
|
||||
// }
|
||||
// if ($ingredient->getDescription() !== '') {
|
||||
// $metaTagManager->getManagerForProperty('description')->addProperty('description', $description);
|
||||
// $metaTagManager->getManagerForProperty('og:description')->addProperty('og:description', $description);
|
||||
// $metaTagManager->getManagerForProperty('twitter:description')->addProperty('twitter:description', $description);
|
||||
// }
|
||||
// $metaTagManager->getManagerForProperty('og:url')->addProperty('og:url', $uri);
|
||||
// $metaTagManager->getManagerForProperty('twitter:url')->addProperty('twitter:url', $uri);
|
||||
//
|
||||
// if ($ingredient->getImage() !== null) {
|
||||
// $processedImage = $this->imageService->applyProcessingInstructions(
|
||||
// $this->imageService->getImage('', $ingredient->getImage(), false),
|
||||
// ['width' => '
|
||||
// 1200', 'height' => '630c']
|
||||
// );
|
||||
// $metaTagManager->getManagerForProperty('twitter:image')->addProperty('twitter:image', $this->imageService->getImageUri($processedImage, true));
|
||||
// $metaTagManager->getManagerForProperty('og:image')->addProperty('og:image', $this->imageService->getImageUri($processedImage, true));
|
||||
// }
|
||||
// $this->view->assign('ingredient', $ingredient);
|
||||
// }
|
||||
}
|
123
Classes/Controller/TravelPostController.php
Normal file
123
Classes/Controller/TravelPostController.php
Normal 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);
|
||||
}
|
||||
}
|
57
Classes/Domain/Model/MapEntry.php
Normal file
57
Classes/Domain/Model/MapEntry.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
57
Classes/Domain/Model/TravelAuthor.php
Normal file
57
Classes/Domain/Model/TravelAuthor.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
42
Classes/Domain/Model/TravelCategory.php
Normal file
42
Classes/Domain/Model/TravelCategory.php
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
56
Classes/Domain/Model/TravelMarker.php
Normal file
56
Classes/Domain/Model/TravelMarker.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
86
Classes/Domain/Model/TravelPost.php
Normal file
86
Classes/Domain/Model/TravelPost.php
Normal 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;
|
||||
}
|
||||
}
|
50
Classes/Domain/Repository/MapEntryRepository.php
Normal file
50
Classes/Domain/Repository/MapEntryRepository.php
Normal 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);
|
||||
}
|
||||
}
|
49
Classes/Domain/Repository/TravelAuthorRepository.php
Normal file
49
Classes/Domain/Repository/TravelAuthorRepository.php
Normal 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);
|
||||
}
|
||||
}
|
42
Classes/Domain/Repository/TravelCategoryRepository.php
Normal file
42
Classes/Domain/Repository/TravelCategoryRepository.php
Normal 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);
|
||||
}
|
||||
}
|
61
Classes/Domain/Repository/TravelPostRepository.php
Normal file
61
Classes/Domain/Repository/TravelPostRepository.php
Normal 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);
|
||||
}
|
||||
}
|
35
Classes/Domain/Traits/InjectImageServiceTrait.php
Normal file
35
Classes/Domain/Traits/InjectImageServiceTrait.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
27
Classes/Domain/Traits/InjectMapEntryRepositoryTrait.php
Normal file
27
Classes/Domain/Traits/InjectMapEntryRepositoryTrait.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
27
Classes/Domain/Traits/InjectTravelAuthorRepositoryTrait.php
Normal file
27
Classes/Domain/Traits/InjectTravelAuthorRepositoryTrait.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
27
Classes/Domain/Traits/InjectTravelPostRepositoryTrait.php
Normal file
27
Classes/Domain/Traits/InjectTravelPostRepositoryTrait.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
64
Classes/Evaluation/LatitudeEvaluation.php
Normal file
64
Classes/Evaluation/LatitudeEvaluation.php
Normal 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'];
|
||||
}
|
||||
}
|
64
Classes/Evaluation/LongitudeEvaluation.php
Normal file
64
Classes/Evaluation/LongitudeEvaluation.php
Normal 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'];
|
||||
}
|
||||
}
|
22
Classes/PageTitle/A2gPageTitleProvider.php
Normal file
22
Classes/PageTitle/A2gPageTitleProvider.php
Normal 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;
|
||||
}
|
||||
}
|
65
Classes/Utility/CanonicalUtility.php
Normal file
65
Classes/Utility/CanonicalUtility.php
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
95
Classes/Utility/EvalcoordinatesUtility.php
Normal file
95
Classes/Utility/EvalcoordinatesUtility.php
Normal 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;
|
||||
}
|
||||
}
|
237
Classes/Utility/MapConfigUtility.php
Normal file
237
Classes/Utility/MapConfigUtility.php
Normal 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;
|
||||
}
|
||||
}
|
73
Classes/ViewHelpers/MapViewHelper.php
Normal file
73
Classes/ViewHelpers/MapViewHelper.php
Normal 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
2
Configuration/.htaccess
Normal file
@ -0,0 +1,2 @@
|
||||
Order deny,allow
|
||||
Deny from all
|
22
Configuration/Extbase/Persistence/Classes.php
Normal file
22
Configuration/Extbase/Persistence/Classes.php
Normal 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',
|
||||
]
|
||||
|
||||
];
|
338
Configuration/FlexForms/flexform_map.xml
Normal file
338
Configuration/FlexForms/flexform_map.xml
Normal 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>
|
76
Configuration/FlexForms/flexform_timeline.xml
Normal file
76
Configuration/FlexForms/flexform_timeline.xml
Normal 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>
|
5
Configuration/Services.yml
Normal file
5
Configuration/Services.yml
Normal file
@ -0,0 +1,5 @@
|
||||
services:
|
||||
_defaults:
|
||||
autowire: true
|
||||
autoconfigure: true
|
||||
public: false
|
155
Configuration/TCA/Overrides/100_pages.php
Normal file
155
Configuration/TCA/Overrides/100_pages.php
Normal 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
|
||||
);
|
21
Configuration/TCA/Overrides/101_sys_template.php
Normal file
21
Configuration/TCA/Overrides/101_sys_template.php
Normal 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'
|
||||
);
|
41
Configuration/TCA/Overrides/102_tt_content.php
Normal file
41
Configuration/TCA/Overrides/102_tt_content.php
Normal 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
|
||||
//);
|
||||
|
||||
}
|
813
Configuration/TCA/Overrides/103_sys_category.php
Normal file
813
Configuration/TCA/Overrides/103_sys_category.php
Normal 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
|
||||
);
|
@ -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'
|
||||
);
|
@ -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'
|
||||
//);
|
@ -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');
|
4
Configuration/TsConfig/Page/All.tsconfig
Normal file
4
Configuration/TsConfig/Page/All.tsconfig
Normal file
@ -0,0 +1,4 @@
|
||||
##################
|
||||
#### TsConfig ####
|
||||
##################
|
||||
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:a2g_travel_blog/Configuration/TsConfig/Page/Wizards.tsconfig">
|
28
Configuration/TsConfig/Page/Wizards.tsconfig
Normal file
28
Configuration/TsConfig/Page/Wizards.tsconfig
Normal 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 = *
|
||||
}
|
17
Configuration/TypoScript/Base/constants.typoscript
Normal file
17
Configuration/TypoScript/Base/constants.typoscript
Normal 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 {
|
||||
|
||||
}
|
||||
}
|
63
Configuration/TypoScript/Base/setup.typoscript
Normal file
63
Configuration/TypoScript/Base/setup.typoscript
Normal 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
|
||||
}
|
||||
}
|
2
Configuration/TypoScript/constants.typoscript
Normal file
2
Configuration/TypoScript/constants.typoscript
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:a2g_travel_blog/Configuration/TypoScript/Base/constants.typoscript">
|
3
Configuration/TypoScript/setup.typoscript
Normal file
3
Configuration/TypoScript/setup.typoscript
Normal 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
9
LICENSE
Normal 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.
|
11
Resources/Private/.htaccess
Normal file
11
Resources/Private/.htaccess
Normal 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>
|
36
Resources/Private/Language/de.locallang.xlf
Normal file
36
Resources/Private/Language/de.locallang.xlf
Normal 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>
|
@ -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 <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
<target>Produkt Titel / Name <br/>
|
||||
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( <a href="https://ogp.me/">open graph</a> )</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="description.description" resname="description.description">
|
||||
<source>description <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
<target>Produkt Beschreibung <br/>
|
||||
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( <a href="https://ogp.me/">open graph</a> )</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="image.description" resname="image.description">
|
||||
<source>product list image <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
<target>Produkt Listen Bild <br/>
|
||||
für Suchmaschinenoptimierung ( SEO ) und Link-Vorschau ( <a href="https://ogp.me/">open graph</a> )</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>
|
296
Resources/Private/Language/de.locallang_db.xlf
Normal file
296
Resources/Private/Language/de.locallang_db.xlf
Normal 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>
|
29
Resources/Private/Language/locallang.xlf
Normal file
29
Resources/Private/Language/locallang.xlf
Normal 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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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 <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="description.description" resname="description.description">
|
||||
<source>description <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="image.description" resname="image.description">
|
||||
<source>product list image <br/>
|
||||
for Search Engin Optimation ( SEO ) and link preview ( <a href="https://ogp.me/">open graph</a> )</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>
|
44
Resources/Private/Language/locallang_db.xlf
Normal file
44
Resources/Private/Language/locallang_db.xlf
Normal 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>
|
5
Resources/Private/Layouts/Default.html
Normal file
5
Resources/Private/Layouts/Default.html
Normal 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>
|
5
Resources/Private/Layouts/MapPopupContent.html
Normal file
5
Resources/Private/Layouts/MapPopupContent.html
Normal 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>
|
15
Resources/Private/Partials/General/BlogIcons.html
Normal file
15
Resources/Private/Partials/General/BlogIcons.html
Normal 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>
|
7
Resources/Private/Partials/General/FeaturedImage.html
Normal file
7
Resources/Private/Partials/General/FeaturedImage.html
Normal 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>
|
15
Resources/Private/Partials/General/FlashMessages.html
Normal file
15
Resources/Private/Partials/General/FlashMessages.html
Normal 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>
|
17
Resources/Private/Partials/General/FormErrors.html
Normal file
17
Resources/Private/Partials/General/FormErrors.html
Normal 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>
|
18
Resources/Private/Partials/General/SocialIcons.html
Normal file
18
Resources/Private/Partials/General/SocialIcons.html
Normal 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>
|
80
Resources/Private/Partials/Image.html
Normal file
80
Resources/Private/Partials/Image.html
Normal 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>
|
36
Resources/Private/Partials/List.html
Normal file
36
Resources/Private/Partials/List.html
Normal 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>
|
19
Resources/Private/Partials/List/Archive.html
Normal file
19
Resources/Private/Partials/List/Archive.html
Normal 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>
|
22
Resources/Private/Partials/List/Author.html
Normal file
22
Resources/Private/Partials/List/Author.html
Normal 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=" [...]">{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>
|
18
Resources/Private/Partials/List/Category.html
Normal file
18
Resources/Private/Partials/List/Category.html
Normal 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=" [...]">{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>
|
27
Resources/Private/Partials/List/Post.html
Normal file
27
Resources/Private/Partials/List/Post.html
Normal 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>
|
25
Resources/Private/Partials/List/Post.rss
Normal file
25
Resources/Private/Partials/List/Post.rss
Normal 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>
|
50
Resources/Private/Partials/List/PostTimeline.html
Normal file
50
Resources/Private/Partials/List/PostTimeline.html
Normal file
File diff suppressed because one or more lines are too long
13
Resources/Private/Partials/List/Tag.html
Normal file
13
Resources/Private/Partials/List/Tag.html
Normal 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=" [...]">{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>
|
31
Resources/Private/Partials/Map/Controll.html
Normal file
31
Resources/Private/Partials/Map/Controll.html
Normal 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 </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>
|
2
Resources/Private/Partials/Meta/Default.html
Normal file
2
Resources/Private/Partials/Meta/Default.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="default" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
31
Resources/Private/Partials/Meta/Elements/Authors.html
Normal file
31
Resources/Private/Partials/Meta/Elements/Authors.html
Normal 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>
|
20
Resources/Private/Partials/Meta/Elements/Categories.html
Normal file
20
Resources/Private/Partials/Meta/Elements/Categories.html
Normal 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>
|
23
Resources/Private/Partials/Meta/Elements/Comments.html
Normal file
23
Resources/Private/Partials/Meta/Elements/Comments.html
Normal 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>
|
10
Resources/Private/Partials/Meta/Elements/Published.html
Normal file
10
Resources/Private/Partials/Meta/Elements/Published.html
Normal 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>
|
20
Resources/Private/Partials/Meta/Elements/Tags.html
Normal file
20
Resources/Private/Partials/Meta/Elements/Tags.html
Normal 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>
|
2
Resources/Private/Partials/Meta/ListFooter.html
Normal file
2
Resources/Private/Partials/Meta/ListFooter.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="listfooter" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
2
Resources/Private/Partials/Meta/ListHeader.html
Normal file
2
Resources/Private/Partials/Meta/ListHeader.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="listheader" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
2
Resources/Private/Partials/Meta/PostFooter.html
Normal file
2
Resources/Private/Partials/Meta/PostFooter.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="postfooter" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
2
Resources/Private/Partials/Meta/PostHeader.html
Normal file
2
Resources/Private/Partials/Meta/PostHeader.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="postheader" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
3
Resources/Private/Partials/Meta/Rendering/Group.html
Normal file
3
Resources/Private/Partials/Meta/Rendering/Group.html
Normal file
@ -0,0 +1,3 @@
|
||||
<div class="postmetagroup postmetagroup--{settings.meta.{metatype}.modifier} postmetagroup--type-{metatype}">
|
||||
{content -> f:format.raw()}
|
||||
</div>
|
12
Resources/Private/Partials/Meta/Rendering/Item.html
Normal file
12
Resources/Private/Partials/Meta/Rendering/Item.html
Normal 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>
|
23
Resources/Private/Partials/Meta/Rendering/Section.html
Normal file
23
Resources/Private/Partials/Meta/Rendering/Section.html
Normal 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>
|
2
Resources/Private/Partials/Meta/TeaserFooter.html
Normal file
2
Resources/Private/Partials/Meta/TeaserFooter.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="teaserfooter" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
2
Resources/Private/Partials/Meta/TeaserHeader.html
Normal file
2
Resources/Private/Partials/Meta/TeaserHeader.html
Normal file
@ -0,0 +1,2 @@
|
||||
<f:variable name="metatype" value="teaserheader" />
|
||||
<f:render partial="Meta/Rendering/Section" arguments="{_all}" />
|
7
Resources/Private/Partials/SimpleList.html
Normal file
7
Resources/Private/Partials/SimpleList.html
Normal 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>
|
22
Resources/Private/Partials/Teaser/Post.html
Normal file
22
Resources/Private/Partials/Teaser/Post.html
Normal 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>
|
6
Resources/Private/Partials/TeaserList.html
Normal file
6
Resources/Private/Partials/TeaserList.html
Normal 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>
|
38
Resources/Private/Partials/Timeline.html
Normal file
38
Resources/Private/Partials/Timeline.html
Normal 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>
|
||||
|
12
Resources/Private/Templates/Blog/Post/Authors.html
Normal file
12
Resources/Private/Templates/Blog/Post/Authors.html
Normal 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>
|
12
Resources/Private/Templates/Blog/Post/Footer.html
Normal file
12
Resources/Private/Templates/Blog/Post/Footer.html
Normal 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>
|
18
Resources/Private/Templates/Blog/Post/Header.html
Normal file
18
Resources/Private/Templates/Blog/Post/Header.html
Normal 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>
|
4
Resources/Private/Templates/Blog/Post/ListByDemand.html
Normal file
4
Resources/Private/Templates/Blog/Post/ListByDemand.html
Normal file
@ -0,0 +1,4 @@
|
||||
<f:layout name="Default" />
|
||||
<f:section name="Content">
|
||||
<f:render partial="TeaserList" arguments="{_all}"/>
|
||||
</f:section>
|
@ -0,0 +1,4 @@
|
||||
<f:layout name="Default" />
|
||||
<f:section name="Content">
|
||||
<f:render partial="List" arguments="{_all}"/>
|
||||
</f:section>
|
68
Resources/Private/Templates/Blog/Post/ListPostsByAuthor.html
Normal file
68
Resources/Private/Templates/Blog/Post/ListPostsByAuthor.html
Normal 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>
|
@ -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>
|
47
Resources/Private/Templates/Blog/Post/ListPostsByDate.html
Normal file
47
Resources/Private/Templates/Blog/Post/ListPostsByDate.html
Normal 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>
|
64
Resources/Private/Templates/Blog/Post/ListPostsByTag.html
Normal file
64
Resources/Private/Templates/Blog/Post/ListPostsByTag.html
Normal 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>
|
@ -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
Loading…
Reference in New Issue
Block a user