<?php
namespace App\Controller;
use App\Service\DolpoSearchService;
use App\Service\Website\Navigation\BreadcrumbHelperService;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\DataObject\Author;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
// ADDED
class AuthorController extends FrontendController
{
/**
* @param Request $request
*
* @return Response
*/
public function singleAction(Request $request,
BreadcrumbHelperService $breadcrumbHelperService,
DolpoSearchService $dolpoSearchService
): Response {
$author = Author::getByDolpoId($request->get('dolpoId'), true);
if (!$author instanceof Author) {
throw new NotFoundHttpException('Author not found.');
}
$author_id = $author->getId();
//tous les livres / On utilise ES
$books = $author->getAllBooks($dolpoSearchService);
//tableau des séries (clé : id série, puis un tableau ['book_id'=>id du premier livre trouvé, 'best'=>true/false])
$series=[];
$best_books=[]; //meilleurs livres hors séries
$other_books=[]; //autres livres
$best_series=[]; //meilleurs séries
$other_series=[]; // autres séries
foreach($books as $book) {
//on vérifie si c'est un best book ou non.
$top_best_book=false;
$bookId = array_key_exists('o_id', $book) ? (int) $book['o_id'] : null;
if (empty($bookId)) {
continue;
}
$tags = is_array($book['tags'] ?? null) ? $book['tags'] : [];
foreach ($tags as $tag) {
if (is_array($tag) && array_key_exists('id', $tag) && (int) $tag['id'] === 5915) {
$top_best_book = true;
break;
}
}
//on récupère les éventuelles séries
$serieid = array_key_exists('serie_id', $book) ? (int) $book['serie_id'] : null;
if(!empty($serieid) and $serieid > 0) {
if (!array_key_exists($serieid, $series)) {
$series[$serieid]=['book_id'=>$bookId, 'best'=>false]; // on garde le premier livre trouvé pour afficher la série
}
if($top_best_book) {
//le livre appartient à une série et la série est une best
$series[$serieid]['best']=true;
}
continue;
}
if($top_best_book) {
//si ce n'est pas un livre qui appartient à une série et qu'il s'agit d'un meilleur livre
$best_books[] = $bookId;
} else {
$other_books[] = $bookId;
}
}
//une fois que tous les livres ont été parcourus, on peut dire si les séries sont des best ou pas.
foreach($series as $serie) {
if($serie['best']) {
$best_series[]=$serie['book_id'];
} else {
$other_series[]=$serie['book_id'];
}
}
$top_tags = $author->getAuthorBookNumberByCategory($dolpoSearchService);
// Get the category to retreive the page (for breadcrumb)
$document = \Pimcore\Model\Document::getById(1);
$pageLinkedToCategory = $author->getPageLinkedToMainCategory($dolpoSearchService);
if($pageLinkedToCategory != null) {
$document = $pageLinkedToCategory;
}
// SEO
$document->setTitle($author->getName());
$document->setDescription(\App\Service\Website\Tool\Text::cutStringRespectingWhitespace($author->getBiography(), 250));
$params = [
'document' => $document,
'author' => $author,
'top_tags' => $top_tags,
];
if(count(array_merge($best_series, $best_books)) > 0) {
$params['best_items'] = [
'tagsToShow' => false,
'tagsSelectionIds' => '',
'objectsSelectionIds' => implode(',', array_merge($best_series, $best_books)),
'frontFilters' => null,
'pagination' => null,
'showCount' => false,
'ad' => null,
'title' => 'Ouvrages de référence de ' . $author->getName(),
'editmode' => false,
'uniqueId' => null
];
}
if(count($other_series) > 0) {
$params['other_series'] = [
'tagsToShow' => false,
'tagsSelectionIds' => '',
'objectsSelectionIds' => implode(',', $other_series),
'frontFilters' => null,
'pagination' => null,
'showCount' => false,
'ad' => null,
'title' => 'Les séries de ' . $author->getName(),
'editmode' => false,
'uniqueId' => null
];
}
if(count($other_books) > 0) {
$params['other_books'] = [
'tagsToShow' => false,
'tagsSelectionIds' => '',
'objectsSelectionIds' => implode(',', $other_books),
'frontFilters' => null,
'pagination' => null,
'showCount' => false,
'ad' => null,
'title' => 'Les livres de ' . $author->getName(),
'editmode' => false,
'uniqueId' => null
];
}
$breadcrumbHelperService->enrichAuteurDetailPage($author);
return $this->render('author/single.html.twig', $params);
}
}