<?php
namespace App\Controller;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\DataObject;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Contracts\Translation\TranslatorInterface;
use Knp\Component\Pager\PaginatorInterface;
class NewsController extends FrontendController {
// -----------------------------------
// GET DETAIL
// -----------------------------------
/**
* @Route(
* "/{path}/{headline}_n{id}",
* name="newslist",
* requirements={
* "path"=".*",
* "headline"="[\w-]+",
* "id"="\d+"
* }
* )
*/
public function getDetail(Request $request, TranslatorInterface $translator): Response
{
$documentId = $this->document->getId();
// preview
$preview = $request->get('preview');
// parameters
$routeParameters = $request->attributes->get('_route_params');
$id = $routeParameters['id'];
//$title = $routeParameters['title'];
// news object
$detail = DataObject\News::getById($id);
// view
if ($detail && ($preview == 'true' || $detail->getPublished())) {
$headline = HelperController::toUrl($detail->getHeadline());
$detailLink = $this->generateUrl('newslist', [
'id' => $id,
'headline' => $headline,
'path' => $translator->trans('news-url-path')
]);
return $this->render('news/detail.html.twig', [
'newsDetail' => $detail,
'newsDetailLink' => $detailLink,
'newsTeaserList' => $this->getList($request),
'documentId' => $documentId
]);
} else {
throw new NotFoundHttpException("News object not found");
}
}
// -----------------------------------
// GET LIST
// -----------------------------------
public static function getList(Request $request): DataObject\News\Listing
{
$list = new DataObject\News\Listing();
$list->setOrderKey("date");
$list->setOrder("desc");
$list->setLimit(500);
if ($request->get('filter')) {
$list->setCondition('category__id LIKE ?', [$request->get('filter')]);
}
$limit = NULL;
if ($limit) {
$list->setLimit($limit);
}
return $list;
}
// --------------------------------
// GET LIST AJAX
// --------------------------------
/**
* @Route(
* "/news-list",
* name="news-list"
* )
*/
public function listAjax(Request $request, PaginatorInterface $paginator): Response
{
$list = new DataObject\News\Listing();
$list->setOrderKey('date');
$list->setOrder('desc');
//$list->load();
if ($request->get('filter')) {
$list->setCondition('category__id LIKE ?', [$request->get('filter')]);
}
// paginator
$paginator = $paginator->paginate($list, $request->get('page', 1), 4);
return $this->render('news/news-list-ajax.html.twig', [
'newsList' => $paginator,
'paginationVariables' => $paginator->getPaginationData()
]);
}
// -----------------------------------
// GET FILTER
// -----------------------------------
public static function getFilter(): array
{
$list = new DataObject\News\Listing();
$categories = [];
foreach ($list as $detail) {
foreach ($detail->getCategory() as $category) {
$categories[$category->getId()] = $category->getName();
}
}
return $categories;
}
/**
* @Route("{_locale}/api/news-list", name="news-api-list")
* @param Request $request
* @param TranslatorInterface $translator
* @return JsonResponse
*/
public function newsApiAction(Request $request, TranslatorInterface $translator): JsonResponse
{
// set empty json array
$json = [];
// get a list of news objects and order them by date
$apiList = new DataObject\News\Listing();
$apiList->setOrderKey('date');
$apiList->setOrder('DESC');
$apiList->setOffset($request->get('offset', 0));
$apiList->setLimit($request->get('limit', 500));
foreach ($apiList as $item) {
$categories = [];
foreach ($item->getCategory() as $category) {
$categories[] = $category->getName();
}
$title = HelperController::toUrl($item->getHeadline());
$detailLink = $this->generateUrl('news-list', [
'id' => $item->getId(),
'title' => $title,
'path' => $translator->trans('news-url-path')
]);
$json[] = [
'id' => $item->getId(),
'categories' => $categories,
'key' => $item->getKey(),
//'title' => $item->getTitle(),
'intro' => $item->getIntro(),
//'pages' => $item->getPages(),
//'year' => $item->getYear(),
//'image' => $item->getImage()->getThumbnail('NewsOverview')->getPath(),
'detailLink' => $detailLink
];
}
return $this->json($json);
}
}