Skip to content

Commit b08b4e5

Browse files
committed
Merge branch '4.6'
# Conflicts: # phpstan-baseline.neon # src/bundle/Controller/ContentController.php # src/lib/Form/Type/Preview/SiteAccessChoiceType.php
2 parents 46ab1d0 + 3a9b8d8 commit b08b4e5

17 files changed

+577
-32
lines changed

phpstan-baseline.neon

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,6 @@ parameters:
9696
count: 1
9797
path: src/bundle/Controller/ContentController.php
9898

99-
-
100-
message: '#^Parameter \#1 \$location of method Ibexa\\AdminUi\\Siteaccess\\SiteaccessResolverInterface\:\:getSiteAccessesListForLocation\(\) expects Ibexa\\Contracts\\Core\\Repository\\Values\\Content\\Location, Ibexa\\Contracts\\Core\\Repository\\Values\\Content\\Location\|false given\.$#'
101-
identifier: argument.type
102-
count: 1
103-
path: src/bundle/Controller/ContentController.php
104-
10599
-
106100
message: '#^Parameter \#1 \$locationId of method Ibexa\\Contracts\\Core\\Repository\\LocationService\:\:loadLocation\(\) expects int, int\|null given\.$#'
107101
identifier: argument.type

src/bundle/Controller/ContentController.php

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use Ibexa\AdminUi\Form\Factory\FormFactory;
2020
use Ibexa\AdminUi\Form\SubmitHandler;
2121
use Ibexa\AdminUi\Form\Type\Content\Translation\MainTranslationUpdateType;
22-
use Ibexa\AdminUi\Form\Type\Preview\SiteAccessChoiceType;
22+
use Ibexa\AdminUi\Form\Type\Preview\VersionPreviewUrlChoiceType;
2323
use Ibexa\AdminUi\Permission\LookupLimitationsTransformer;
2424
use Ibexa\AdminUi\Siteaccess\SiteAccessNameGeneratorInterface;
2525
use Ibexa\AdminUi\Siteaccess\SiteaccessResolverInterface;
@@ -29,9 +29,11 @@
2929
use Ibexa\Contracts\AdminUi\Event\ContentEditEvent;
3030
use Ibexa\Contracts\AdminUi\Event\ContentProxyCreateEvent;
3131
use Ibexa\Contracts\AdminUi\Notification\TranslatableNotificationHandlerInterface;
32+
use Ibexa\Contracts\AdminUi\PreviewUrlResolver\VersionPreviewUrlResolverInterface;
3233
use Ibexa\Contracts\Core\Limitation\Target;
3334
use Ibexa\Contracts\Core\Repository\ContentService;
3435
use Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException;
36+
use Ibexa\Contracts\Core\Repository\LanguageService;
3537
use Ibexa\Contracts\Core\Repository\LocationService;
3638
use Ibexa\Contracts\Core\Repository\PermissionResolver;
3739
use Ibexa\Contracts\Core\Repository\UserService;
@@ -42,6 +44,7 @@
4244
use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface;
4345
use Ibexa\Core\Base\Exceptions\BadStateException;
4446
use Ibexa\Core\Helper\TranslationHelper;
47+
use Ibexa\Core\MVC\Symfony\SiteAccess\SiteAccessServiceInterface;
4548
use JMS\TranslationBundle\Annotation\Desc;
4649
use Symfony\Component\Form\FormFactoryInterface;
4750
use Symfony\Component\HttpFoundation\JsonResponse;
@@ -67,7 +70,10 @@ public function __construct(
6770
private readonly ConfigResolverInterface $configResolver,
6871
private readonly SiteAccessNameGeneratorInterface $siteAccessNameGenerator,
6972
private readonly EventDispatcherInterface $eventDispatcher,
70-
private readonly FormFactoryInterface $baseFormFactory
73+
private readonly FormFactoryInterface $baseFormFactory,
74+
private readonly VersionPreviewUrlResolverInterface $previewUrlResolver,
75+
private readonly LanguageService $languageService,
76+
private readonly SiteAccessServiceInterface $siteAccessService
7177
) {
7278
}
7379

@@ -309,14 +315,13 @@ public function previewAction(
309315
$versionNo = null;
310316
}
311317

