<?php
/**
* Copyright (C) 2021 Rhyme Digital, LLC.
*
* @link https://rhyme.digital
* @license http://www.gnu.org/licenses/lgpl-3.0.html LGPL
*/
namespace Rhyme\WMassArtsHub\Module\Event;
use Contao\Config;
use Contao\CoreBundle\Image\Studio\LegacyFigureBuilderTrait;
use Contao\Date;
use Contao\FilesModel;
use Contao\Input;
use Contao\PageModel;
use Contao\Pagination;
use Contao\Environment;
use Contao\ModuleEventlist;
use Contao\CoreBundle\Exception\PageNotFoundException;
use Contao\StringUtil;
use Haste\Generator\RowClass;
use Rhyme\WMassArtsHub\Model\Event;
/**
* Class Reader
* @package Rhyme\WMassArtsHub\Module\Event
*/
class EventList extends ModuleEventlist
{
/**
* THIS IS THE SAME AS THE PARENT ASIDE FROM THE HIGHLIGHTED BLOCK BELOW
* Generate the module
*/
protected function compile()
{
/** @var PageModel $objPage */
global $objPage;
$blnClearInput = false;
$intYear = Input::get('year');
$intMonth = Input::get('month');
$intDay = Input::get('day');
// Handle featured events
$blnFeatured = null;
if ($this->cal_featured == 'featured')
{
$blnFeatured = true;
}
elseif ($this->cal_featured == 'unfeatured')
{
$blnFeatured = false;
}
// Jump to the current period
if (!isset($_GET['year']) && !isset($_GET['month']) && !isset($_GET['day']))
{
switch ($this->cal_format)
{
case 'cal_year':
$intYear = date('Y');
break;
case 'cal_month':
$intMonth = date('Ym');
break;
case 'cal_day':
$intDay = date('Ymd');
break;
}
$blnClearInput = true;
}
$blnDynamicFormat = (!$this->cal_ignoreDynamic && \in_array($this->cal_format, array('cal_day', 'cal_month', 'cal_year')));
// Create the date object
try
{
if ($blnDynamicFormat && $intYear)
{
$this->Date = new Date($intYear, 'Y');
$this->cal_format = 'cal_year';
$this->headline .= ' ' . date('Y', $this->Date->tstamp);
}
elseif ($blnDynamicFormat && $intMonth)
{
$this->Date = new Date($intMonth, 'Ym');
$this->cal_format = 'cal_month';
$this->headline .= ' ' . Date::parse('F Y', $this->Date->tstamp);
}
elseif ($blnDynamicFormat && $intDay)
{
$this->Date = new Date($intDay, 'Ymd');
$this->cal_format = 'cal_day';
$this->headline .= ' ' . Date::parse($objPage->dateFormat, $this->Date->tstamp);
}
else
{
$this->Date = new Date();
}
}
catch (\OutOfBoundsException $e)
{
throw new PageNotFoundException('Page not found: ' . Environment::get('uri'));
}
list($intStart, $intEnd, $strEmpty) = $this->getDatesFromFormat($this->Date, $this->cal_format);
// Get all events
$arrAllEvents = $this->getAllEvents($this->cal_calendar, $intStart, $intEnd, $blnFeatured);
$sort = ($this->cal_order == 'descending') ? 'krsort' : 'ksort';
// Sort the days
$sort($arrAllEvents);
// Sort the events
foreach (array_keys($arrAllEvents) as $key)
{
$sort($arrAllEvents[$key]);
}
$arrEvents = array();
// Remove events outside the scope
foreach ($arrAllEvents as $key=>$days)
{
foreach ($days as $day=>$events)
{
// Skip events before the start day if the "shortened view" option is not set.
// Events after the end day are filtered in the Events::addEvent() method (see #8782).
if (!$this->cal_noSpan && $day < $intStart)
{
continue;
}
foreach ($events as $event)
{
// Use repeatEnd if > 0 (see #8447)
if ($event['startTime'] > $intEnd || ($event['repeatEnd'] ?: $event['endTime']) < $intStart)
{
continue;
}
// Hide running events
if ($this->cal_hideRunning && $event['begin'] < $intStart)
{
continue;
}
// Skip occurrences in the past
if ($event['repeatEnd'] && $event['end'] < $intStart)
{
continue;
}
// Hide running non-recurring events (see #30)
if ($this->cal_hideRunning && !$event['recurring'] && $event['startTime'] < time())
{
continue;
}
$event['firstDay'] = $GLOBALS['TL_LANG']['DAYS'][date('w', $day)];
$event['firstDate'] = Date::parse($objPage->dateFormat, $day);
$arrEvents[] = $event;
}
}
}
unset($arrAllEvents);
$total = \count($arrEvents);
$limit = $total;
$offset = 0;
// Overall limit
if ($this->cal_limit > 0)
{
$total = min($this->cal_limit, $total);
$limit = $total;
}
// Pagination
if ($this->perPage > 0)
{
$id = 'page_e' . $this->id;
$page = Input::get($id) ?? 1;
// Do not index or cache the page if the page number is outside the range
if ($page < 1 || $page > max(ceil($total/$this->perPage), 1))
{
throw new PageNotFoundException('Page not found: ' . Environment::get('uri'));
}
$offset = ($page - 1) * $this->perPage;
$limit = min($this->perPage + $offset, $total);
$objPagination = new Pagination($total, $this->perPage, Config::get('maxPaginationLinks'), $id);
$this->Template->pagination = $objPagination->generate("\n ");
}
$strMonth = '';
$strDate = '';
$arrParsedEvents = [];
$dayCount = 0;
$eventCount = 0;
$headerCount = 0;
$uuids = array();
for ($i=$offset; $i<$limit; $i++)
{
if ($arrEvents[$i]['addImage'] && $arrEvents[$i]['singleSRC'])
{
$uuids[] = $arrEvents[$i]['singleSRC'];
}
}
// Preload all images in one query so they are loaded into the model registry
FilesModel::findMultipleByUuids($uuids);
// Parse events
for ($i=$offset; $i<$limit; $i++)
{
//**********************************************************CUSTOM************************//
/** @var Event|null $model */
$model = Event::findByPk($arrEvents[$i]['id']);
if(null !== $model) {
$arrCSS = StringUtil::deserialize($model->cssID, true);
$arrParsedEvents[] = [
'model' => $model,
'class' => trim('event ' . $arrCSS[1]),
'content' => $model->generate($this->getModel())
];
}
//**********************************************************CUSTOM************************//
++$eventCount;
++$headerCount;
}
//**********************************************************CUSTOM************************//
// No events found
if (empty($arrParsedEvents))
{
$this->Template->isEmpty = true;
}
RowClass::withKey('class')->addCount('event_')->addEvenOdd('event_')->addFirstLast('event_')->applyTo($arrParsedEvents);
// See #3672
$this->Template->headline = $this->headline;
$this->Template->events = $arrParsedEvents;
$this->Template->eventCount = $eventCount;
//**********************************************************CUSTOM************************//
// Clear the $_GET array (see #2445)
if ($blnClearInput)
{
Input::setGet('year', null);
Input::setGet('month', null);
Input::setGet('day', null);
}
}
}