vendor/pimcore/pimcore/lib/Twig/Extension/Templating/PimcoreUrl.php line 65

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Twig\Extension\Templating;
  15. use Pimcore\Bundle\EcommerceFrameworkBundle\Model\LinkGeneratorAwareInterface;
  16. use Pimcore\Http\RequestHelper;
  17. use Pimcore\Model\DataObject\Concrete;
  18. use Pimcore\Twig\Extension\Templating\Traits\HelperCharsetTrait;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Twig\Extension\RuntimeExtensionInterface;
  21. class PimcoreUrl implements RuntimeExtensionInterface
  22. {
  23.     use HelperCharsetTrait;
  24.     /**
  25.      * @var UrlGeneratorInterface
  26.      */
  27.     protected $generator;
  28.     /**
  29.      * @var RequestHelper
  30.      */
  31.     protected $requestHelper;
  32.     /**
  33.      * @param UrlGeneratorInterface $generator
  34.      * @param RequestHelper $requestHelper
  35.      */
  36.     public function __construct(UrlGeneratorInterface $generatorRequestHelper $requestHelper)
  37.     {
  38.         $this->generator $generator;
  39.         $this->requestHelper $requestHelper;
  40.     }
  41.     /**
  42.      * @param array $urlOptions
  43.      * @param string|null $name
  44.      * @param bool $reset
  45.      * @param bool $encode
  46.      * @param bool $relative
  47.      *
  48.      * @return string
  49.      */
  50.     public function __invoke(array $urlOptions = [], $name null$reset false$encode true$relative false)
  51.     {
  52.         // merge all parameters from request to parameters
  53.         if (!$reset && $this->requestHelper->hasMainRequest()) {
  54.             $urlOptions array_replace($this->requestHelper->getMainRequest()->query->all(), $urlOptions);
  55.         }
  56.         return $this->generateUrl($name$urlOptions$relative UrlGeneratorInterface::RELATIVE_PATH UrlGeneratorInterface::ABSOLUTE_PATH$encode);
  57.     }
  58.     /**
  59.      * Generate URL with support to only pass parameters ZF1 style (defaults to current route).
  60.      *
  61.      * @param string|array|null $name
  62.      * @param array|null $parameters
  63.      * @param int $referenceType
  64.      * @param bool $encode
  65.      *
  66.      * @return string
  67.      */
  68.     protected function generateUrl($name null$parameters = [], $referenceType UrlGeneratorInterface::ABSOLUTE_PATH$encode true)
  69.     {
  70.         if ($encode !== true) {
  71.             // encoding is default anyway, so we only set it when really necessary, to minimize the risk of
  72.             // side-effects when using parameters for that purpose (other routers may not be aware of param `encode`
  73.             $parameters['encode'] = $encode;
  74.         }
  75.         // if name is an array, treat it as parameters
  76.         if (is_array($name)) {
  77.             if (is_array($parameters)) {
  78.                 $parameters array_merge($name$parameters);
  79.             } else {
  80.                 $parameters $name;
  81.             }
  82.             $name null;
  83.         }
  84.         // get name from current route
  85.         if (null === $name) {
  86.             $name $this->getCurrentRoute();
  87.         }
  88.         $object $parameters['object'] ?? null;
  89.         $linkGenerator null;
  90.         if ($object instanceof LinkGeneratorAwareInterface) { //e.g. Mockup
  91.             $linkGenerator $object->getLinkGenerator();
  92.         } elseif ($object instanceof Concrete) {
  93.             $linkGenerator $object->getClass()->getLinkGenerator();
  94.         }
  95.         if ($linkGenerator) {
  96.             if (array_key_exists('object'$parameters)) {
  97.                 unset($parameters['object']);
  98.             }
  99.             $path $linkGenerator->generate($object, [
  100.                 'route' => $name,
  101.                 'parameters' => $parameters,
  102.                 'context' => $this,
  103.                 'referenceType' => $referenceType,
  104.             ]);
  105.             return $path;
  106.         }
  107.         if ($name !== null) {
  108.             return $this->generator->generate($name$parameters$referenceType);
  109.         }
  110.         return '';
  111.     }
  112.     /**
  113.      * Tries to get the current route name from current or main request
  114.      *
  115.      * @return string|null
  116.      */
  117.     protected function getCurrentRoute()
  118.     {
  119.         $route null;
  120.         if ($this->requestHelper->hasCurrentRequest()) {
  121.             $route $this->requestHelper->getCurrentRequest()->attributes->get('_route');
  122.         }
  123.         if (!$route && $this->requestHelper->hasMainRequest()) {
  124.             $route $this->requestHelper->getMainRequest()->attributes->get('_route');
  125.         }
  126.         return $route;
  127.     }
  128. }