-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathPreviewUrlService.php
More file actions
106 lines (87 loc) · 3.29 KB
/
PreviewUrlService.php
File metadata and controls
106 lines (87 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
declare(strict_types=1);
/**
* Pimcore
*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioBackendBundle\DataObject\Service;
use Exception;
use Pimcore\Bundle\StaticResolverBundle\Models\Element\ServiceResolverInterface;
use Pimcore\Bundle\StudioBackendBundle\DataObject\MappedParameter\PreviewParameter;
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException;
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\NotFoundException;
use Pimcore\Bundle\StudioBackendBundle\Util\Trait\RequestTrait;
use Pimcore\Model\DataObject\ClassDefinition\PreviewGeneratorInterface;
use Pimcore\Model\DataObject\Concrete;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* @interal
*/
final readonly class PreviewUrlService implements PreviewUrlServiceInterface
{
use RequestTrait;
public function __construct(
private RequestStack $requestStack,
private PreviewGeneratorInterface $defaultPreviewGenerator,
private ServiceResolverInterface $serviceResolver
) {
}
/**
* @throws Exception|NotFoundException
*/
public function getPreviewUrl(PreviewParameter $previewParameter): string
{
$session = $this->getCurrentSession($this->requestStack);
$dataObject = $this->serviceResolver->getElementFromSession(
'object',
$previewParameter->getId(),
$session->getId()
);
if (!$dataObject instanceof Concrete) {
throw new NotFoundException('Data Object', $previewParameter->getId());
}
$url = $this->getPreviewGenerator($dataObject)?->generatePreviewUrl(
$dataObject,
['preview' => true, 'context' => $this]
);
if (!$url) {
throw new InvalidArgumentException('Could not generate preview url');
}
return $this->buildRedirectUrl($url, $previewParameter);
}
/**
* @throws Exception
*/
private function getPreviewGenerator(Concrete $dataObject): ?PreviewGeneratorInterface
{
$previewService = $dataObject->getClass()->getPreviewGenerator();
if (!$previewService && $dataObject->getClass()->getLinkGenerator()) {
$previewService = $this->defaultPreviewGenerator;
}
return $previewService;
}
private function buildRedirectUrl(string $url, PreviewParameter $previewParameter): string
{
// replace all remaining % signs
$url = str_replace('%', '%25', $url);
$urlParts = parse_url($url);
$redirectParameters = array_filter([
'pimcore_object_preview' => $previewParameter->getId(),
'site' => $previewParameter->getSite(),
'dc' => time(),
]);
$previewUrl = $urlParts['path'] . '?' . http_build_query($redirectParameters);
if (isset($urlParts['query'])) {
$previewUrl .= '&' . $urlParts['query'];
}
return $previewUrl;
}
}