<?php
namespace App\Twig;
use Pimcore\Model\DataObject\AlpsteinRegion;
use Pimcore\Model\DataObject\AlpsteinTour;
use Pimcore\Model\DataObject\Community;
use Pimcore\Model\DataObject\Region;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class AlpsteinExtension extends AbstractExtension
{
public function getName(): string
{
return "Alpstein Extension";
}
public function getFunctions(): array
{
return [
new TwigFunction('getStyriaRegionByAlpsteinTour', [$this, 'getStyriaRegionByAlpsteinTour']),
new TwigFunction('getStartingRegionsFromTour', [$this, 'getStartingRegionsFromTour']),
new TwigFunction('getFirstStyriaRegion', [$this, 'getFirstStyriaRegion']),
new TwigFunction('getFirstStyriaCommunity', [$this, 'getFirstStyriaCommunity']),
];
}
public function getStyriaRegionByAlpsteinTour(AlpsteinTour $alpsteinTour) :?Region {
$styriaRegion = null;
$startingRegions = $this->getStartingRegionsFromTour($alpsteinTour);
if(empty($startingRegions)) {// use first region if no starting region is found
$regions = $alpsteinTour->getRegions();
if($regions[0] && $regions[0]->getElement()) {
$startingRegions = [$regions[0]->getElement()];
}
}
foreach ($startingRegions as $startingRegion) {
$styriaRegion = $this->getFirstStyriaRegion($startingRegion);
if($styriaRegion instanceof Region) {
break;
}
$community = $this->getFirstStyriaCommunity($startingRegion);
if($community instanceof Community && $community->getParent() instanceof Region) {
$styriaRegion = $community->getParent();
break;
}
}
return $styriaRegion;
}
public function getStartingRegionsFromTour(AlpsteinTour $alpsteinTour) :array {
$startingRegions = [];
$regions = $alpsteinTour->getRegions();
foreach($regions as $regionData){
if ($regionData->getIsStartingRegion()) {
$startingRegions[] = $regionData->getElement();
}
}
return $startingRegions;
}
public function getFirstStyriaRegion(AlpsteinRegion $alpsteinRegion): ?Region {
$list = new Region\Listing();
$list->addConditionParam("alpsteinRegions like '%," . $alpsteinRegion->getId() .",%'");
return $list->getCount() > 0 ? $list->getObjects()[0]: null;
}
public function getFirstStyriaCommunity(AlpsteinRegion $alpsteinRegion) : ?Community {
$list = new Community\Listing();
$list->addConditionParam("alpsteinObjects like '%," . $alpsteinRegion->getId() .",%'");
return $list->getCount() > 0 ? $list->getObjects()[0]: null;
}
}