2020-01-18 */ use Propel\Runtime\ActiveQuery\Criteria; // ">=" filter criteria use Propel\Runtime\Propel; // for getConnection use Propel\Runtime\Formatter\ObjectFormatter; // for PropelObjectFormatter require_once(__DIR__.'/ui.php'); if (!$id = (int)Util::ValidateArrayKey($_GET, 'id')) { // no/false-y 'id' get param passed Util::Redirect('/'); } $event = EventQuery::create()->findOneByEventId($id); if (null === $event) { // event id does not exist Util::Redirect('/'); } // if we just have an ID and no description (ie. old-style URL) redirect to a nicer one. if (empty($_GET['desc'])) { Util::Redirect('/event/'.$event->getNiceUrl()); } // was using script_uri but its not set on titan? i guess use a combination of scheme, host & request_uri $source = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // HTTP_CF_CONNECTING_IP will show us the actual client IP (could be ipv6). fallback to REMOTE_ADDR if not set. $ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['REMOTE_ADDR']; $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? null; // track views of events, to drive "10 most popular events by page views" on homepage $event->trackPageView($source, $ip, $userAgent); // used throughout $venue = $event->getVenue(); //if ($_GET['test']==1) {echo $venue->getNiceUrl()."YYYYYY"; print_r($venue); die;} $nowGmt = strtotime(gmdate('Y-m-d H:i:s')); // next 7 events taking place at this venue (after "now") $nextFiveEvents = EventQuery::create() ->filterByVenueId($event->getVenueId()) ->filterByEventStartTime($nowGmt, Criteria::GREATER_EQUAL) ->orderByEventStartTimeLocal() ->limit(10) //Eric says - change is good, SEO is greater! ->find(); //ACK - little help? // events can have multiple categories (because of category_event_relations table). // get 1st category. note there could technically be more. $category = $event->getCategories()->getFirst(); if ($category) { $template->assign("category", $category->getCategoryName()); // eg. var_dump($firstCategory->getCategoryName()); } else { $template->assign("category", "Event"); } // closest 5 venues with events. // being able to say "with events" is going to be very heavy. // we can get the closest 5 venues no problem. but not all of these venues // necessarily have events.... we can do a subquery and use "HAVING event_count > 0" to filter, // but this takes an incredible amount of time (>30s, never finished). i guess we could get the closest // 10/20/50 venues and then filter that list down to 5... no way to know if 10/20/50 will be enough. // lets go with 200 for now... seems to work on any pages i've checked. // *** discuss with Eric. this query takes ~1-1.5 seconds at the moment on my home pc, page is noticeably slow *** $closestFiveVenuesWithEvents = []; $lat = $venue->getVenueLat(); $long = $venue->getVenueLong(); if ($lat && $long) { $sql = ' SELECT a.*, ( select count(*) from tp_events where tp_events.event_start_time >= :now_gmt and tp_events.venue_id = a.venue_id ) as event_count from ( SELECT tp_venues.*, 111.045* DEGREES(ACOS(COS(RADIANS(:search_lat)) * COS(RADIANS(venue_lat)) * COS(RADIANS(:search_long) - RADIANS(venue_long)) + SIN(RADIANS(:search_lat)) * SIN(RADIANS(venue_lat)))) AS distance_in_km FROM tp_venues WHERE venue_lat IS NOT NULL AND venue_long IS NOT NULL AND venue_id != :self_venue_id ORDER BY distance_in_km LIMIT 150 ) as a having event_count > 0 limit 5 '; $con = Propel::getConnection(); $stmt = $con->prepare($sql); $stmt->execute([ ':search_lat' => $lat, ':search_long' => $long, ':self_venue_id' => $event->getVenueId(), ':now_gmt' => $nowGmt ]); // hydrate Venue objects using query results. // (note: if we want to keep event_count or distance_in_km we cant do this - // we would do $stmt->fetchAll(PDO::FETCH_ASSOC) and adjust event.tpl accordingly) // aha! dont need to do that after all. can use "Virtual Columns" eg. withColumn(). $formatter = new ObjectFormatter(); $formatter->setClass('Venue'); $closestFiveVenuesWithEvents = $formatter->format($con->getDataFetcher($stmt)); } // get tickets for this event, ordered by start time $eventTickets = TicketQuery::create() ->filterByEvent($event) ->orderByTicketSaleStartLocal() ->find(); // sort tickets by type $tickets = [ 'onsale' => [], 'presale' => [] ]; foreach ($eventTickets as $ticket) { switch ($ticket->getTicketSaleType()) { case 1: $tickets['onsale'][] = $ticket; break; case 2: $tickets['presale'][] = $ticket; break; } } // potentially add 1 or more templates to be displayed, based on type/subtype/etc. $potentialTemplates = [ 'Alternative Rock' => 'filler/genres/Alternative Rock.tpl', 'Baseball' => 'filler/genres/Baseball.tpl', 'Basketball' => 'filler/genres/Basketball.tpl', 'Boxing' => 'filler/genres/Boxing.tpl', "Children's Theatre" => "filler/genres/Children's Theatre.tpl", 'Circus' => 'filler/genres/Circus.tpl', 'Classical' => 'filler/genres/Classical.tpl', 'Comedy' => 'filler/genres/Comedy.tpl', 'Country' => 'filler/genres/Country.tpl', 'Dance/Electronic' => 'filler/genres/Dance-Electronic.tpl', 'Drama' => 'filler/genres/Drama.tpl', 'Fine Art' => 'filler/genres/Fine Art.tpl', 'Folk' => 'filler/genres/Folk.tpl', 'French Rap' => 'filler/genres/French Rap.tpl', 'Golf' => 'filler/genres/Golf.tpl', 'Hip-Hop/Rap' => 'filler/genres/Hip-Hop-Rap.tpl', 'Hockey' => 'filler/genres/Hockey.tpl', 'Ice Shows' => 'filler/genres/Ice Shows.tpl', 'Jazz' => 'filler/genres/Jazz.tpl', 'Latin' => 'filler/genres/Latin.tpl', 'Magic' => 'filler/genres/Magic.tpl', 'Metal' => 'filler/genres/Metal.tpl', 'MLB' => 'filler/genres/MLB.tpl', 'Motorsports/Racing' => 'filler/genres/Motorsports-Racing.tpl', 'Musical' => 'filler/genres/Musical.tpl', 'Pop' => 'filler/genres/Pop.tpl', 'Rock' => 'filler/genres/Rock.tpl', 'Rodeo' => 'filler/genres/Rodeo.tpl', 'Rugby' => 'filler/genres/Rugby.tpl', 'Soccer' => 'filler/genres/Soccer.tpl', 'World' => 'filler/genres/World.tpl', 'Wrestling' => 'filler/genres/Wrestling.tpl', ]; $fillerTemplates = []; foreach ($event->getEventClassifications() as $c) { if (isset($potentialTemplates[$c->getGenre()])) { $t = $potentialTemplates[$c->getGenre()]; $fillerTemplates[$t] = $t; } if (isset($potentialTemplates[$c->getSubGenre()])) { $t = $potentialTemplates[$c->getSubGenre()]; $fillerTemplates[$t] = $t; } if (isset($potentialTemplates[$c->getType()])) { $t = $potentialTemplates[$c->getType()]; $fillerTemplates[$t] = $t; } if (isset($potentialTemplates[$c->getSubType()])) { $t = $potentialTemplates[$c->getSubType()]; $fillerTemplates[$t] = $t; } } $template->assign('fillerTemplates', $fillerTemplates); // potentially add some extra content if an event performer has some. $artists = $event->getArtists(); $extraContents = []; foreach ($artists as $artist) { $contents = $artist->getExtraArtistContents(); foreach ($contents as $content) { $extraContents[] = $content; } } // add event name to page title $template->title = "{$event->getEventName()} {$venue->getVenueCity()}: Tickets, Presale Passwords - BoxOfficeHero"; $template->meta_description = "You CAN go: {$event->getEventName()} in {$event->getVenue()->getVenueCity()}, {$event->getVenue()->getVenueState()}: Access to presales, tickets, merchandise and more!"; // links for prev/next event at bottom of page $nextEvent = EventQuery::create()->findOneByEventId($event->getEventId()+1); $prevEvent = EventQuery::create()->findOneByEventId($event->getEventId()-1); $template->assign('nextEvent', $nextEvent); $template->assign('prevEvent', $prevEvent); //$template->js('event.js'); //eric commented this out, TN has been getting HUNDREDS of outclicks and has 0 commissions these past 6+months. cutting them off. $template->css('event.css'); $startTime = $event->getEventStartTimeLocal(); $template->assign('eventJson', [ 'name' => $event->getEventName(), 'date' => $startTime ? \Util::UTCTimestampToUTCDatetime((int)$startTime, 'Y-m-d') : null, 'city' => $event->getVenue()->getVenueCity(), 'state' => $event->getVenue()->getVenueState() ]); $template->assign('id', $id); $template->assign('nextFiveEvents', $nextFiveEvents); $template->assign('closestFiveVenuesWithEvents', $closestFiveVenuesWithEvents); $template->assign('event', $event); $template->assign('venue', $event->getVenue()); $template->assign('artists', $artists); $template->assign('extraContents', $extraContents); $template->assign('tickets', $tickets); //$template->assign('categories', ); $template->display('event.tpl');