978 lines
31 KiB
PHP
978 lines
31 KiB
PHP
<?php
|
|
/**
|
|
* @package JEM
|
|
* @copyright (C) 2013-2024 joomlaeventmanager.net
|
|
* @copyright (C) 2005-2009 Christoph Lukes
|
|
* @license https://www.gnu.org/licenses/gpl-3.0 GNU/GPL
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Factory;
|
|
use Joomla\CMS\Filter\OutputFilter;
|
|
use Joomla\CMS\MVC\Model\ItemModel;
|
|
use Joomla\CMS\Language\Multilanguage;
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\Registry\Registry;
|
|
/**
|
|
* Event-Model
|
|
*/
|
|
class JemModelEvent extends ItemModel
|
|
{
|
|
/**
|
|
* Model context string.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_context = 'com_jem.event';
|
|
|
|
protected $_registers = null;
|
|
|
|
/**
|
|
* Method to auto-populate the model state.
|
|
*
|
|
* Note. Calling getState in this method will result in recursion.
|
|
*/
|
|
protected function populateState()
|
|
{
|
|
$app = Factory::getApplication('site');
|
|
|
|
// Load state from the request.
|
|
$pk = $app->input->getInt('id', 0);
|
|
$this->setState('event.id', $pk);
|
|
|
|
$offset = $app->input->getInt('limitstart', 0);
|
|
$this->setState('list.offset', $offset);
|
|
|
|
// Load the parameters.
|
|
$params = $app->getParams('com_jem');
|
|
$this->setState('params', $params);
|
|
|
|
$this->setState('filter.language', Multilanguage::isEnabled());
|
|
}
|
|
|
|
/**
|
|
* Method to get event data.
|
|
*
|
|
* @param int The id of the event.
|
|
* @return mixed item data object on success, false on failure.
|
|
*/
|
|
public function getItem($pk = null)
|
|
{
|
|
// Initialise variables.
|
|
$pk = (!empty($pk)) ? $pk : (int) $this->getState('event.id');
|
|
|
|
if ($this->_item === null) {
|
|
$this->_item = array();
|
|
}
|
|
|
|
if (!isset($this->_item[$pk]))
|
|
{
|
|
try
|
|
{
|
|
$settings = JemHelper::globalattribs();
|
|
$user = JemFactory::getUser();
|
|
$levels = $user->getAuthorisedViewLevels();
|
|
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
# Event
|
|
$query->select(
|
|
$this->getState('item.select',
|
|
'a.id, a.id AS did, a.title, a.alias, a.dates, a.enddates, a.times, a.endtimes, a.access, a.attribs, a.metadata, ' .
|
|
'a.custom1, a.custom2, a.custom3, a.custom4, a.custom5, a.custom6, a.custom7, a.custom8, a.custom9, a.custom10, ' .
|
|
'a.created, a.created_by, a.published, a.registra, a.registra_from, a.registra_until, a.unregistra, a.unregistra_until, a.reginvitedonly, ' .
|
|
'CASE WHEN a.modified = 0 THEN a.created ELSE a.modified END as modified, a.modified_by, ' .
|
|
'a.checked_out, a.checked_out_time, a.datimage, a.version, a.featured, ' .
|
|
'a.seriesbooking, a.singlebooking, a.meta_keywords, a.meta_description, a.created_by_alias, a.introtext, a.fulltext, a.maxplaces, a.reservedplaces, a.minbookeduser, a.maxbookeduser, a.waitinglist, a.requestanswer, ' .
|
|
'a.hits, a.language, a.recurrence_type, a.recurrence_first_id'));
|
|
$query->from('#__jem_events AS a');
|
|
|
|
# Author
|
|
$name = $settings->get('global_regname','1') ? 'u.name' : 'u.username';
|
|
$query->select($name.' AS author');
|
|
$query->join('LEFT', '#__users AS u on u.id = a.created_by');
|
|
|
|
# Contact
|
|
$query->select('con.id AS conid, con.name AS conname, con.catid AS concatid, con.telephone AS contelephone, con.email_to AS conemail');
|
|
$query->join('LEFT', '#__contact_details AS con ON con.id = a.contactid');
|
|
|
|
# Venue
|
|
$query->select('l.custom1 AS venue1, l.custom2 AS venue2, l.custom3 AS venue3, l.custom4 AS venue4, l.custom5 AS venue5, ' .
|
|
'l.custom6 AS venue6, l.custom7 AS venue7, l.custom8 AS venue8, l.custom9 AS venue9, l.custom10 AS venue10, ' .
|
|
'l.id AS locid, l.alias AS localias, l.venue, l.city, l.state, l.url, l.locdescription, l.locimage, ' .
|
|
'l.postalCode, l.street, l.country, l.map, l.created_by AS venueowner, l.latitude, l.longitude, ' .
|
|
'l.checked_out AS vChecked_out, l.checked_out_time AS vChecked_out_time, l.published as locpublished');
|
|
$query->join('LEFT', '#__jem_venues AS l ON a.locid = l.id');
|
|
|
|
# Join over the category tables
|
|
$query->join('LEFT', '#__jem_cats_event_relations AS rel ON rel.itemid = a.id');
|
|
$query->join('LEFT', '#__jem_categories AS c ON c.id = rel.catid');
|
|
|
|
# Get contact id
|
|
$subQuery = $db->getQuery(true);
|
|
$subQuery->select('MAX(contact.id) AS id');
|
|
$subQuery->from('#__contact_details AS contact');
|
|
$subQuery->where('contact.published = 1');
|
|
$subQuery->where('contact.user_id = a.created_by');
|
|
|
|
# Filter contact by language
|
|
if ($this->getState('filter.language')) {
|
|
$subQuery->where('(contact.language in (' . $db->quote(Factory::getApplication()->getLanguage()->getTag()) . ',' . $db->quote('*') . ') OR contact.language IS NULL)');
|
|
}
|
|
|
|
$query->select('(' . $subQuery . ') as contactid2');
|
|
|
|
# Filter event by language
|
|
/* commented out yet because it's incomplete
|
|
if ($this->getState('filter.language')) {
|
|
$query->where('a.language in (' . $db->quote(Factory::getApplication()->getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
|
|
}
|
|
*/
|
|
|
|
$query->where('a.id = ' . (int) $pk);
|
|
|
|
# Filter by published state ==> later.
|
|
// It would result in too complicated query.
|
|
// It's easier to get data and check then e.g. for event owner etc.
|
|
|
|
# Filter by categories
|
|
$cats = $this->getCategories('all');
|
|
if (!empty($cats)) {
|
|
$query->where('c.id IN (' . implode(',', $cats) . ')');
|
|
}
|
|
|
|
# Get the item
|
|
//$query->group('a.id');
|
|
|
|
// if ($error = $db->getErrorMsg()) {
|
|
// throw new Exception($error);
|
|
// }
|
|
try
|
|
{
|
|
$db->setQuery($query);
|
|
$data = $db->loadObject();
|
|
|
|
}
|
|
catch (RuntimeException $e)
|
|
{
|
|
Factory::getApplication()->enqueueMessage($e->getMessage(), 'notice');
|
|
}
|
|
|
|
if (empty($data)) {
|
|
throw new Exception(Text::_('COM_JEM_EVENT_ERROR_EVENT_NOT_FOUND'), 404);
|
|
}
|
|
|
|
# Convert parameter fields to objects.
|
|
$registry = new Registry;
|
|
$registry->loadString($data->attribs);
|
|
$data->params = JemHelper::globalattribs(); // returns Registry object
|
|
$data->params->merge($registry);
|
|
|
|
$registry = new Registry;
|
|
$registry->loadString($data->metadata);
|
|
$data->metadata = $registry;
|
|
|
|
$data->categories = $this->getCategories($pk);
|
|
|
|
# Compute selected asset permissions.
|
|
$access_edit = $user->can('edit', 'event', $data->id, $data->created_by);
|
|
$access_view = (($data->published == 1) || ($data->published == 2) || // published and archived event
|
|
(($data->published == 0) && $access_edit) || // unpublished for editors,
|
|
$user->can('publish', 'event', $data->id, $data->created_by)); // all for publishers
|
|
|
|
$data->params->set('access-edit', $access_edit);
|
|
|
|
# Compute view access permissions.
|
|
|
|
# event can be shown if
|
|
# - user has matching view access level and
|
|
# - there is at least one category attached user can see and
|
|
# - publishing state and user permissions allow that (e.g. unpublished event but user is editor, owner, or publisher)
|
|
$data->params->set('access-view', $access_view && !empty($data->categories) && in_array($data->access, $levels));
|
|
|
|
$this->_item[$pk] = $data;
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
if ($e->getCode() == 404) {
|
|
// Need to go thru the error handler to allow Redirect to
|
|
// work.
|
|
Factory::getApplication()->enqueueMessage($e->getMessage(), 'error');
|
|
return false;
|
|
}
|
|
else {
|
|
$this->setError($e);
|
|
$this->_item[$pk] = false;
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
# Get event attachments
|
|
$this->_item[$pk]->attachments = JemAttachment::getAttachments('event' . $this->_item[$pk]->did);
|
|
|
|
# Get venue attachments
|
|
$this->_item[$pk]->vattachments = JemAttachment::getAttachments('venue' . $this->_item[$pk]->locid);
|
|
|
|
// Define Booked
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
$query->select('SUM(places)');
|
|
$query->from('#__jem_register');
|
|
$query->where(array('event = ' . $db->quote($this->_item[$pk]->did), 'waiting = 0', 'status = 1'));
|
|
$db->setQuery($query);
|
|
try {
|
|
$res = $db->loadResult();
|
|
}
|
|
catch (Exception $e) {
|
|
$res = 0;
|
|
}
|
|
$this->_item[$pk]->booked = $res;
|
|
|
|
return $this->_item[$pk];
|
|
}
|
|
|
|
|
|
/**
|
|
* Method to get list recurrence events data.
|
|
*
|
|
* @param int The id of the event.
|
|
* @param int The id of the parent event.
|
|
* @return mixed item data object on success, false on failure.
|
|
*/
|
|
public function getListRecurrenceEventsbyId ($id, $pk, $datetimeFrom, $iduser=null, $status=null)
|
|
{
|
|
// Initialise variables.
|
|
$pk = (!empty($pk)) ? $pk : (int) $this->getState('event.id');
|
|
|
|
if ($this->_item === null) {
|
|
$this->_item = array();
|
|
}
|
|
|
|
try
|
|
{
|
|
$settings = JemHelper::globalattribs();
|
|
$user = JemFactory::getUser();
|
|
$levels = $user->getAuthorisedViewLevels();
|
|
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
# Event
|
|
$query->select(
|
|
$this->getState('item.select',
|
|
'a.id, a.id AS did, a.title, a.alias, a.dates, a.enddates, a.times, a.endtimes, a.access, a.attribs, a.metadata, ' .
|
|
'a.custom1, a.custom2, a.custom3, a.custom4, a.custom5, a.custom6, a.custom7, a.custom8, a.custom9, a.custom10, ' .
|
|
'a.created, a.created_by, a.published, a.registra, a.registra_from, a.registra_until, a.unregistra, a.unregistra_until, ' .
|
|
'CASE WHEN a.modified = 0 THEN a.created ELSE a.modified END as modified, a.modified_by, ' .
|
|
'a.checked_out, a.checked_out_time, a.datimage, a.version, a.featured, ' .
|
|
'a.seriesbooking, a.singlebooking, a.meta_keywords, a.meta_description, a.created_by_alias, a.introtext, a.fulltext, a.maxplaces, a.reservedplaces, a.minbookeduser, a.maxbookeduser, a.waitinglist, a.requestanswer, ' .
|
|
'a.hits, a.language, a.recurrence_type, a.recurrence_first_id' . ($iduser? ', r.waiting, r.places, r.status':''))) ;
|
|
$query->from('#__jem_events AS a');
|
|
|
|
# Author
|
|
$name = $settings->get('global_regname','1') ? 'u.name' : 'u.username';
|
|
$query->select($name.' AS author');
|
|
$query->join('LEFT', '#__users AS u on u.id = a.created_by');
|
|
|
|
# Contact
|
|
$query->select('con.id AS conid, con.name AS conname, con.telephone AS contelephone, con.email_to AS conemail');
|
|
$query->join('LEFT', '#__contact_details AS con ON con.id = a.contactid');
|
|
|
|
# Venue
|
|
$query->select('l.custom1 AS venue1, l.custom2 AS venue2, l.custom3 AS venue3, l.custom4 AS venue4, l.custom5 AS venue5, ' .
|
|
'l.custom6 AS venue6, l.custom7 AS venue7, l.custom8 AS venue8, l.custom9 AS venue9, l.custom10 AS venue10, ' .
|
|
'l.id AS locid, l.alias AS localias, l.venue, l.city, l.state, l.url, l.locdescription, l.locimage, ' .
|
|
'l.postalCode, l.street, l.country, l.map, l.created_by AS venueowner, l.latitude, l.longitude, ' .
|
|
'l.checked_out AS vChecked_out, l.checked_out_time AS vChecked_out_time, l.published as locpublished');
|
|
$query->join('LEFT', '#__jem_venues AS l ON a.locid = l.id');
|
|
|
|
# Join over the category tables
|
|
$query->join('LEFT', '#__jem_cats_event_relations AS rel ON rel.itemid = a.id');
|
|
$query->join('LEFT', '#__jem_categories AS c ON c.id = rel.catid');
|
|
|
|
# Get contact id
|
|
$subQuery = $db->getQuery(true);
|
|
$subQuery->select('MAX(contact.id) AS id');
|
|
$subQuery->from('#__contact_details AS contact');
|
|
$subQuery->where('contact.published = 1');
|
|
$subQuery->where('contact.user_id = a.created_by');
|
|
|
|
# Filter contact by language
|
|
if ($this->getState('filter.language')) {
|
|
$subQuery->where('(contact.language in (' . $db->quote(Factory::getApplication()->getLanguage()->getTag()) . ',' . $db->quote('*') . ') OR contact.language IS NULL)');
|
|
}
|
|
|
|
# If $iduser is defined, then the events list is filtered by registration of this user
|
|
if($iduser) {
|
|
$query->join('LEFT', '#__jem_register AS r ON r.event = a.id');
|
|
$query->where("r.uid = " . $iduser );
|
|
}
|
|
|
|
// Not include the delete event
|
|
$query->where("a.published != -2");
|
|
|
|
$query->select('(' . $subQuery . ') as contactid2');
|
|
|
|
$dateFrom = date('Y-m-d', $datetimeFrom);
|
|
$timeFrom = date('H:i:s', $datetimeFrom);
|
|
$query->where('((a.recurrence_first_id = 0 AND a.id = ' . (int)($pk?$pk:$id) . ') OR a.recurrence_first_id = ' . (int)($pk?$pk:$id) . ')');
|
|
$query->where("(a.dates > '" . $dateFrom . "' OR a.dates = '" . $dateFrom . "' AND dates >= '" . $timeFrom . "')");
|
|
$query->order('a.dates ASC');
|
|
|
|
try
|
|
{
|
|
$db->setQuery($query);
|
|
$data = $db->loadObjectList();
|
|
|
|
}
|
|
catch (RuntimeException $e)
|
|
{
|
|
Factory::getApplication()->enqueueMessage($e->getMessage(), 'notice');
|
|
}
|
|
|
|
if (empty($data)) {
|
|
if(!$iduser) {
|
|
throw new Exception(Text::_('COM_JEM_EVENT_ERROR_EVENT_NOT_FOUND'), 404);
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
# Convert parameter fields to objects.
|
|
$registry = new Registry;
|
|
$registry->loadString($data[0]->attribs);
|
|
$data[0]->params = JemHelper::globalattribs(); // returns Registry object
|
|
$data[0]->params->merge($registry);
|
|
|
|
$registry = new Registry;
|
|
$registry->loadString($data[0]->metadata);
|
|
$data[0]->metadata = $registry;
|
|
|
|
$data[0]->categories = $this->getCategories($pk);
|
|
|
|
# Compute selected asset permissions.
|
|
$access_edit = $user->can('edit', 'event', $data[0]->id, $data[0]->created_by);
|
|
$access_view = (($data[0]->published == 1) || ($data[0]->published == 2) || // published and archived event
|
|
(($data[0]->published == 0) && $access_edit) || // unpublished for editors,
|
|
$user->can('publish', 'event', $data[0]->id, $data[0]->created_by)); // all for publishers
|
|
|
|
$data[0]->params->set('access-edit', $access_edit);
|
|
|
|
# Compute view access permissions.
|
|
|
|
# event can be shown if
|
|
# - user has matching view access level and
|
|
# - there is at least one category attached user can see and
|
|
# - publishing state and user permissions allow that (e.g. unpublished event but user is editor, owner, or publisher)
|
|
$data[0]->params->set('access-view', $access_view && !empty($data[0]->categories) && in_array($data[0]->access, $levels));
|
|
|
|
$this->_item[$pk] = $data[0];
|
|
}
|
|
catch (Exception $e)
|
|
{
|
|
if ($e->getCode() == 404) {
|
|
// Need to go thru the error handler to allow Redirect to
|
|
// work.
|
|
Factory::getApplication()->enqueueMessage($e->getMessage(), 'error');
|
|
return false;
|
|
}
|
|
else {
|
|
$this->setError($e);
|
|
$this->_item[$pk] = false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
# Get event attachments
|
|
$this->_item[$pk]->attachments = JemAttachment::getAttachments('event' . $this->_item[$pk]->did);
|
|
|
|
# Get venue attachments
|
|
$this->_item[$pk]->vattachments = JemAttachment::getAttachments('venue' . $this->_item[$pk]->locid);
|
|
|
|
// Define Booked
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
$query->select('SUM(places)');
|
|
$query->from('#__jem_register');
|
|
$query->where(array('event = ' . $db->quote($this->_item[$id]->did), 'waiting = 0', 'status = 1'));
|
|
$db->setQuery($query);
|
|
try {
|
|
$res = $db->loadObject();
|
|
}
|
|
catch (Exception $e) {
|
|
$res = 0;
|
|
}
|
|
$this->_item[$id]->booked = $res;
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Increment the hit counter for the event.
|
|
*
|
|
* @param int Optional primary key of the event to increment.
|
|
* @return boolean if successful; false otherwise and internal error set.
|
|
*/
|
|
public function hit($pk = 0)
|
|
{
|
|
$hitcount = Factory::getApplication()->input->getInt('hitcount', 1);
|
|
|
|
if ($hitcount) {
|
|
// Initialise variables.
|
|
$pk = (!empty($pk)) ? $pk : (int) $this->getState('event.id');
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
|
|
$db->setQuery('UPDATE #__jem_events' . ' SET hits = hits + 1' . ' WHERE id = ' . (int) $pk);
|
|
|
|
try {
|
|
if ($db->execute() === false) {
|
|
$this->setError($db->getErrorMsg());
|
|
return false;
|
|
}
|
|
}
|
|
catch (Exception $e) {
|
|
$this->setError($e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Retrieve Categories
|
|
*
|
|
* Due to multi-cat this function is needed
|
|
* filter-index (4) is pointing to the cats
|
|
*/
|
|
public function getCategories($id = 0)
|
|
{
|
|
$id = (!empty($id)) ? $id : (int) $this->getState('event.id');
|
|
|
|
$user = JemFactory::getUser();
|
|
// $userid = (int)$user->get('id');
|
|
$levels = $user->getAuthorisedViewLevels();
|
|
// $app = Factory::getApplication();
|
|
// $params = $app->getParams();
|
|
// $catswitch = $params->get('categoryswitch', '0');
|
|
$settings = JemHelper::globalattribs();
|
|
|
|
// Query
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
|
|
$case_when_c = ' CASE WHEN ';
|
|
$case_when_c .= $query->charLength('c.alias');
|
|
$case_when_c .= ' THEN ';
|
|
$id_c = $query->castAsChar('c.id');
|
|
$case_when_c .= $query->concatenate(array($id_c, 'c.alias'), ':');
|
|
$case_when_c .= ' ELSE ';
|
|
$case_when_c .= $id_c.' END as catslug';
|
|
|
|
$query->select(array('DISTINCT c.id','c.catname','c.access','c.checked_out AS cchecked_out','c.color',$case_when_c,'c.groupid'));
|
|
$query->from('#__jem_categories as c');
|
|
$query->join('LEFT', '#__jem_cats_event_relations AS rel ON rel.catid = c.id');
|
|
|
|
$query->select(array('a.id AS multi'));
|
|
$query->join('LEFT','#__jem_events AS a ON a.id = rel.itemid');
|
|
|
|
if ($id != 'all'){
|
|
$query->where('rel.itemid ='.(int)$id);
|
|
}
|
|
|
|
$query->where('c.published = 1');
|
|
|
|
###################################
|
|
## FILTER - MAINTAINER/JEM GROUP ##
|
|
###################################
|
|
|
|
# as maintainter someone who is registered can see a category that has special rights
|
|
# let's see if the user has access to this category.
|
|
|
|
// $query3 = $db->getQuery(true);
|
|
// $query3 = 'SELECT gr.id'
|
|
// . ' FROM #__jem_groups AS gr'
|
|
// . ' LEFT JOIN #__jem_groupmembers AS g ON g.group_id = gr.id'
|
|
// . ' WHERE g.member = ' . (int) $user->get('id')
|
|
// //. ' AND ' .$db->quoteName('gr.addevent') . ' = 1 '
|
|
// . ' AND g.member NOT LIKE 0';
|
|
// $db->setQuery($query3);
|
|
// $groupnumber = $db->loadColumn();
|
|
|
|
$groups = implode(',', $levels);
|
|
// $jemgroups = implode(',',$groupnumber);
|
|
|
|
// if ($jemgroups) {
|
|
// $query->where('(c.access IN ('.$groups.') OR c.groupid IN ('.$jemgroups.'))');
|
|
// } else {
|
|
$query->where('(c.access IN ('.$groups.'))');
|
|
// }
|
|
|
|
#######################
|
|
## FILTER - CATEGORY ##
|
|
#######################
|
|
|
|
# set filter for top_category
|
|
$top_cat = $this->getState('filter.category_top');
|
|
|
|
if ($top_cat) {
|
|
$query->where($top_cat);
|
|
}
|
|
|
|
# filter set by day-view
|
|
$requestCategoryId = (int)$this->getState('filter.req_catid');
|
|
|
|
if ($requestCategoryId) {
|
|
$query->where('c.id = '.$requestCategoryId);
|
|
}
|
|
|
|
# Filter by a single or group of categories.
|
|
$categoryId = $this->getState('filter.category_id');
|
|
|
|
if (is_numeric($categoryId)) {
|
|
$type = $this->getState('filter.category_id.include', true) ? '= ' : '<> ';
|
|
$query->where('c.id '.$type.(int) $categoryId);
|
|
}
|
|
elseif (is_array($categoryId) && count($categoryId)) {
|
|
\Joomla\Utilities\ArrayHelper::toInteger($categoryId);
|
|
$categoryId = implode(',', $categoryId);
|
|
$type = $this->getState('filter.category_id.include', true) ? 'IN' : 'NOT IN';
|
|
$query->where('c.id '.$type.' ('.$categoryId.')');
|
|
}
|
|
|
|
###################
|
|
## FILTER-SEARCH ##
|
|
###################
|
|
|
|
# define variables
|
|
$filter = $this->getState('filter.filter_type');
|
|
$search = $this->getState('filter.filter_search'); // not escaped
|
|
|
|
if (!empty($search)) {
|
|
if (stripos($search, 'id:') === 0) {
|
|
$query->where('c.id = '.(int) substr($search, 3));
|
|
} else {
|
|
$search = $db->Quote('%'.$db->escape($search, true).'%', false); // escape once
|
|
|
|
if($search && $settings->get('global_show_filter')) {
|
|
if ($filter == 4) {
|
|
$query->where('c.catname LIKE '.$search);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$db->setQuery($query);
|
|
|
|
try {
|
|
if ($id == 'all'){
|
|
$cats = $db->loadColumn(0);
|
|
$cats = array_unique($cats);
|
|
} else {
|
|
$cats = $db->loadObjectList();
|
|
}
|
|
}
|
|
catch (Exception $e) {
|
|
$cats = false;
|
|
}
|
|
|
|
return $cats;
|
|
}
|
|
|
|
/**
|
|
* Method to get user registration data if available.
|
|
*
|
|
* @access public
|
|
* @return mixed false if not registered, object with id, status, comment else
|
|
* status -1 if not attending, 0 if invited,
|
|
* 1 if attending, 2 if on waiting list
|
|
*/
|
|
public function getUserRegistration($eventId = null, $userid = 0)
|
|
{
|
|
// Initialize variables
|
|
$userid = (int)$userid;
|
|
if (empty($userid)) {
|
|
$user = JemFactory::getUser();
|
|
$userid = (int) $user->get('id', 0);
|
|
}
|
|
|
|
$eventId = (int)$eventId;
|
|
if (empty($eventId)) {
|
|
$eventId = $this->getState('event.id');
|
|
}
|
|
|
|
// usercheck
|
|
// -1 if user will not attend, 0 if invened/unknown, 1 if registeredm 2 if on waiting list
|
|
$query = 'SELECT IF (status > 0, waiting + 1, status) AS status, id, comment, places'
|
|
. ' FROM #__jem_register'
|
|
. ' WHERE uid = ' . $this->_db->quote($userid)
|
|
. ' AND event = ' . $this->_db->quote($eventId);
|
|
$this->_db->setQuery($query);
|
|
|
|
try {
|
|
$result = $this->_db->loadObject();
|
|
}
|
|
catch (Exception $e) {
|
|
$result = false;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Method to check if the user is already registered
|
|
*
|
|
* @access public
|
|
* @return mixed false if not registered, -1 if not attending,
|
|
* 0 if invited, 1 if attending, 2 if on waiting list
|
|
*/
|
|
public function getUserIsRegistered($eventId = null)
|
|
{
|
|
$obj = $this->getUserRegistration($eventId);
|
|
if (is_object($obj) && isset($obj->status)) {
|
|
return $obj->status;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Method to get the registered users
|
|
*
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function getRegisters($event = false, $status = 1)
|
|
{
|
|
if (empty($event)) {
|
|
return false;
|
|
}
|
|
|
|
// avatars should be displayed
|
|
$settings = JemHelper::globalattribs();
|
|
$user = JemFactory::getUser();
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
|
|
$avatar = '';
|
|
$join = '';
|
|
|
|
if ($settings->get('event_comunoption','0') == 1 && $settings->get('event_comunsolution','0') == 1) {
|
|
$avatar = ', c.avatar';
|
|
$join = ' LEFT JOIN #__comprofiler as c ON c.user_id = r.uid';
|
|
}
|
|
|
|
$name = ', ' . ($settings->get('global_regname','1') ? 'u.name' : 'u.username') . ' as name';
|
|
|
|
$where[] = 'event = '. $db->quote($event);
|
|
if (is_numeric($status)) {
|
|
if ($status == 2) {
|
|
$where[] = 'waiting = 1';
|
|
$where[] = 'status = 1';
|
|
} else {
|
|
$where[] = 'waiting = 0';
|
|
$where[] = 'status = ' . (int)$status;
|
|
}
|
|
} elseif ($status !== 'all') {
|
|
$where[] = 'waiting = 0';
|
|
$where[] = 'status = 1';
|
|
}
|
|
|
|
// Get registered users
|
|
$query = $db->getQuery(true);
|
|
$query = 'SELECT IF(r.status = 1 AND r.waiting = 1, 2, r.status) as status, r.uid, r.comment, r.places'
|
|
. $name . $avatar
|
|
. ' FROM #__jem_register AS r'
|
|
. ' LEFT JOIN #__users AS u ON u.id = r.uid'
|
|
. $join
|
|
. ' WHERE ' . implode(' AND ', $where);
|
|
$db->setQuery($query);
|
|
|
|
try {
|
|
$registered = $db->loadObjectList();
|
|
}
|
|
catch (Exception $e) {
|
|
$registered = false;
|
|
}
|
|
|
|
return $registered;
|
|
}
|
|
|
|
public function setId($id)
|
|
{
|
|
// Set new event ID and wipe data
|
|
$this->_registerid = $id;
|
|
}
|
|
|
|
/**
|
|
* Internal helper to store registration on database
|
|
*
|
|
* @param int $eventId id of event
|
|
* @param int $uid id of user to register
|
|
* @param mixed $uip ip address or false
|
|
* @param int $status registration status
|
|
* @param int $places number to add/cancel places of registration
|
|
* @param string $comment optional comment
|
|
* @param string &$errMsg gets a message in error cases
|
|
* @param int $regid id of registration record to change or 0 if new (default)
|
|
* @param bool $respectPlaces if true adapt status/waiting depending on event's free places,
|
|
* may return error if no free places and no waiting list
|
|
*
|
|
* @access protected
|
|
* @return int register id on success, else false
|
|
*/
|
|
protected function _doRegister($eventId, $uid, $uip, $status, $places, $comment, &$errMsg, $regid = 0, $respectPlaces = true)
|
|
{
|
|
// $app = Factory::getApplication('site');
|
|
// $user = JemFactory::getUser();
|
|
// $jemsettings = JemHelper::config();
|
|
$registration = (empty($uid) || empty($eventId)) ? false : $this->getUserRegistration($eventId, $uid);
|
|
$onwaiting = 0;
|
|
|
|
try {
|
|
$event = $this->getItem($eventId);
|
|
}
|
|
// some gently error handling
|
|
catch (Exception $e) {
|
|
$event = false;
|
|
}
|
|
|
|
if (empty($event)) {
|
|
$errMsg = Text::_('COM_JEM_EVENT_ERROR_EVENT_NOT_FOUND');
|
|
return false;
|
|
}
|
|
|
|
$oldstat = is_object($registration) ? $registration->status : 0;
|
|
if ($status == 1 && $status != $oldstat) {
|
|
if ($respectPlaces && ($event->maxplaces > 0)) { // there is a max
|
|
// check if the user should go on waiting list
|
|
if ($event->booked >= $event->maxplaces) {
|
|
if (!$event->waitinglist) {
|
|
$this->setError(Text::_('COM_JEM_EVENT_FULL_NOTICE'));
|
|
return false;
|
|
}
|
|
$onwaiting = 1;
|
|
}
|
|
}
|
|
}
|
|
elseif ($status == 2) {
|
|
if ($respectPlaces && !$event->waitinglist) {
|
|
$errMsg = Text::_('COM_JEM_NO_WAITINGLIST');
|
|
return false;
|
|
}
|
|
$onwaiting = 1;
|
|
$status = 1;
|
|
}
|
|
elseif ($respectPlaces && ($oldstat == 1) && ($status == -1) && !$event->unregistra) {
|
|
$errMsg = Text::_('COM_JEM_ERROR_ANNULATION_NOT_ALLOWED');
|
|
return false;
|
|
}
|
|
|
|
$obj = new stdClass();
|
|
$obj->event = (int)$eventId;
|
|
$obj->status = (int)$status;
|
|
$obj->places = (int)$places;
|
|
$obj->waiting = $onwaiting;
|
|
$obj->uid = (int)$uid;
|
|
$obj->uregdate = gmdate('Y-m-d H:i:s');
|
|
$obj->uip = $uip;
|
|
$obj->comment = $comment;
|
|
|
|
$result = false;
|
|
try {
|
|
if ($regid) {
|
|
$obj->id = $regid;
|
|
$this->_db->updateObject('#__jem_register', $obj, 'id');
|
|
$result = $regid;
|
|
} else {
|
|
$this->_db->insertObject('#__jem_register', $obj);
|
|
$result = $this->_db->insertid();
|
|
}
|
|
}
|
|
catch (Exception $e) {
|
|
// we have a unique user-event key so registering twice will fail
|
|
$errMsg = Text::_(($e->getCode() == 1062) ? 'COM_JEM_ALREADY_REGISTERED' : 'COM_JEM_ERROR_REGISTRATION');
|
|
return false;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Saves the registration to the database
|
|
*
|
|
* @access public
|
|
* @return int register id on success, else false
|
|
*/
|
|
public function userregister()
|
|
{
|
|
$app = Factory::getApplication('site');
|
|
$user = JemFactory::getUser();
|
|
$jemsettings = JemHelper::config();
|
|
|
|
$status = $app->input->getInt('reg_check', 0);
|
|
// $noreg = ($status == -1) ? 'on' : 'off';//$app->input->getString('noreg_check', 'off');
|
|
$comment = $app->input->getString('reg_comment', '');
|
|
$comment = OutputFilter::cleanText($comment);
|
|
$regid = $app->input->getInt('regid', 0);
|
|
$addplaces = $app->input->getInt('addplaces', 0);
|
|
$cancelplaces = $app->input->getInt('cancelplaces', 0);
|
|
$checkseries = $app->input->getString('reg_check_series', '0');
|
|
$checkseries = ($checkseries === 'true' || $checkseries === 'on' || $checkseries === '1');
|
|
$uid = (int) $user->get('id');
|
|
$eventId = (int) $this->_registerid;
|
|
$events = array();
|
|
try {
|
|
$event = $this->getItem($eventId);
|
|
}
|
|
catch (Exception $e) {
|
|
$event = false;
|
|
}
|
|
|
|
// If event has 'seriesbooking' active and $checkseries is true then get all recurrence events of series from now (register or unregister)
|
|
if($event->recurrence_type){
|
|
|
|
if(($event->seriesbooking && !$event->singlebooking) || ($event->singlebooking && $checkseries)) {
|
|
$events = $this->getListRecurrenceEventsbyId($event->id, $event->recurrence_first_id, time());
|
|
}
|
|
}
|
|
|
|
if (!isset($events) || !count ($events)){
|
|
$events [] = clone $event;
|
|
}
|
|
|
|
foreach ($events as $e) {
|
|
$reg = $this->getUserRegistration($e->id);
|
|
$errMsg = '';
|
|
|
|
|
|
if ($status > 0) {
|
|
if ($addplaces > 0) {
|
|
if ($reg) {
|
|
if ($reg->status > 0) {
|
|
$places = $addplaces + $reg->places;
|
|
} else {
|
|
$places = $addplaces;
|
|
}
|
|
} else {
|
|
$places = $addplaces;
|
|
}
|
|
//Detect if the reserve go to waiting list
|
|
$placesavailableevent = $e->maxplaces - $e->reservedplaces - $e->booked;
|
|
if ($reg->status != 0 || $reg == null) {
|
|
if ($e->maxplaces) {
|
|
$placesavailableevent = $e->maxplaces - $e->reservedplaces - $e->booked;
|
|
if ($e->waitinglist && $placesavailableevent <= 0) {
|
|
$status = 2;
|
|
}
|
|
} else {
|
|
$status = 1;
|
|
}
|
|
}
|
|
} else {
|
|
$places = 0;
|
|
}
|
|
} else {
|
|
if ($reg) {
|
|
$places = $reg->places - $cancelplaces;
|
|
if ($reg->status >= 0 && $places > 0) {
|
|
$status = $reg->status;
|
|
}
|
|
} else {
|
|
$places = 0;
|
|
}
|
|
}
|
|
|
|
//Review max places per user
|
|
if ($e->maxbookeduser) {
|
|
if ($places > $e->maxbookeduser) {
|
|
$places = $e->maxbookeduser;
|
|
}
|
|
}
|
|
|
|
// Must be logged in
|
|
if ($uid < 1) {
|
|
Factory::getApplication()->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR'), 'error');
|
|
return;
|
|
}
|
|
|
|
// IP
|
|
$uip = $jemsettings->storeip ? JemHelper::retrieveIP() : false;
|
|
|
|
$result = $this->_doRegister($e->id, $uid, $uip, $status, $places, $comment, $errMsg, $reg->id);
|
|
if (!$result) {
|
|
$this->setError(Text::_('COM_JEM_ERROR_REGISTRATION') . ' [id: ' . $e->id . ']');
|
|
} else {
|
|
Factory::getApplication()->enqueueMessage(($status==1? Text::_('COM_JEM_REGISTERED_USER_IN_EVENT') : Text::_('COM_JEM_UNREGISTERED_USER_IN_EVENT')), 'info');
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Saves the registration to the database
|
|
*
|
|
* @param int $eventId id of event
|
|
* @param int $uid id of user to register
|
|
* @param int $status registration status
|
|
* @param string $comment optional comment
|
|
* @param string &$errMsg gets a message in error cases
|
|
* @param int $regid id of registration record to change or 0 if new (default)
|
|
* @param bool $respectPlaces if true adapt status/waiting depending on event's free places,
|
|
* may return error if no free places and no waiting list
|
|
*
|
|
* @access public
|
|
* @return int register id on success, else false
|
|
*/
|
|
public function adduser($eventId, $uid, $status, $places, $comment, &$errMsg, $regid = 0, $respectPlaces = true)
|
|
{
|
|
// $app = Factory::getApplication('site');
|
|
$user = JemFactory::getUser();
|
|
$jemsettings = JemHelper::config();
|
|
|
|
// Acting user must be logged in
|
|
if ($user->get('id') < 1) {
|
|
\Joomla\CMS\Factory::getApplication()->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR'), 'error');
|
|
return false;
|
|
}
|
|
|
|
// IP
|
|
$uip = $jemsettings->storeip ? JemHelper::retrieveIP() : false;
|
|
|
|
$result = $this->_doRegister($eventId, $uid, $uip, $status, $places, $comment, $errMsg, $regid, $respectPlaces);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Deletes a registered user
|
|
*
|
|
* @access public
|
|
* @return true on success
|
|
*/
|
|
public function delreguser()
|
|
{
|
|
$user = JemFactory::getUser();
|
|
$userid = (int)$user->get('id');
|
|
$event = (int)$this->_registerid;
|
|
|
|
// Must be logged in
|
|
if ($userid < 1) {
|
|
Factory::getApplication()->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR'), 'error');
|
|
return;
|
|
}
|
|
|
|
$query = 'DELETE FROM #__jem_register WHERE event = ' . $event . ' AND uid= ' . $userid;
|
|
$this->_db->SetQuery($query);
|
|
|
|
if ($this->_db->execute() === false) {
|
|
throw new Exception($this->_db->getErrorMsg(), 500);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
?>
|