<?php
declare(strict_types=1);
namespace App\Controller;
use App\Entity\Product\ProductInterface;
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
use Sylius\Component\Core\Model\TaxonInterface;
use Sylius\Component\Resource\Model\ResourceInterface;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment;
use function preg_replace;
class ProductController extends ResourceController
{
public function showAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::SHOW);
$resource = $this->findOr404($configuration);
$event = $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource);
$eventResponse = $event->getResponse();
if ($eventResponse !== null) {
return $eventResponse;
}
if ($configuration->isHtmlRequest()) {
/** @phpstan-ignore-next-line */
return $this->render($this->lookForSpecificTemplate($configuration, $resource), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $resource,
$this->metadata->getName() => $resource,
]);
}
return $this->createRestView($configuration, $resource);
}
/** @param ProductInterface $product */
private function lookForSpecificTemplate(RequestConfiguration $configuration, ResourceInterface $product): string
{
/** @var string $template */
$template = $configuration->getTemplate(ResourceActions::SHOW . '.html');
if (! $product->getMainTaxon() instanceof TaxonInterface) {
return $template;
}
$code = $product->getMainTaxon()->getCode();
/** @var string $specificTemplate */
$specificTemplate = preg_replace('/(.*\/)([^\/]*)(\.html\.twig)/', '${1}' . $code . '${3}', $template);
/** @var Environment $twig */
$twig = $this->get('twig');
return $twig->getLoader()->exists($specificTemplate) ? $specificTemplate : $template;
}
}