vendor/ibexa/admin-ui/src/lib/EventListener/ContentProxyCreateDraftListener.php line 97

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\AdminUi\EventListener;
  8. use Ibexa\Contracts\AdminUi\Autosave\AutosaveServiceInterface;
  9. use Ibexa\Contracts\AdminUi\Event\ContentProxyCreateEvent;
  10. use Ibexa\Contracts\AdminUi\Event\ContentProxyTranslateEvent;
  11. use Ibexa\Contracts\Core\Repository\ContentService;
  12. use Ibexa\Contracts\Core\Repository\LocationService;
  13. use Ibexa\Contracts\Core\Repository\Values\Content\Content;
  14. use Ibexa\Contracts\Core\Repository\Values\Content\Field;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\RedirectResponse;
  17. use Symfony\Component\Routing\RouterInterface;
  18. class ContentProxyCreateDraftListener implements EventSubscriberInterface
  19. {
  20.     private ContentService $contentService;
  21.     private LocationService $locationService;
  22.     private AutosaveServiceInterface $autosaveService;
  23.     private RouterInterface $router;
  24.     public function __construct(
  25.         ContentService $contentService,
  26.         LocationService $locationService,
  27.         AutosaveServiceInterface $autosaveService,
  28.         RouterInterface $router
  29.     ) {
  30.         $this->contentService $contentService;
  31.         $this->locationService $locationService;
  32.         $this->autosaveService $autosaveService;
  33.         $this->router $router;
  34.     }
  35.     public static function getSubscribedEvents(): array
  36.     {
  37.         return [
  38.             ContentProxyCreateEvent::class => 'create',
  39.             ContentProxyTranslateEvent::class => 'translate',
  40.         ];
  41.     }
  42.     public function create(ContentProxyCreateEvent $event): void
  43.     {
  44.         if (!$this->autosaveService->isEnabled()) {
  45.             return;
  46.         }
  47.         $options $event->getOptions();
  48.         $createContentStruct $this->contentService->newContentCreateStruct(
  49.             $event->getContentType(),
  50.             $event->getLanguageCode()
  51.         );
  52.         $contentDraft $this->contentService->createContent(
  53.             $createContentStruct,
  54.             [
  55.                 $this->locationService->newLocationCreateStruct($event->getParentLocationId()),
  56.             ],
  57.             []
  58.         );
  59.         $options->set(ContentProxyCreateEvent::OPTION_CONTENT_DRAFT$contentDraft);
  60.         if ($options->get(ContentProxyCreateEvent::OPTION_IS_ON_THE_FLYfalse)) {
  61.             $response = new RedirectResponse(
  62.                 $this->router->generate('ibexa.content.on_the_fly.edit', [
  63.                     'contentId' => $contentDraft->id,
  64.                     'versionNo' => $contentDraft->getVersionInfo()->versionNo,
  65.                     'languageCode' => $event->getLanguageCode(),
  66.                     'locationId' => $contentDraft->contentInfo->mainLocationId,
  67.                 ])
  68.             );
  69.         } else {
  70.             $response = new RedirectResponse(
  71.                 $this->router->generate('ibexa.content.draft.edit', [
  72.                     'contentId' => $contentDraft->id,
  73.                     'versionNo' => $contentDraft->getVersionInfo()->versionNo,
  74.                     'language' => $event->getLanguageCode(),
  75.                 ])
  76.             );
  77.         }
  78.         $event->setResponse($response);
  79.     }
  80.     public function translate(ContentProxyTranslateEvent $event): void
  81.     {
  82.         if (!$this->autosaveService->isEnabled()) {
  83.             return;
  84.         }
  85.         $fromLanguageCode $event->getFromLanguageCode();
  86.         $content $this->contentService->loadContent(
  87.             $event->getContentId(),
  88.             $fromLanguageCode !== null
  89.                 ? [$fromLanguageCode]
  90.                 : null
  91.         );
  92.         $toLanguageCode $event->getToLanguageCode();
  93.         $contentUpdateStruct $this->contentService->newContentUpdateStruct();
  94.         $contentUpdateStruct->initialLanguageCode $toLanguageCode;
  95.         if ($fromLanguageCode !== null) {
  96.             $contentUpdateStruct->fields $this->getTranslatedContentFields($content$toLanguageCode);
  97.         }
  98.         $contentDraft $this->contentService->createContentDraft($content->contentInfo);
  99.         $this->contentService->updateContent(
  100.             $contentDraft->getVersionInfo(),
  101.             $contentUpdateStruct,
  102.             []
  103.         );
  104.         $response = new RedirectResponse(
  105.             $this->router->generate('ibexa.content.draft.edit', [
  106.                 'contentId' => $contentDraft->id,
  107.                 'versionNo' => $contentDraft->getVersionInfo()->versionNo,
  108.                 'language' => $toLanguageCode,
  109.                 'locationId' => $event->getLocationId(),
  110.             ])
  111.         );
  112.         $event->setResponse($response);
  113.     }
  114.     private function getTranslatedContentFields(Content $contentstring $languageCode): array
  115.     {
  116.         $contentType $content->getContentType();
  117.         $translatableFields array_filter($content->getFields(), static function (Field $field) use ($contentType): bool {
  118.             return $contentType->getFieldDefinition($field->fieldDefIdentifier)->isTranslatable;
  119.         });
  120.         return array_map(static function (Field $field) use ($languageCode): Field {
  121.             return new Field([
  122.                 'value' => $field->value,
  123.                 'fieldDefIdentifier' => $field->fieldDefIdentifier,
  124.                 'fieldTypeIdentifier' => $field->fieldTypeIdentifier,
  125.                 'languageCode' => $languageCode,
  126.             ]);
  127.         }, $translatableFields);
  128.     }
  129. }
  130. class_alias(ContentProxyCreateDraftListener::class, 'EzSystems\EzPlatformAdminUi\EventListener\ContentProxyCreateDraftListener');