vendor/sulu/article-bundle/Resolver/ArticleContentResolver.php line 110

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Sulu.
  4.  *
  5.  * (c) Sulu GmbH
  6.  *
  7.  * This source file is subject to the MIT license that is bundled
  8.  * with this source code in the file LICENSE.
  9.  */
  10. namespace Sulu\Bundle\ArticleBundle\Resolver;
  11. use JMS\Serializer\SerializationContext;
  12. use Sulu\Bundle\ArticleBundle\Document\ArticleDocument;
  13. use Sulu\Bundle\ArticleBundle\Document\ArticleInterface;
  14. use Sulu\Bundle\ArticleBundle\Document\ArticlePageDocument;
  15. use Sulu\Bundle\ArticleBundle\Document\Structure\ContentProxyFactory;
  16. use Sulu\Component\Content\Compat\Structure\StructureBridge;
  17. use Sulu\Component\Content\Compat\StructureManagerInterface;
  18. use Sulu\Component\Content\Document\Extension\ExtensionContainer;
  19. use Sulu\Component\Content\Extension\ExtensionManagerInterface;
  20. use Sulu\Component\Serializer\ArraySerializerInterface;
  21. class ArticleContentResolver implements ArticleContentResolverInterface
  22. {
  23.     /**
  24.      * @var ArraySerializerInterface
  25.      */
  26.     private $serializer;
  27.     /**
  28.      * @var StructureManagerInterface
  29.      */
  30.     private $structureManager;
  31.     /**
  32.      * @var ExtensionManagerInterface
  33.      */
  34.     private $extensionManager;
  35.     /**
  36.      * @var ContentProxyFactory
  37.      */
  38.     private $contentProxyFactory;
  39.     public function __construct(
  40.         ArraySerializerInterface $serializer,
  41.         StructureManagerInterface $structureManager,
  42.         ExtensionManagerInterface $extensionManager,
  43.         ContentProxyFactory $contentProxyFactory
  44.     ) {
  45.         $this->serializer $serializer;
  46.         $this->structureManager $structureManager;
  47.         $this->extensionManager $extensionManager;
  48.         $this->contentProxyFactory $contentProxyFactory;
  49.     }
  50.     public function resolve(ArticleInterface $articleint $pageNumber 1)
  51.     {
  52.         $data $this->serializer->serialize(
  53.             $article,
  54.             SerializationContext::create()
  55.                 ->setSerializeNull(true)
  56.                 ->setGroups(['website''content'])
  57.                 ->setAttribute('pageNumber'$pageNumber)
  58.                 ->setAttribute('urls'true)
  59.         );
  60.         if ($article instanceof ArticlePageDocument) {
  61.             $article $article->getParent();
  62.         }
  63.         $data['page'] = $pageNumber;
  64.         $data['pages'] = $article->getPages();
  65.         $article $this->getArticleForPage($article$pageNumber);
  66.         $data['id'] = $article->getArticleUuid();
  67.         $data['uuid'] = $article->getArticleUuid();
  68.         $data['pageUuid'] = $article->getPageUuid();
  69.         $data = \array_merge($data$this->resolveContent($article));
  70.         return $data;
  71.     }
  72.     /**
  73.      * Returns article page by page-number.
  74.      */
  75.     private function getArticleForPage(ArticleDocument $articleint $pageNumber): ArticleDocument
  76.     {
  77.         $children $article->getChildren();
  78.         if (null === $children || === $pageNumber) {
  79.             return $article;
  80.         }
  81.         foreach ($children as $child) {
  82.             if ($child instanceof ArticlePageDocument && $child->getPageNumber() === $pageNumber) {
  83.                 return $child;
  84.             }
  85.         }
  86.         return $article;
  87.     }
  88.     /**
  89.      * Returns content and view of article.
  90.      */
  91.     private function resolveContent(ArticleDocument $article): array
  92.     {
  93.         /** @var StructureBridge $structure */
  94.         $structure $this->structureManager->getStructure($article->getStructureType(), 'article');
  95.         $structure->setDocument($article);
  96.         $data $article->getStructure()->toArray();
  97.         $extension = [];
  98.         $extensionData $article->getExtensionsData();
  99.         if ($extensionData instanceof ExtensionContainer) {
  100.             $extensionData $extensionData->toArray();
  101.         }
  102.         foreach ($extensionData as $name => $value) {
  103.             $extension[$name] = $this->extensionManager->getExtension('article'$name)->getContentData($value);
  104.         }
  105.         $content $this->contentProxyFactory->createContentProxy($structure$data);
  106.         $view $this->contentProxyFactory->createViewProxy($structure$data);
  107.         return [
  108.             'content' => $content,
  109.             'view' => $view,
  110.             'extension' => $extension,
  111.         ];
  112.     }
  113. }