<?php
namespace App\Controller;
use App\Service\Website\Navigation\BreadcrumbHelperService;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\DataObject\Serie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
// ADDED
class SerieController extends FrontendController
{
/**
* @param Request $request
*
* @return Response
*/
public function singleAction(Request $request,
BreadcrumbHelperService $breadcrumbHelperService, ): Response
{
$serie = Serie::getByDolpoId($request->get('dolpoId'), true);
if (!$serie instanceof Serie) {
throw new NotFoundHttpException('Serie not found.');
}
$description = $serie->getDescription();
/*
$firstHalfDescription = null;
$secondHalfDescription = null;
if (strlen($description) > 0) {
$words = explode(' ', $description);
$midpoint = intdiv(count($words), 2);
$firstHalfDescription = implode(' ', array_slice($words, 0, $midpoint));
$secondHalfDescription = implode(' ', array_slice($words, $midpoint));
}
*/
$allTomes=$serie->getVolumes();
$allCycles=[];
$books=[];
$authors=[];
$booksOutOfCycles=[];
$booksByCycle=[];
$cycleFormatValid = [];
foreach($allTomes as $tome) {
$book=$tome->getObject();
$books[]=$book;
$cycle = $tome->getCycle();
$number = $tome->getTome();
if ($cycle) { // Si le livre a un cycle
if (!isset($booksByCycle[$cycle])) { // Si le cycle n'est pas encore dans le tableau
$booksByCycle[$cycle] = []; // Initialisez le cycle avec un tableau vide
if (preg_match('/Cycle \d+ : .+/', $cycle)) {
$cycleFormatValid[$cycle] = true;
} else {
$cycleFormatValid[$cycle] = false;
}
}
$booksByCycle[$cycle][] = ['book' => $book, 'number' => $number]; // Ajoutez le livre à la liste de son cycle
} else {
$booksOutOfCycles[]=$book;
}
}
// Maintenant que tous les livres ont été ajoutés, nous pouvons les trier dans chaque cycle.
foreach ($booksByCycle as $cycle => &$booksInCycle) {
usort($booksInCycle, function ($a, $b) {
return $a['number'] <=> $b['number']; // Compare les numéros de tome pour le tri
});
}
unset($booksInCycle); // Important : détruit la référence à la dernière valeur de $booksInCycle
foreach ($booksByCycle as $cycle => &$booksInCycle) {
// Extraire uniquement les livres
$booksInCycle = array_map(function ($entry) {
return $entry['book'];
}, $booksInCycle);
}
unset($booksInCycle); // Important : détruit la référence à la dernière valeur de $booksInCycle
uksort($booksByCycle, function ($a, $b) {
// Extraire le numéro du cycle depuis le début de la chaîne.
preg_match('/^Cycle (\d+) : /', $a, $matchesA);
preg_match('/^Cycle (\d+) : /', $b, $matchesB);
// Obtenir les numéros de cycle, ou 999999 si le cycle ne correspond pas au modèle.
$numA = isset($matchesA[1]) ? intval($matchesA[1]) : 999999;
$numB = isset($matchesB[1]) ? intval($matchesB[1]) : 999999;
// Comparer les numéros de cycle.
return $numA <=> $numB;
});
if(count($books) > 0) {
$authors = reset($books)->getAuthors();
}
foreach ($books as $book) {
$title = $book->getTitle();
$details = explode(',', $title, 2);
$seriesTitle = $details[0];
$tomeDetails = isset($details[1]) ? trim($details[1]) : '';
$tomeNumber = 0; // default tome number
$tomeTitle = '';
$isFormatValid = true; // assume the title is in the normal format
if ($tomeDetails !== '') {
if (preg_match('/tome (\d+)( :)?/i', $tomeDetails, $matches)) {
$tomeNumber = (int)$matches[1]; // convert to integer
$tomeTitleStart = strpos($tomeDetails, ':');
if ($tomeTitleStart !== false) {
$tomeTitle = trim(substr($tomeDetails, $tomeTitleStart + 1));
} else {
$tomeTitle = $seriesTitle;
}
} else {
$isFormatValid = false;
}
} else {
$isFormatValid = false;
}
$bookDetailsList[$book->getId()] = [
'seriesTitle' => $seriesTitle,
'tomeNumber' => $tomeNumber,
'tomeTitle' => $tomeTitle,
'isFormatValid' => $isFormatValid
];
}
// Get the category to retreive the page (for breadcrumb)
$document = \Pimcore\Model\Document::getById(1);
$pageLinkedToCategory = $serie->getPageLinkedToMainCategory();
if($pageLinkedToCategory != null) {
$document = $pageLinkedToCategory;
}
// SEO
$title = $serie->getName();
foreach ($authors as $author) {
$title .= ' : '.$author->getName();
}
$document->setTitle($title);
$descriptionMeta = $description;
if(trim($descriptionMeta) == '') {
$allTomes=$serie->getVolumes();
foreach($allTomes as $tome) {
$book = $tome->getObject();
$descriptionMeta = $book->getDescription();
}
}
$document->setDescription(\App\Service\Website\Tool\Text::cutStringRespectingWhitespace($descriptionMeta, 250));
$params = [
'serie' => $serie,
/*
'firstHalfDescription'=>$firstHalfDescription,
'secondHalfDescription'=>$secondHalfDescription,
*/
'description'=>$description,
'books'=>$books,
'authors'=>$authors,
'bookDetailsList'=>$bookDetailsList ?? [],
'booksByCycle'=>$booksByCycle,
'booksOutOfCycles'=>$booksOutOfCycles,
'cycleFormatValid'=>$cycleFormatValid,
'document' => $document
];
$breadcrumbHelperService->enrichSerieDetailPage($serie);
return $this->render('serie/single.html.twig', $params);
}
}