<?php
namespace App\Controller;
use App\Services\Cache\ReferenceFilterCacheService;
use App\Services\ReferenceFilterService;
use App\Templating\Helper\ConfigHelper;
use App\Templating\Helper\UrlHelper;
use App\Tools\SelectOptionsHelper;
use App\Tools\IndexHelper;
use App\Twig\LinkGenerator;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
use Pimcore\Log\ApplicationLogger;
use Pimcore\Model\DataObject\AbstractObject;
use Pimcore\Model\DataObject\Application;
use Pimcore\Model\DataObject\ApplicationArea;
use Pimcore\Model\DataObject\Decor;
use Pimcore\Model\DataObject\Fieldcollection\Data\ReferenceCollaborator;
use Pimcore\Model\DataObject\MaterialGroup;
use Pimcore\Model\DataObject\Reference;
use Pimcore\Model\DataObject\Reference\Listing;
use Pimcore\Model\DataObject\SiteConfig;
use Pimcore\Model\DataObject\Surface;
use Pimcore\Translation\Translator;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Intl\Countries;
use Symfony\Component\Stopwatch\Stopwatch;
class ReferenceController extends AbstractController
{
protected const MAPPING_OBJECT_TITLE = [
'applicationArea' => 'title',
'application' => 'title',
'materialGroup' => 'title',
'surface' => 'title',
'decor' => 'title',
];
protected Translator $translator;
protected SiteConfig $siteConfig;
public function __construct(ApplicationLogger $applicationLogger, Translator $translator, ConfigHelper $configHelper)
{
$this->applicationLogger = $applicationLogger;
$this->translator = $translator;
$this->siteConfig = $configHelper->getSiteConfig();
}
public function overviewAction(Request $request, PaginatorInterface $paginator, ReferenceFilterCacheService $cacheService, ReferenceFilterService $referenceFilterService, Factory $factory, ListHelper $listHelper): JsonResponse|Response
{
$viewParams = [];
$params = array_merge($request->query->all(), $request->request->all());
$filterDefinition = $this->getDocumentEditable('relation', 'filterDefinition')->getElement();
if (empty($filterDefinition)) {
$filterDefinition = \Pimcore\Config::getWebsiteConfig()->fallbackFilterdefinition;
}
$viewParams['filterDefinition'] = $filterDefinition;
$referenceListing = $factory->getIndexService()->getProductListForCurrentTenant();
$referenceListing->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
$referenceListing->addCondition(IndexHelper::INDEX_O_CLASS_ID .' = "Reference"');
$viewParams['productListing'] = $referenceListing;
$references = $factory->getIndexService()->getProductListForCurrentTenant();
$references->setVariantMode(ProductListInterface::VARIANT_MODE_HIDE);
$references->addCondition(IndexHelper::INDEX_O_CLASS_ID .' = "Reference"');
$filterService = $factory->getFilterService();
$listHelper->setupProductList($filterDefinition, $references, $params, $filterService, true);
$viewParams['filterService'] = $filterService;
$viewParams['currentFilter'] = $params['currentFilter'];
$paging = $paginator->paginate($references, $request->get('page', 1), $filterDefinition->getPageLimit());
$viewParams['references'] = $paging;
// Needs get all filter types and values selected
$gtm = (object) array(
"gtm" => [
"datalayer" => [
"event" => "select_reference_filter",
"filter_type" => "application",
"filter_value" => "doors",
]
]
);
// Return Json-Response for Ajax Form
if ($request->isXmlHttpRequest()) {
return $this->json([
'success' => true,
'html' => $this->renderTemplate('references/includes/reference-grid-container.html.twig', $viewParams)->getContent(),
'responseTrackingData' => $gtm,
]);
}
return $this->render('references/overview.html.twig', $viewParams);
}
public function detailAction(Request $request, LinkGenerator $linkGenerator, UrlHelper $urlHelper): Response
{
$reference = $this->getValidDetailObject($request, Reference::class);
$keyValues = [];
if ($reference->getArchitects()) {
$key = $this->translator->trans('reference-detail.architects');
$value = '<p>';
foreach ($reference->getArchitects() as $architect) {
$value .= $architect->get('name');
if ($architect->get('company')) {
$value .= " ({$architect->get('company')})";
}
if ($architect->get('website')) {
$value .= "<br /><a href='{$urlHelper->getValidUrl($architect->get('website'))}'>{$architect->get('website')}</a>";
}
}
$value .= '</p>';
$keyValues[] = [
'key' => $key,
'value' => $value
];
}
if ($reference->getPhotographer()) {
$keyValues[] = [
'key' => $this->translator->trans('reference-detail.photographer'),
'value' => $reference->getPhotographer()
];
}
if ($reference->getCollaborators() && !empty($reference->getCollaborators()->getItems())) {
$key = $this->translator->trans('reference-detail.collaborators');
$value = '<p>';
$collabs = [];
foreach ($reference->getCollaborators() as $collaborator) {
/** @var ReferenceCollaborator $collaborator */
$collabValue = $collaborator->getName();
if ($collaborator->getRole()) {
$collabValue .= " ({$collaborator->getRole()})";
}
$collabs[] = $collabValue;
}
$value .= implode(', ', $collabs);
$value .= '</p>';
$keyValues[] = [
'key' => $key,
'value' => $value
];
}
if ($reference->getCity() || $reference->getCountry()) {
$value = '';
if ($reference->getCity()) {
$value .= $reference->getCity();
if ($reference->getCountry()) {
$value .= ', ';
}
}
if ($reference->getCountry()) {
$value .= Countries::getName($reference->getCountry());
}
$keyValues[] = [
'key' => $this->translator->trans('reference-detail.location'),
'value' => $value
];
}
if ($reference->getSize()) {
$keyValues[] = [
'key' => $this->translator->trans('reference-detail.size'),
'value' => $reference->getSize()
];
}
if ($reference->getClient()) {
$keyValues[] = [
'key' => $this->translator->trans('reference-detail.client'),
'value' => $reference->getClient()
];
}
$references = new Listing();
$references->addConditionParam(IndexHelper::INDEX_O_PUBLISHED . ' = 1');
$references->addConditionParam('o_id != ' . $reference->getId());
$references->setLimit(3);
$teasers = [];
foreach ($references as $item) {
$teasers[] = [
'title' => $item->getTitle(),
'image' => $item->getMainImage(),
'href' => $linkGenerator->generate($item)
];
}
$teasers[] = [
'title' => $this->translator->trans('reference-detail.references overview'),
'textOnly' => true,
'href' => $this->siteConfig->getReferenceOverview()
];
$returnArray = [
'reference' => $reference,
'heroKeyValues' => $keyValues,
'referenceTeasers' => $teasers,
];
return $this->render('references/detail.html.twig', $returnArray);
}
}