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

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\AdminUi\UserSetting\Autosave as AutosaveSetting;
  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 Ibexa\User\UserSetting\UserSettingService;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\Routing\RouterInterface;
  19. class ContentProxyCreateDraftListener implements EventSubscriberInterface
  20. {
  21.     /** @var \Ibexa\Contracts\Core\Repository\ContentService */
  22.     private $contentService;
  23.     /** @var \Ibexa\Contracts\Core\Repository\LocationService */
  24.     private $locationService;
  25.     /** @var \Ibexa\User\UserSetting\UserSettingService */
  26.     private $userSettingService;
  27.     /** @var \Symfony\Component\Routing\RouterInterface */
  28.     private $router;
  29.     public function __construct(
  30.         ContentService $contentService,
  31.         LocationService $locationService,
  32.         UserSettingService $userSettingService,
  33.         RouterInterface $router
  34.     ) {
  35.         $this->contentService $contentService;
  36.         $this->locationService $locationService;
  37.         $this->userSettingService $userSettingService;
  38.         $this->router $router;
  39.     }
  40.     public static function getSubscribedEvents(): array
  41.     {
  42.         return [
  43.             ContentProxyCreateEvent::class => 'create',
  44.             ContentProxyTranslateEvent::class => 'translate',
  45.         ];
  46.     }
  47.     public function create(ContentProxyCreateEvent $event): void
  48.     {
  49.         $isAutosaveEnabled $this->userSettingService->getUserSetting('autosave')->value === AutosaveSetting::ENABLED_OPTION;
  50.         if (!$isAutosaveEnabled) {
  51.             return;
  52.         }
  53.         $options $event->getOptions();
  54.         $createContentStruct $this->contentService->newContentCreateStruct(
  55.             $event->getContentType(),
  56.             $event->getLanguageCode()
  57.         );
  58.         $contentDraft $this->contentService->createContent(
  59.             $createContentStruct,
  60.             [
  61.                 $this->locationService->newLocationCreateStruct($event->getParentLocationId()),
  62.             ],
  63.             []
  64.         );
  65.         $options->set(ContentProxyCreateEvent::OPTION_CONTENT_DRAFT$contentDraft);
  66.         if ($options->get(ContentProxyCreateEvent::OPTION_IS_ON_THE_FLYfalse)) {
  67.             $response = new RedirectResponse(
  68.                 $this->router->generate('ibexa.content.on_the_fly.edit', [
  69.                     'contentId' => $contentDraft->id,
  70.                     'versionNo' => $contentDraft->getVersionInfo()->versionNo,
  71.                     'languageCode' => $event->getLanguageCode(),
  72.                     'locationId' => $contentDraft->contentInfo->mainLocationId,
  73.                 ])
  74.             );
  75.         } else {
  76.             $response = new RedirectResponse(
  77.                 $this->router->generate('ibexa.content.draft.edit', [
  78.                     'contentId' => $contentDraft->id,
  79.                     'versionNo' => $contentDraft->getVersionInfo()->versionNo,
  80.                     'language' => $event->getLanguageCode(),
  81.                 ])
  82.             );
  83.         }
  84.         $event->setResponse($response);
  85.     }
  86.     public function translate(ContentProxyTranslateEvent $event): void
  87.     {
  88.         $isAutosaveEnabled $this->userSettingService->getUserSetting('autosave')->value === AutosaveSetting::ENABLED_OPTION;
  89.         if (!$isAutosaveEnabled) {
  90.             return;
  91.         }
  92.         $fromLanguageCode $event->getFromLanguageCode();
  93.         $content $this->contentService->loadContent(
  94.             $event->getContentId(),
  95.             $fromLanguageCode !== null
  96.                 ? [$fromLanguageCode]
  97.                 : null
  98.         );
  99.         $toLanguageCode $event->getToLanguageCode();
  100.         $contentUpdateStruct $this->contentService->newContentUpdateStruct();
  101.         $contentUpdateStruct->initialLanguageCode $toLanguageCode;
  102.         if ($fromLanguageCode !== null) {
  103.             $contentUpdateStruct->fields $this->getTranslatedContentFields($content$toLanguageCode);
  104.         }
  105.         $contentDraft $this->contentService->createContentDraft($content->contentInfo);
  106.         $this->contentService->updateContent(
  107.             $contentDraft->getVersionInfo(),
  108.             $contentUpdateStruct,
  109.             []
  110.         );
  111.         $response = new RedirectResponse(
  112.             $this->router->generate('ibexa.content.draft.edit', [
  113.                 'contentId' => $contentDraft->id,
  114.                 'versionNo' => $contentDraft->getVersionInfo()->versionNo,
  115.                 'language' => $toLanguageCode,
  116.                 'locationId' => $event->getLocationId(),
  117.             ])
  118.         );
  119.         $event->setResponse($response);
  120.     }
  121.     private function getTranslatedContentFields(Content $contentstring $languageCode): array
  122.     {
  123.         $contentType $content->getContentType();
  124.         $translatableFields array_filter($content->getFields(), static function (Field $field) use ($contentType): bool {
  125.             return $contentType->getFieldDefinition($field->fieldDefIdentifier)->isTranslatable;
  126.         });
  127.         return array_map(static function (Field $field) use ($languageCode): Field {
  128.             return new Field([
  129.                 'value' => $field->value,
  130.                 'fieldDefIdentifier' => $field->fieldDefIdentifier,
  131.                 'fieldTypeIdentifier' => $field->fieldTypeIdentifier,
  132.                 'languageCode' => $languageCode,
  133.             ]);
  134.         }, $translatableFields);
  135.     }
  136. }
  137. class_alias(ContentProxyCreateDraftListener::class, 'EzSystems\EzPlatformAdminUi\EventListener\ContentProxyCreateDraftListener');