src/Controller/Website/CaseStudiesController.php line 99

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Website;
  3. use App\Twig\Components\Common\imageTrait;
  4. use FOS\RestBundle\Controller\Annotations as Rest;
  5. use FOS\RestBundle\View\ViewHandlerInterface;
  6. use Sulu\Bundle\MediaBundle\Api\Media;
  7. use Sulu\Bundle\WebsiteBundle\Twig\Content\ContentTwigExtensionInterface;
  8. use Sulu\Component\Content\SmartContent\QueryBuilder;
  9. use Sulu\Component\DocumentManager\DocumentManagerInterface;
  10. use Sulu\Component\Rest\AbstractRestController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  13. /**
  14.  * Class of case studies.
  15.  *
  16.  * @author Michał Wiązek <michal.wiazek@makolab.com>
  17.  *
  18.  * @Rest\Route("/api/case_studies", name="app.case_studies.", defaults={ "_format" = "json" })
  19.  */
  20. class CaseStudiesController extends AbstractRestController
  21. {
  22.     use imageTrait;
  23.     private DocumentManagerInterface $documentManager;
  24.     private ContentTwigExtensionInterface $contentTwigExtension;
  25.     private QueryBuilder $builder;
  26.     /**
  27.      * Constructor.
  28.      */
  29.     public function __construct(
  30.         DocumentManagerInterface $documentManager,
  31.         ContentTwigExtensionInterface $contentTwigExtension,
  32.         QueryBuilder $builder,
  33.         ViewHandlerInterface $viewHandler,
  34.         ?TokenStorageInterface $tokenStorage null
  35.     ) {
  36.         parent::__construct($viewHandler$tokenStorage);
  37.         $this->documentManager $documentManager;
  38.         $this->contentTwigExtension $contentTwigExtension;
  39.         $this->builder $builder;
  40.     }
  41.     /**
  42.      * Index action.
  43.      *
  44.      * @Rest\Get("/")
  45.      *
  46.      * @return \Symfony\Component\HttpFoundation\Response
  47.      *
  48.      * @throws \Sulu\Component\DocumentManager\Exception\DocumentManagerException
  49.      */
  50.     public function indexAction(Request $request)
  51.     {
  52.         $categories $request->query->get('filters', []);
  53.         $tags $request->query->get('tags', []);           // already unused, i put here to let know that tags can be also handled
  54.         $order $request->query->get('order'null);
  55.         $page $request->query->get('page'1);
  56.         $limit $request->query->get('limit'5);
  57.         $locale $request->query->get('locale''en');
  58.         $initOptions = [
  59.             'config' => [
  60.                 'categories' => $categories,
  61.                 'tags' => $tags,                                // look above
  62.                 'types' => ['caseStudy'],
  63.                 'locale' => $locale,
  64.             ],
  65.         ];
  66.         if ($order) {
  67.             $initOptions['config']['sortBy'] = 'authored';
  68.             $initOptions['config']['sortMethod'] = $order;
  69.         }
  70.         $this->builder->init($initOptions);
  71.         $sql $this->builder->build(
  72.             'modernexpo',
  73.             [$request->getLocale()]
  74.         );
  75.         $results $this->documentManager->createQuery($sql[0], $locale)->execute();
  76.         $total $results->count();
  77.         $data = [
  78.             'cards' => [],
  79.             'page' => $page,
  80.             'totalCount' => $total,
  81.         ];
  82.         if ($total 0) {
  83.             $resultsChunked array_chunk($results->toArray(), $limit);
  84.             $chunkIndex = --$page;
  85.             if (!empty($resultsChunked[$chunkIndex])) {
  86.                 foreach ($resultsChunked[$chunkIndex] as $child) {
  87.                     $mainHeaderDescription $child->getStructure()->getProperty('mainHeaderBlock')->getValue();
  88.                     !empty($mainHeaderDescription) ? $description $mainHeaderDescription[0]['mainHeaderDescription']: $description ="" ;
  89.                     $title $child->getTitle();
  90.                     $document $this->contentTwigExtension->load($child->getUuid());
  91.                     $content $document['content'];
  92.                     $excerpt $document['extension']['excerpt'];
  93.                     $imageMedia $this->getTeaserImage($excerpt['images'], 'teaser.image'true);
  94.                     $imageData = [];
  95.                     $this->addImage($imageData$imageMedia'780x440.jpg''300x200.jpg');
  96.                     $logoMedia $this->getTeaserImage($excerpt['images'], 'teaser.logo');
  97.                     $logoData = [];
  98.                     $this->addImage($logoData$logoMedia'medium-size''medium-size');
  99.                     $item = [
  100.                         'name' => !empty($title) ? $title $content['title'],
  101.                         'description' => !empty($description) ? $description '',
  102.                         'image' => !empty($imageData) ? $imageData['image'] : null,
  103.                         'logo' => !empty($logoData) ? $logoData['image'] : null,
  104.                         'url' => '/'.$locale.$content['url'],
  105.                     ];
  106.                     $data['cards'][] = $item;
  107.                 }
  108.             }
  109.         }
  110.         $view $this->view($data);
  111.         return $this->handleView($view);
  112.     }
  113.     /**
  114.      * Get image with defined tag.
  115.      *
  116.      * If many images with the same tag, get first.
  117.      * If getAny flag is true and no images with tag, get first of all images.
  118.      *
  119.      * @param false $getAny
  120.      */
  121.     private function getTeaserImage(array $mediasstring $tag$getAny false): ?Media
  122.     {
  123.         $images array_filter($medias, fn ($media) => in_array($tag$media->getTags()));
  124.         array_unshift($images);
  125.         if ($getAny && empty($images)) {
  126.             $images $medias;
  127.         }
  128.         return !empty($images) ? $images[0] : null;
  129.     }
  130. }