<?php
namespace App\Controller\Website;
use App\Twig\Components\Common\imageTrait;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\ViewHandlerInterface;
use Sulu\Bundle\MediaBundle\Api\Media;
use Sulu\Bundle\WebsiteBundle\Twig\Content\ContentTwigExtensionInterface;
use Sulu\Component\Content\SmartContent\QueryBuilder;
use Sulu\Component\DocumentManager\DocumentManagerInterface;
use Sulu\Component\Rest\AbstractRestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
/**
* Class of case studies.
*
* @author Michał Wiązek <michal.wiazek@makolab.com>
*
* @Rest\Route("/api/case_studies", name="app.case_studies.", defaults={ "_format" = "json" })
*/
class CaseStudiesController extends AbstractRestController
{
use imageTrait;
private DocumentManagerInterface $documentManager;
private ContentTwigExtensionInterface $contentTwigExtension;
private QueryBuilder $builder;
/**
* Constructor.
*/
public function __construct(
DocumentManagerInterface $documentManager,
ContentTwigExtensionInterface $contentTwigExtension,
QueryBuilder $builder,
ViewHandlerInterface $viewHandler,
?TokenStorageInterface $tokenStorage = null
) {
parent::__construct($viewHandler, $tokenStorage);
$this->documentManager = $documentManager;
$this->contentTwigExtension = $contentTwigExtension;
$this->builder = $builder;
}
/**
* Index action.
*
* @Rest\Get("/")
*
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Sulu\Component\DocumentManager\Exception\DocumentManagerException
*/
public function indexAction(Request $request)
{
$categories = $request->query->get('filters', []);
$tags = $request->query->get('tags', []); // already unused, i put here to let know that tags can be also handled
$order = $request->query->get('order', null);
$page = $request->query->get('page', 1);
$limit = $request->query->get('limit', 5);
$locale = $request->query->get('locale', 'en');
$initOptions = [
'config' => [
'categories' => $categories,
'tags' => $tags, // look above
'types' => ['caseStudy'],
'locale' => $locale,
],
];
if ($order) {
$initOptions['config']['sortBy'] = 'authored';
$initOptions['config']['sortMethod'] = $order;
}
$this->builder->init($initOptions);
$sql = $this->builder->build(
'modernexpo',
[$request->getLocale()]
);
$results = $this->documentManager->createQuery($sql[0], $locale)->execute();
$total = $results->count();
$data = [
'cards' => [],
'page' => $page,
'totalCount' => $total,
];
if ($total > 0) {
$resultsChunked = array_chunk($results->toArray(), $limit);
$chunkIndex = --$page;
if (!empty($resultsChunked[$chunkIndex])) {
foreach ($resultsChunked[$chunkIndex] as $child) {
$mainHeaderDescription = $child->getStructure()->getProperty('mainHeaderBlock')->getValue();
!empty($mainHeaderDescription) ? $description = $mainHeaderDescription[0]['mainHeaderDescription']: $description ="" ;
$title = $child->getTitle();
$document = $this->contentTwigExtension->load($child->getUuid());
$content = $document['content'];
$excerpt = $document['extension']['excerpt'];
$imageMedia = $this->getTeaserImage($excerpt['images'], 'teaser.image', true);
$imageData = [];
$this->addImage($imageData, $imageMedia, '780x440.jpg', '300x200.jpg');
$logoMedia = $this->getTeaserImage($excerpt['images'], 'teaser.logo');
$logoData = [];
$this->addImage($logoData, $logoMedia, 'medium-size', 'medium-size');
$item = [
'name' => !empty($title) ? $title : $content['title'],
'description' => !empty($description) ? $description : '',
'image' => !empty($imageData) ? $imageData['image'] : null,
'logo' => !empty($logoData) ? $logoData['image'] : null,
'url' => '/'.$locale.$content['url'],
];
$data['cards'][] = $item;
}
}
}
$view = $this->view($data);
return $this->handleView($view);
}
/**
* Get image with defined tag.
*
* If many images with the same tag, get first.
* If getAny flag is true and no images with tag, get first of all images.
*
* @param false $getAny
*/
private function getTeaserImage(array $medias, string $tag, $getAny = false): ?Media
{
$images = array_filter($medias, fn ($media) => in_array($tag, $media->getTags()));
array_unshift($images);
if ($getAny && empty($images)) {
$images = $medias;
}
return !empty($images) ? $images[0] : null;
}
}