<?php
namespace App\Controller;
use App\Website\Tool\Image;
use Devkitchen\DocumentIndexingBundle\Annotations\IndexingDocumentType;
use Devkitchen\DocumentIndexingBundle\Controller\DocumentTypeAwareController;
use Devkitchen\DocumentIndexingBundle\IndexingService\IndexingService;
use Pimcore\Http\Request\Resolver\EditmodeResolver;
use Pimcore\Model\Asset;
use Pimcore\Model\Document\Page;
use Pimcore\Model\Document\Service;
use Pimcore\Translation\Translator;
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class RecipeController extends BaseController implements DocumentTypeAwareController {
/**
* @Route({
* "de": "/{_locale}/erleben-geniessen/rezepte",
* "en": "/{_locale}/erleben-geniessen/rezepte"
* }, name="recipe_not_filtered", methods={"GET"})
*
* @Route({
* "de": "/{_locale}/erleben-geniessen/rezepte/typ/{key}",
* "en": "/{_locale}/erleben-geniessen/rezepte/typ/{key}"
* }, name="recipe_filtered_by_key", methods={"GET"})
*
* @param Request $request
*
* @return Response
*/
public function listingAction(Request $request, IndexingService $indexingService, Translator $translator): Response {
$filterActive = $request->get('key', 'default');
$aggregatedFilter = $indexingService->getFieldAggregated( 'recipe', 'documentSubtype');
$listing = $indexingService->setOrderBy( 'teaserTitle.raw')
->setOrderDirection( 'asc')
->listing( 'recipe', [ $filterActive ]);
if ($listing) {
$listingCount = count( $listing );
$columnCount = 3;
$rows = [];
if ( $listingCount > 0 ) {
$rowCount = ceil( $listingCount / $columnCount );
$contentIndex = 0;
for ( $i = 0; $i < $rowCount; $i ++ ) {
$content = [];
for ( $c = 0; $c < $columnCount; $c ++ ) {
if ( isset( $listing[ $contentIndex ] ) ) {
$item = $listing[ $contentIndex ];
$teaserImageId = $item->teaserAssetId;
if ( $teaserImageId ) {
$teaserImage = Asset::getById( $teaserImageId );
} else {
$teaserImage = $this->document->getProperty( 'document-teaser-image-fallback' );
}
if ( $teaserImage ) {
$gridImageData = Image::getGridThumbnailMetaData( $teaserImage, 4, $this->editmode, 'teaser-default' );
$teaserThumbnail = $teaserImage->getThumbnail( $gridImageData->thumbnail );
$teaserSubtitle = null;
if ( $item->documentSubtype ) {
foreach ( $item->documentSubtype as $key ) {
$teaserSubtitle[] = $translator->trans( 'filter.value.' . $key );
}
$teaserSubtitle = implode( ', ', $teaserSubtitle );
}
$content[] = $this->renderView( 'includes/partials/teaser/teaser-image-title.html.twig', [
'url' => Page::getById( $item->documentId ),
'title' => $item->teaserTitle,
'subtitle' => $teaserSubtitle,
'image' => $teaserThumbnail->getHtml()
] );
$contentIndex ++;
}
}
}
$rows[] = $this->renderView( 'includes/partials/stuff/grid-row.html.twig', [
'columns' => $content,
'classes' => 'grid--t33 grid--4-4-4'
] );
} //endfor
$request->getSession()->set('recipe-listing', $listing);
$request->getSession()->set('recipe-listing-route', [
'route' => $request->get('_route'),
'params' => $request->get('_route_params')
]);
}
}
return $this->render( 'recipe/listing.html.twig', [
'layoutClass' => 'layout--listing layout--recipe',
'filter' => $aggregatedFilter,
'filterActive' => $filterActive,
'listing' => $listing,
'listingRows' => $rows ?? 0
]);
}
/**
* @param Request $request
* @param IndexingService $indexingService
*
* @return Response
*
* @IndexingDocumentType(type="recipe", tagIdForSubtype="2")
*/
public function detailAction(Request $request, IndexingService $indexingService): Response {
$prevItem = null;
$nextItem = null;
$overview = null;
if ($recipeListing = $request->getSession()->get( 'recipe-listing')) {
$item = $indexingService->get( $this->document );
if ($item) {
foreach($recipeListing as $key => $listingItem) {
if ($listingItem->id == $item->id) {
if (isset($recipeListing[$key - 1])) {
$prevItem = $recipeListing[$key - 1];
}
if (isset($recipeListing[$key + 1])) {
$nextItem = $recipeListing[$key + 1];
}
}
}
}
$overview = $request->headers->get( 'referer');
if ( $overviewRouteInfo = $request->getSession()->get( 'recipe-listing-route' ) ) {
$overview = $this->generateUrl( $overviewRouteInfo['route'], $overviewRouteInfo['params'] ?: [] );
}
//p_r($request->get('_route'));
//p_r($request->get('_route_params'));
}
return $this->render('recipe/detail.html.twig', [
'layoutClass' => 'layout--detail layout--recipe',
'overview' => $overview,
'prev' => $prevItem,
'next' => $nextItem
]);
}
/**
* @Route("/pdf")
* @param Request $request
*
* @return void
*/
public function printAction(Request $request) {
$html = Service::render( Page::getById( 35 ));
$crawler = new Crawler();
$crawler->add($html);
$htmlFiltered = $crawler->filter( '.section--printable' )->each( function ( Crawler $node, $i ) {
return $node->html();
});
$params = [];
$adapter = \Pimcore\Web2Print\Processor::getInstance();
if ($adapter instanceof \Pimcore\Web2Print\Processor\HeadlessChrome) {
$params['adapterConfig'] = [
'landscape' => false,
'printBackground' => false,
'mediaType' => 'print',
'format' => null,
'margin' => [
'top' => '16 mm',
'bottom' => '30 mm',
'right' => '8 mm',
'left' => '8 mm',
],
'displayHeaderFooter' => false,
];
}
return new \Symfony\Component\HttpFoundation\Response(
$adapter->getPdfFromString($html, $params),
200,
[
'Content-Type' => 'application/pdf',
// 'Content-Disposition' => 'attachment; filename="custom-pdf.pdf"' //direct download
]
);
}
}