<?php
namespace App\Document\Controller;
use App\Auction\Form\Type\AuctionDetailFilterType;
use App\Auction\Manager\AuctionManager;
use App\EventMap\EventMap;
use App\Race\Form\Type\RaceDetailFilterType;
use App\Race\Manager\RaceManager;
use App\Race\Model\Raceday;
use App\Service\photoNewsService;
use Carbon\Carbon;
use Doctrine\DBAL\Query\QueryBuilder;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\Auction;
use Pimcore\Model\DataObject\Auctionhouse;
use Pimcore\Model\DataObject\Jockey;
use Pimcore\Model\DataObject\News;
use Pimcore\Model\DataObject\Owner;
use Pimcore\Model\DataObject\Photographer;
use Pimcore\Model\DataObject\Race;
use Pimcore\Model\DataObject\Racingtrack;
use Pimcore\Model\DataObject\Studfarm;
use Pimcore\Model\DataObject\Trainer;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Notifier\NotifierInterface;
use Symfony\Component\Routing\Annotation\Route;
class DocumentController extends FrontendController
{
public function document(NotifierInterface $notifier)
{
$class = get_class($this->document);
$templates = [
'Pimcore\Model\Document\Page' => 'document/index.html.twig',
'Pimcore\Model\Document\Hardlink\Wrapper\Page' => 'document/index.html.twig',
'Pimcore\Model\Document\Snippet' => 'layout/snippet/snippet.html.twig',
'Pimcore\Model\Document\Email' => 'layout/email/email.html.twig',
'Pimcore\Model\Document\Newsletter' => 'layout/newsletter/newsletter.html.twig',
];
return $this->renderTemplate($templates[$class]);
}
/**
* impressum.
*/
public function impressumAction(Request $request)
{
return $this->renderTemplate('document/impressum.html.twig');
}
/**
* This is quick and dirty, please remove as soon as the auction house profiles are implemented
* TODO: Remove after profile auction house has been implemented.
*/
public function auctionHouseAction(Request $request, RaceManager $raceManager, EventMap $eventMap, AuctionManager $auctionManager, PaginatorInterface $paginator)
{
$auctionHouse = $this->document->getProperty('auctionhouse');
if (!$auctionHouse) {
$auctionHouse = Auctionhouse::getById(24);
}
// dd($this->document->getEditable('team')->getElements()[0]->getEditable('name'));
// foreach ($this->document->getEditable('team')->getIterator() as $team) {
// dd($team);
// // code...
// }
// news holen
$total = 0;
$auctionsHouseNews = [];
if ($auctionHouse->getNews()) {
$newsfolder = $auctionHouse->getNews()->getPath().$auctionHouse->getNews()->getKey();
$auctionsHouseNews = News::getList()
->setCondition('o_path LIKE :folder', ['folder' => $newsfolder.'%']);
$total = $auctionsHouseNews->getTotalCount();
$auctionsHouseNews = $auctionsHouseNews->setOrderKey(['date'])->setOrder(['desc'])->setLimit(5)->load();
}
$now = Carbon::now();
$filter = $this->createForm(AuctionDetailFilterType::class, [
'period' => $request->get('period', 'future'),
], ['method' => 'get']);
$filter->handleRequest($request);
$auctions = Auction::getList();
$auctions->setCondition('auctionhouse__id = :auctionHouse and end >= :end', ['auctionHouse' => $auctionHouse->getId(), 'end' => Carbon::now()->format('Y-m-d')]);
// $auctions->setCondition('end >= :end', ['end' => Carbon::now()->format('Y-m-d')]);
$auctions->setOrderKey('end');
$auctions->setOrder('asc');
if ($filter->isSubmitted() && $filter->isValid()) {
$data = (object) $filter->getData();
// if($auctionHouse->getId()){
$auctions->setCondition('auctionhouse__id = :auctionHouse', ['auctionHouse' => $auctionHouse->getId()]);
$auctions->setOrderKey('end');
$data->period == 'past' ? $auctions->addConditionParam('end < :end', ['end' => Carbon::now()->format('Y-m-d')])->setOrder('desc') : null;
$data->period == 'future' ? $auctions->addConditionParam('end >= :end', ['end' => Carbon::now()->format('Y-m-d')])->setOrder('asc') : null;
}
$page = $request->get('page', 1);
$paginaton = $paginator->paginate($auctions, $page, 5);
$countdowns = [];
foreach ($auctions as $auction) {
if ($auction->getStart() && $auction->getStart() > $now) {
$countdowns[$auction->getId()] = $auction->getStart()->diffAsCarbonInterval($now);
} else {
if ($auction->getEnd()) {
$countdowns[$auction->getId()] = $auction->getEnd()->diffAsCarbonInterval($now);
}
}
}
// MARKER
$races = $auctionHouse->getRaces();
$marker = [
...$eventMap->generateMarker($races),
...$eventMap->generateMarker($auctions->load()),
];
return $this->renderTemplate('document/profiles/auction_house.html.twig', [
'auctionhouse' => $auctionHouse,
'profile' => $auctionHouse,
'auctions' => $auctions,
'pagination' => $paginaton,
'now' => $now,
'countdowns' => $countdowns,
'auctionsHouseNews' => $auctionsHouseNews,
'marker' => $marker,
'offset' => $request->request->get('offset', 0) + 5,
'total' => $total,
'filter' => $filter->createView(),
'',
]);
}
/**
* This is quick and dirty, please remove as soon as the photographer profiles are implemented
* TODO: Remove after profile photographer has been implemented.
*/
public function photographerAction(Request $request)
{
$photographer = $this->document->getProperty('photographer');
if (!$photographer) {
throw $this->createNotFoundException('No Photographer found for document');
}
// crawls https://www.galoppfoto.de/de/events and returns generated news
// $photoNewsService = new photoNewsService();
// $photoNewsService -> getPhotoNews();
$news = $photographer->getNews();
return $this->renderTemplate('document/profiles/photographer.html.twig', [
'photographer' => $photographer,
'profile' => $photographer,
'news' => $news,
]);
}
/**
* This is quick and dirty, please remove as soon as the owner profiles are implemented
* TODO: Remove after profile owner has been implemented.
*/
public function ownerAction(Request $request, RaceManager $raceManager)
{
$owner = $this->document->getProperty('owner');
if (!$owner) {
throw $this->createNotFoundException('No Owner found for document');
}
$horses = $owner->getHorses();
$auctions = [];
foreach ($horses as $horse) {
$folder = $horse->getParent();
$auction = Auction::getByHorseFolder($folder, 1);
if (!$auction) {
continue;
}
$auctions[$auction->getId()]['auction'] = $auction;
$auctions[$auction->getId()]['horses'][] = $horse;
}
// Horselist
$horselist = [];
foreach ($horses as $horse) {
if ($horse->getTrainer()) {
$horselist[$horse->getTrainer()->getId()][] = [
'trainer' => $horse->getTrainer(),
'horse' => $horse,
];
}
}
$newsOffset = $request->request->get('offset', 0) + 5;
return $this->renderTemplate('document/profiles/owner.html.twig', [
'owner' => $owner,
'profile' => $owner,
'auctions' => $auctions,
// "racedays" => $racedays,
'horselist' => $horselist,
'now' => new Carbon(),
'offset' => $newsOffset,
'total' => count($owner->getNews()),
'ownerNews' => array_slice($owner->getNews(), 0, $newsOffset),
]);
}
/**
* List Of PhotoNews.
*
* @Route("/photoNews/{profilType}/{profilId}", name="photo_news")
*/
public function photoNews(Request $request, $profilId)
{
$photographer = Photographer::getById($profilId);
$limit = (int) $request->get('limit', 5);
$total = 0;
$newsList = $photographer->getNews();
// echo '<pre>', var_dump($news), '</pre>';
// $news->addConditionParam('date >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
// $news->onCreateQueryBuilder(
// function (QueryBuilder $queryBuilder) {
// $queryBuilder->groupBy(['DATE(date)']);
// }
// );
// $news->setLimit($limit);
// $total = $news->getTotalCount();
// $news = $news->load();
$total = count($newsList);
$trimmedNewsList = [];
for ($i = 0; $i < $limit && $i < count($newsList); ++$i) {
array_push($trimmedNewsList, $newsList[$i]);
}
// echo '<pre>', var_dump($trimmedNewsList), '</pre>';
return $this->renderTemplate('news/photoNews.html.twig', [
'profilType' => 'Photographer',
'profilId' => $profilId,
'news' => $trimmedNewsList,
'limit' => $limit,
'total' => $total,
]);
}
/**
* List Of Racedays.
*
* @Route("/racedays/{profilType}/{profilId}", name="race_days")
*/
public function racedays(Request $request, $profilType, $profilId, RaceManager $raceManager)
{
$profil = [];
if ('Owner' === $profilType) {
$profil = Owner::getById($profilId);
} elseif ('Trainer' === $profilType) {
$profil = Trainer::getById($profilId);
} elseif ('Jockey' === $profilType) {
$profil = Jockey::getById($profilId);
} elseif ('Auctionhouse' === $profilType) {
$profil = Auctionhouse::getById($profilId);
} elseif ('Studfarm' === $profilType) {
$profil = Studfarm::getById($profilId);
}
$limit = (int) $request->get('limit', 5);
$total = 0;
if (!$profil) {
throw $this->createNotFoundException('No Profil found for document');
}
$racedays = [];
$racesRelationData = $profil->retrieveRelationData(['fieldname' => 'races', 'ownertype' => 'object']);
$raceIds = array_map(function ($relation) {
return $relation['dest_id'];
}, $racesRelationData);
$days = Race::getList();
$days->addConditionParam('oo_id in (:races)', ['races' => $raceIds]);
$days->addConditionParam('start >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
$days->onCreateQueryBuilder(
function (QueryBuilder $queryBuilder) {
$queryBuilder->groupBy(['DATE(start)', 'racingtrack__id']);
}
);
$days->setLimit($limit);
$total = $days->getTotalCount();
$days = $days->load();
foreach ($days as $day) {
$races = $raceManager->getRacesByDayAndRacingtrack($day->getStart(), $day->getRacingtrack());
$races->addConditionParam('oo_id in (:races)', ['races' => $raceIds]);
$races->addConditionParam('start >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
$racedays[] = [
'day' => $day,
'races' => $races->load(),
];
}
$response = $this->renderTemplate('racingtrack/race_days.html.twig', [
'racedays' => $racedays,
'profilType' => $profilType,
'profilId' => $profilId,
'limit' => $limit,
'total' => $total,
]);
return $response;
}
/**
* This is quick and dirty, please remove as soon as the owner profiles are implemented
* TODO: Remove after profile owner has been implemented.
*/
public function studfarmAction(Request $request, RaceManager $raceManager)
{
$studfarm = $this->document->getProperty('studfarm');
if (!$studfarm) {
throw $this->createNotFoundException('No Studfarm found for document');
}
$horses = $studfarm->getHorses();
$auctions = [];
foreach ($horses as $horse) {
$folder = $horse->getParent();
$auction = Auction::getByHorseFolder($folder, 1);
if (!$auction) {
continue;
}
$auctions[$auction->getId()]['auction'] = $auction;
$auctions[$auction->getId()]['horses'][] = $horse;
}
$newsOffset = $request->request->get('offset', 0) + 5;
return $this->renderTemplate('document/profiles/studfarm.html.twig', [
'studfarm' => $studfarm,
'profile' => $studfarm,
// "racedays" => $racedays,
'auctions' => $auctions,
'now' => new Carbon(),
'offset' => $newsOffset,
'total' => count($studfarm->getNews()),
'studfarmNews' => array_slice($studfarm->getNews(), 0, $newsOffset),
]);
}
/**
* This is quick and dirty, please remove as soon as the owner profiles are implemented
* TODO: Remove after profile owner has been implemented.
*/
public function associationAction(Request $request, RaceManager $raceManager, EventMap $eventMap, PaginatorInterface $paginator)
{
$association = $this->document->getProperty('association');
if (!$association) {
throw $this->createNotFoundException('No Association found for document');
}
$period = $request->get('period', 'future');
$page = $request->get('page', 1);
$filter = $this->createForm(RaceDetailFilterType::class, [
'period' => $period,
], ['method' => 'get']);
$filter->handleRequest($request);
$racedays = [];
$allRaces = [];
if ($association->getRaces()) {
$folder = $association->getRaces()->getFullPath();
$racedays = new \App\Raceday\Model\Listing();
$racedays->setCondition('object_race.o_path LIKE :folder', ['folder' => $folder.'%']);
$racedays->addConditionParam('start >= :now', ['now' => Carbon::now()->format('Y-m-d')]);
if ($filter->isSubmitted() && $filter->isValid()) {
$data = (object) $filter->getData();
if ($data->period) {
$racedays = new \App\Raceday\Model\Listing();
$racedays->setCondition('object_race.o_path LIKE :folder', ['folder' => $folder.'%']);
$racedays->addConditionParam('object_race.start '.($data->period == 'future' ? '>=' : '<').' :now', ['now' => Carbon::now()->format('Y-m-d')]);
// $racedays->addConditionParam('date ')
$racedays->setOrderKey('object_race.start', false);
$racedays->setOrder($data->period == 'future' ? 'asc' : 'desc');
}
}
}
$pagination = $paginator->paginate(
$racedays,
$page,
5
);
$newsOffset = $request->request->get('offset', 0) + 5;
// MARKER
$marker = [];
$marker = $eventMap->generateMarker($allRaces);
return $this->renderTemplate('document/profiles/association.html.twig', [
'association' => $association,
'profile' => $association,
'racedays' => $racedays,
'now' => new Carbon(),
'marker' => $marker,
'offset' => $newsOffset,
'total' => count($association->getNews()),
'associationNews' => array_slice($association->getNews(), 0, $newsOffset),
'filter' => $filter->createView(),
'pagination' => $pagination,
]);
}
/**
* This is quick and dirty, please remove as soon as the trainer profiles are implemented
* TODO: Remove after profile trainer has been implemented.
*/
public function trainerAction(Request $request, RaceManager $raceManager)
{
/**
* @var Trainer
*/
$trainer = $this->document->getProperty('trainer');
if (!$trainer) {
throw $this->createNotFoundException('No Trainer found for document');
}
$horses = $trainer->getHorses();
$auctions = [];
foreach ($horses as $horse) {
$folder = $horse->getParent();
$auction = Auction::getByHorseFolder($folder, 1);
if (!$auction) {
continue;
}
$auctions[$auction->getId()]['auction'] = $auction;
$auctions[$auction->getId()]['horses'][] = $horse;
}
// Horselist
$horselist = [];
foreach ($horses as $horse) {
if ($horse->getOwner()) {
$horselist[$horse->getOwner()->getId()][] = [
'owner' => $horse->getOwner(),
'horse' => $horse,
];
}
}
$newsOffset = $request->request->get('offset', 0) + 5;
return $this->renderTemplate('document/profiles/trainer.html.twig', [
'trainer' => $trainer,
'profile' => $trainer,
// "racedays" => $racedays,
'auctions' => $auctions,
'horselist' => $horselist,
'now' => new Carbon(),
'offset' => $newsOffset,
'total' => count($trainer->getNews()),
'trainerNews' => array_slice($trainer->getNews(), 0, $newsOffset),
]);
}
/**
* This is quick and dirty, please remove as soon as the jockey profiles are implemented
* TODO: Remove after profile jockey has been implemented.
*/
public function jockeyAction(Request $request, RaceManager $raceManager)
{
/**
* @var Jockey
*/
$jockey = $this->document->getProperty('jockey');
if (!$jockey) {
throw $this->createNotFoundException('No Jockey found for document');
}
$horses = $jockey->getHorses();
$auctions = [];
foreach ($horses as $horse) {
$folder = $horse->getParent();
$auction = Auction::getByHorseFolder($folder, 1);
if (!$auction) {
continue;
}
$auctions[$auction->getId()]['auction'] = $auction;
$auctions[$auction->getId()]['horses'][] = $horse;
}
$newsOffset = $request->request->get('offset', 0) + 5;
return $this->renderTemplate('document/profiles/jockey.html.twig', [
'jockey' => $jockey,
// "racedays" => $racedays,
'auctions' => $auctions,
'now' => new Carbon(),
'offset' => $newsOffset,
'total' => count($jockey->getNews()),
'jockeyNews' => array_slice($jockey->getNews(), 0, $newsOffset),
]);
}
/**
* This is quick and dirty, please remove as soon as the racetrack profiles are implemented
* TODO: Remove after profile racetrack has been implemented.
*/
public function racetrackAction(Request $request, RaceManager $raceManager, PaginatorInterface $paginator)
{
/**
* @var Racingtrack
*/
$racetrack = $this->document->getProperty('racetrack');
if (!$racetrack) {
throw $this->createNotFoundException('No Race-Track found for document');
}
// racetrack filter
$period = $request->get('period', 'future');
$page = $request->get('page', 1);
$filter = $this->createForm(RaceDetailFilterType::class, [
'period' => $period,
], ['method' => 'get']);
$filter->handleRequest($request);
// $racedays = Raceday::getList()->setCondition('racingtrack__id LIKE :racetrack', [ 'racetrack' => $racetrack->getId()]);
// $racedays->setOrderKey('object_race.start', false);
$racedays = new \App\Raceday\Model\Listing();
$sql = $racedays->setCondition('object_race.racingtrack__id = :racetrack and object_race.start >= :now', ['racetrack' => $racetrack->getId(), 'now' => Carbon::now()->format('Y-m-d')]);
// dd([$sql, $racetrack->getId()]);
$racedays->setOrderKey('object_race.start', false);
if ($filter->isSubmitted() && $filter->isValid()) {
$data = (object) $filter->getData();
if ($data->period) {
// $racedays = new \App\Raceday\Model\Listing();
$racedays->setCondition('object_race.racingtrack__id = :racetrack and object_race.start '.($data->period == 'future' ? '>=' : '<').' :now', ['racetrack' => $racetrack->getId(), 'now' => Carbon::now()->format('Y-m-d')]);
// $racedays->addConditionParam('date ')
$racedays->setOrderKey('object_race.start', false);
$data->period == 'past' ? $racedays->setOrder('desc') : null;
$data->period == 'future' ? $racedays->setOrder('asc') : null;
}
}
$pagination = $paginator->paginate(
$racedays,
$page,
5
);
// news holen
$racetrackNews = [];
if ($racetrack->getNews()) {
$racetrackfolder = $racetrack->getNews()->getPath().$racetrack->getNews()->getKey();
$racetrackNews = News::getList()
->setCondition('o_path LIKE :folder or subaffiliation LIKE :racetrack or affiliation__id LIKE :racetrackId', ['folder' => $racetrackfolder.'%', 'racetrack' => '%,object|'.$racetrack->getId().',%', 'racetrackId' => $racetrack->getId()]);
$total = $racetrackNews->getTotalCount();
$racetrackNews = $racetrackNews->setOrderKey(['date'])
->setOrder(['desc'])
->setLimit(5)
->load();
return $this->renderTemplate('document/profiles/racetrack.html.twig', [
'racetrack' => $racetrack,
'racetrackNews' => $racetrackNews,
'racedays' => $racedays,
'now' => new Carbon(),
'offset' => $request->request->get('offset', 0) + 5,
'total' => $total,
'pagination' => $pagination,
'filter' => $filter->createView(),
]);
} else {
return $this->renderTemplate('document/profiles/racetrack.html.twig', [
'racetrack' => $racetrack,
'racetrackNews' => $racetrackNews,
'racedays' => $racedays,
'now' => new Carbon(),
// 'offset' => $request->request->get('offset', 0)+5,
'pagination' => $pagination,
'filter' => $filter->createView(),
]);
}
}
/**
* @Route("/profile/{profileId}/stream/news/", name="profile_stream_news")
*/
public function profileStreamNews(Request $request, $profileId)
{
$profile = DataObject::getById($profileId);
$increaseOffsetBy = 5;
if (gettype($profile->getNews()) == 'object') {
$profilePath = $profile->getNews()->getFullPath();
$news = News::getList()
->setCondition('o_path LIKE :folder', ['folder' => $profilePath.'%']);
$total = $news->getTotalCount();
$offset = (int) $request->get('offset', $increaseOffsetBy);
$totalReached = ($total > $offset + $increaseOffsetBy);
$news = $news->setOrderKey(['date'])
->setOrder(['desc'])
->setOffset($offset)
->setLimit(5)
->load();
} else {
$total = count($profile->getNews());
$offset = (int) $request->get('offset', $increaseOffsetBy);
$totalReached = ($total > $offset + $increaseOffsetBy);
$news = array_slice($profile->getNews(), $offset, $increaseOffsetBy);
}
return $this->renderForm('document/profiles/news_list_stream.html.twig', [
'profile' => $profile,
'news' => $news,
'offset' => $offset + $increaseOffsetBy,
'total' => $total,
'totalReached' => $totalReached,
]);
}
}