312-
if (null === $location) {
318+
if (!$location instanceof Location) {
313319
$location = $this->locationService->loadLocation(
314320
$content->getContentInfo()->getMainLocationId()
315321
);
316322
}
317323

318324
$siteAccesses = $this->siteaccessResolver->getSiteAccessesListForLocation($location, $versionNo, $languageCode);
319-
320325
if (empty($siteAccesses)) {
321326
throw new BadStateException(
322327
'siteaccess',
@@ -329,30 +334,28 @@ public function previewAction(
329334
$siteAccessesList[$siteAccess->name] = $this->siteAccessNameGenerator->generate($siteAccess);
330335
}
331336

332-
$preselectedSiteAccess = $request->query->get('preselectedSiteAccess', reset($siteAccessesList));
333-
334-
if (!array_key_exists($preselectedSiteAccess, $siteAccessesList)) {
335-
$preselectedSiteAccess = reset($siteAccessesList);
337+
$preselectedSiteAccessName = $request->query->get('preselectedSiteAccessName', reset($siteAccessesList));
338+
if (!array_key_exists($preselectedSiteAccessName, $siteAccessesList)) {
339+
$preselectedSiteAccessName = reset($siteAccessesList);
336340
}
337341

338-
$urlValue = $this->generateUrl(
339-
'ibexa.version.preview',
340-
[
341-
'contentId' => $content->getId(),
342-
'versionNo' => $versionNo ?? $content->getVersionInfo()->getVersionNo(),
343-
'language' => $languageCode,
344-
'siteAccessName' => $preselectedSiteAccess,
345-
]
342+
$versionInfo = $this->contentService->loadVersionInfo($content->getContentInfo(), $versionNo);
343+
$language = $this->languageService->loadLanguage($languageCode);
344+
345+
$previewUrl = $this->previewUrlResolver->resolveUrl(
346+
$versionInfo,
347+
$location,
348+
$language,
349+
$this->siteAccessService->get($preselectedSiteAccessName)
346350
);
347351

348352
$siteAccessSelector = $this->baseFormFactory->create(
349-
SiteAccessChoiceType::class,
350-
$urlValue,
353+
VersionPreviewUrlChoiceType::class,
354+
$previewUrl,
351355
[
352356
'location' => $location,
353-
'content' => $content,
354-
'versionNo' => $versionNo ?? $content->getVersionInfo()->getVersionNo(),
355-
'languageCode' => $languageCode,
357+
'version_info' => $versionInfo,
358+
'language' => $language,
356359
]
357360
);
358361

@@ -363,8 +366,9 @@ public function previewAction(
363366
'siteaccesses' => $siteAccessesList,
364367
'site_access_form' => $siteAccessSelector,
365368
'version_no' => $versionNo ?? $content->getVersionInfo()->getVersionNo(),
366-
'preselected_site_access' => $preselectedSiteAccess,
369+
'preselected_site_access' => $preselectedSiteAccessName,
367370
'referrer' => $referrer ?? 'content_draft_edit',
371+
'preview_url' => $previewUrl,
368372
]);
369373
}
370374

src/bundle/Resources/config/services.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ imports:
2525
- { resource: services/user_settings.yaml }
2626
- { resource: services/rest.yaml }
2727
- { resource: services/permissions.yaml }
28+
- { resource: services/preview.yaml }
2829
- { resource: services/forms.yaml }
2930
- { resource: services/strategies.yaml }
3031
- { resource: services/query_types.yaml }

src/bundle/Resources/config/services/forms.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,4 +419,9 @@ services:
419419
$siteAccessResolver: '@Ibexa\AdminUi\Siteaccess\NonAdminSiteaccessResolver'
420420
$siteAccessNameGenerator: '@Ibexa\AdminUi\Siteaccess\SiteAccessNameGenerator'
421421

422+
Ibexa\AdminUi\Form\Type\Preview\VersionPreviewUrlChoiceType:
423+
arguments:
424+
$siteAccessResolver: '@Ibexa\AdminUi\Siteaccess\NonAdminSiteaccessResolver'
425+
$siteAccessNameGenerator: '@Ibexa\AdminUi\Siteaccess\SiteAccessNameGenerator'
426+
422427
Ibexa\AdminUi\Form\Type\LanguageSwitchType: ~
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
public: false
6+
7+
Ibexa\Contracts\AdminUi\PreviewUrlResolver\VersionPreviewUrlResolverInterface:
8+
alias: Ibexa\AdminUi\PreviewUrlResolver\VersionPreviewUrlResolver
9+
10+
Ibexa\AdminUi\PreviewUrlResolver\VersionPreviewUrlResolver: ~

src/bundle/Resources/views/themes/admin/content/content_preview.html.twig

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@
6565
{% block content %}
6666
<div class="ibexa-preview">
6767
<div class="ibexa-preview__iframe ibexa-preview__iframe--desktop">
68-
<iframe src="{{ url('ibexa.version.preview', {
69-
'contentId': content.id, 'versionNo': version_no, 'language': language_code, 'siteAccessName': preselected_site_access
70-
}) }}" frameborder="0"></iframe>
68+
<iframe src="{{ preview_url }}" frameborder="0"></iframe>
7169
</div>
7270
</div>
7371
{% endblock %}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Contracts\AdminUi\Event;
10+
11+
use Ibexa\Contracts\Core\Repository\Values\Content\Language;
12+
use Ibexa\Contracts\Core\Repository\Values\Content\Location;
13+
use Ibexa\Contracts\Core\Repository\Values\Content\VersionInfo;
14+
use Ibexa\Core\MVC\Symfony\SiteAccess;
15+
use Symfony\Contracts\EventDispatcher\Event;
16+
17+
final class ResolveVersionPreviewUrlEvent extends Event
18+
{
19+
private ?string $previewUrl = null;
20+
21+
public function __construct(
22+
private readonly VersionInfo $versionInfo,
23+
private readonly Language $language,
24+
private readonly Location $location,
25+
private readonly SiteAccess $siteAccess
26+
) {
27+
}
28+
29+
public function getVersionInfo(): VersionInfo
30+
{
31+
return $this->versionInfo;
32+
}
33+
34+
public function getLanguage(): Language
35+
{
36+
return $this->language;
37+
}
38+
39+
public function getLocation(): Location
40+
{
41+
return $this->location;
42+
}
43+
44+
public function getSiteAccess(): SiteAccess
45+
{
46+
return $this->siteAccess;
47+
}
48+
49+
public function getPreviewUrl(): ?string
50+
{
51+
return $this->previewUrl;
52+
}
53+
54+
public function setPreviewUrl(?string $previewUrl): void
55+
{
56+
$this->previewUrl = $previewUrl;
57+
}
58+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Contracts\AdminUi\Exception;
10+
11+
use Ibexa\Contracts\Core\Repository\Exceptions\Exception as RepositoryException;
12+
use RuntimeException;
13+
14+
final class UnresolvedPreviewUrlException extends RuntimeException implements RepositoryException
15+
{
16+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\Contracts\AdminUi\PreviewUrlResolver;
10+
11+
use Ibexa\Contracts\Core\Repository\Values\Content\Language;
12+
use Ibexa\Contracts\Core\Repository\Values\Content\Location;
13+
use Ibexa\Contracts\Core\Repository\Values\Content\VersionInfo;
14+
use Ibexa\Core\MVC\Symfony\SiteAccess;
15+
16+
interface VersionPreviewUrlResolverInterface
17+
{
18+
public function resolveUrl(
19+
VersionInfo $versionInfo,
20+
Location $location,
21+
Language $language,
22+
SiteAccess $siteAccess
23+
): string;
24+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
/**
4+
* @copyright Copyright (C) Ibexa AS. All rights reserved.
5+
* @license For full copyright and license information view LICENSE file distributed with this source code.
6+
*/
7+
declare(strict_types=1);
8+
9+
namespace Ibexa\AdminUi\EventListener;
10+
11+
use Ibexa\Contracts\AdminUi\Event\ResolveVersionPreviewUrlEvent;
12+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
13+
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
14+
15+
final class SystemVersionPreviewUrlSubscriber implements EventSubscriberInterface
16+
{
17+
public function __construct(private UrlGeneratorInterface $urlGenerator)
18+
{
19+
}
20+
21+
public static function getSubscribedEvents(): array
22+
{
23+
return [
24+
ResolveVersionPreviewUrlEvent::class => ['onResolveVersionPreviewUrl', -100],
25+
];
26+
}
27+
28+
public function onResolveVersionPreviewUrl(ResolveVersionPreviewUrlEvent $event): void
29+
{
30+
if ($event->getPreviewUrl() !== null) {
31+
// Do not override already set preview URL
32+
return;
33+
}
34+
35+
$previewUrl = $this->urlGenerator->generate(
36+
'ibexa.version.preview',
37+
[
38+
'contentId' => $event->getVersionInfo()->getContentInfo()->getId(),
39+
'versionNo' => $event->getVersionInfo()->getVersionNo(),
40+
'language' => $event->getLanguage()->getLanguageCode(),
41+
'siteAccessName' => $event->getSiteAccess()->name,
42+
],
43+
);
44+
45+
$event->setPreviewUrl($previewUrl);
46+
}
47+
}

0 commit comments

Comments
 (0)