560 lines
15 KiB
PHP
560 lines
15 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\Pagination\Pagination;
|
|
use Joomla\CMS\Filter\InputFilter;
|
|
use Joomla\Registry\Registry;
|
|
use Joomla\Utilities\ArrayHelper;
|
|
|
|
// Base this model on the backend version.
|
|
require_once JPATH_ADMINISTRATOR . '/components/com_jem/models/event.php';
|
|
|
|
/**
|
|
* Editevent Model
|
|
*/
|
|
class JemModelEditevent extends JemModelEvent
|
|
{
|
|
/**
|
|
* Method to auto-populate the model state.
|
|
*
|
|
* Note. Calling getState in this method will result in recursion.
|
|
*/
|
|
protected function populateState()
|
|
{
|
|
$app = Factory::getApplication();
|
|
|
|
// Load state from the request.
|
|
$pk = $app->input->getInt('a_id', 0);
|
|
$this->setState('event.id', $pk);
|
|
|
|
$fromId = $app->input->getInt('from_id', 0);
|
|
$this->setState('event.from_id', $fromId);
|
|
|
|
$catid = $app->input->getInt('catid', 0);
|
|
$this->setState('event.catid', $catid);
|
|
|
|
$locid = $app->input->getInt('locid', 0);
|
|
$this->setState('event.locid', $locid);
|
|
|
|
$date = $app->input->getCmd('date', '');
|
|
$this->setState('event.date', $date);
|
|
|
|
$return = $app->input->get('return', '', 'base64');
|
|
$this->setState('return_page', base64_decode($return));
|
|
|
|
// Load the parameters.
|
|
$params = $app->getParams();
|
|
$this->setState('params', $params);
|
|
|
|
$this->setState('layout', $app->input->getCmd('layout', ''));
|
|
}
|
|
|
|
/**
|
|
* Method to get event data.
|
|
*
|
|
* @param integer The id of the event.
|
|
*
|
|
* @return mixed item data object on success, false on failure.
|
|
*/
|
|
public function getItem($itemId = null)
|
|
{
|
|
$jemsettings = JemHelper::config();
|
|
|
|
// Initialise variables.
|
|
$itemId = (int) (!empty($itemId)) ? $itemId : $this->getState('event.id');
|
|
|
|
$doCopy = false;
|
|
if (!$itemId && $this->getState('event.from_id')) {
|
|
$itemId = $this->getState('event.from_id');
|
|
$doCopy = true;
|
|
}
|
|
|
|
// Get a row instance.
|
|
$table = $this->getTable();
|
|
|
|
// Attempt to load the row.
|
|
$return = $table->load($itemId);
|
|
|
|
// Check for a table object error.
|
|
if ($return === false && $table->getError()) {
|
|
$this->setError($table->getError());
|
|
return false;
|
|
}
|
|
|
|
$properties = $table->getProperties(1);
|
|
$value = ArrayHelper::toObject($properties, 'stdClass');
|
|
|
|
if ($doCopy) {
|
|
$value->id = 0;
|
|
$value->author_ip = '';
|
|
$value->created = '';
|
|
$value->created_by = '';
|
|
$value->created_by_alias = '';
|
|
$value->modified = '';
|
|
$value->modified_by = '';
|
|
$value->version = '';
|
|
$value->hits = '';
|
|
$value->recurrence_type = 0;
|
|
$value->recurrence_first_id = 0;
|
|
$value->recurrence_counter = 0;
|
|
}
|
|
|
|
// Backup current recurrence values
|
|
if ($value->id) {
|
|
$value->recurr_bak = new stdClass;
|
|
foreach (get_object_vars($value) as $k => $v) {
|
|
if (strncmp('recurrence_', $k, 11) === 0) {
|
|
$value->recurr_bak->$k = $v;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Convert attrib field to Registry.
|
|
$registry = new Registry();
|
|
$registry->loadString($value->attribs ?? '{}');
|
|
|
|
$globalregistry = JemHelper::globalattribs();
|
|
|
|
$value->params = clone $globalregistry;
|
|
$value->params->merge($registry);
|
|
|
|
// Compute selected asset permissions.
|
|
$user = JemFactory::getUser();
|
|
//$userId = $user->get('id');
|
|
//$asset = 'com_jem.event.' . $value->id;
|
|
//$asset = 'com_jem';
|
|
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('count(id)'));
|
|
$query->from('#__jem_register');
|
|
$query->where(array('event = ' . $db->quote($value->id), 'waiting = 0', 'status = 1'));
|
|
|
|
$db->setQuery($query);
|
|
$res = $db->loadResult();
|
|
$value->booked = (int)$res;
|
|
if (!empty($value->maxplaces)) {
|
|
$value->avplaces = $value->maxplaces - $value->booked;
|
|
}
|
|
|
|
// Get attachments - but not on copied events
|
|
$files = JemAttachment::getAttachments('event' . $value->id);
|
|
$value->attachments = $files;
|
|
|
|
// Preset values on new events
|
|
if (!$itemId) {
|
|
$catid = (int) $this->getState('event.catid');
|
|
$locid = (int) $this->getState('event.locid');
|
|
$date = $this->getState('event.date');
|
|
|
|
// ???
|
|
if (empty($value->catid) && !empty($catid)) {
|
|
$value->catid = $catid;
|
|
}
|
|
|
|
if (empty($value->locid) && !empty($locid)) {
|
|
$value->locid = $locid;
|
|
}
|
|
|
|
if (empty($value->dates) && JemHelper::isValidDate($date)) {
|
|
$value->dates = $date;
|
|
}
|
|
}
|
|
|
|
// Check edit permission.
|
|
$value->params->set('access-edit', $user->can('edit', 'event', $value->id, $value->created_by));
|
|
|
|
// Check edit state permission.
|
|
if (!$itemId && ($catId = (int) $this->getState('event.catid'))) {
|
|
// New item.
|
|
$cats = array($catId);
|
|
} else {
|
|
// Existing item (or no category)
|
|
$cats = false;
|
|
}
|
|
$value->params->set('access-change', $user->can('publish', 'event', $value->id, $value->created_by, $cats));
|
|
|
|
$value->author_ip = $jemsettings->storeip ? JemHelper::retrieveIP() : false;
|
|
|
|
$value->articletext = $value->introtext;
|
|
if (!empty($value->fulltext)) {
|
|
$value->articletext .= '<hr id="system-readmore" />' . $value->fulltext;
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
|
|
protected function loadForm($name, $source = null, $options = array(), $clear = false, $xpath = false)
|
|
{
|
|
// JForm::addFieldPath(JPATH_COMPONENT_ADMINISTRATOR . '/models/fields');
|
|
|
|
return parent::loadForm($name, $source, $options, $clear, $xpath);
|
|
}
|
|
|
|
/**
|
|
* Get the return URL.
|
|
*
|
|
* @return string return URL.
|
|
*/
|
|
public function getReturnPage()
|
|
{
|
|
return base64_encode($this->getState('return_page'));
|
|
}
|
|
|
|
############
|
|
## VENUES ##
|
|
############
|
|
|
|
/**
|
|
* Get venues-data
|
|
*/
|
|
public function getVenues()
|
|
{
|
|
$query = $this->buildQueryVenues();
|
|
$pagination = $this->getVenuesPagination();
|
|
|
|
$rows = $this->_getList($query, $pagination->limitstart, $pagination->limit);
|
|
|
|
return $rows;
|
|
}
|
|
|
|
/**
|
|
* venues-query
|
|
*/
|
|
protected function buildQueryVenues()
|
|
{
|
|
$app = Factory::getApplication();
|
|
$params = JemHelper::globalattribs();
|
|
|
|
$filter_order = $app->getUserStateFromRequest('com_jem.selectvenue.filter_order', 'filter_order', 'l.venue', 'cmd');
|
|
$filter_order_Dir = $app->getUserStateFromRequest('com_jem.selectvenue.filter_order_Dir', 'filter_order_Dir', 'ASC', 'word');
|
|
|
|
$filter_order = InputFilter::getinstance()->clean($filter_order, 'cmd');
|
|
$filter_order_Dir = InputFilter::getinstance()->clean($filter_order_Dir, 'word');
|
|
|
|
$filter_type = $app->getUserStateFromRequest('com_jem.selectvenue.filter_type', 'filter_type', 0, 'int');
|
|
$search = $app->getUserStateFromRequest('com_jem.selectvenue.filter_search', 'filter_search', '', 'string');
|
|
$search = $this->_db->escape(trim(\Joomla\String\StringHelper::strtolower($search)));
|
|
|
|
// Query
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('l.id','l.state','l.city','l.country','l.published','l.venue','l.ordering'));
|
|
$query->from('#__jem_venues as l');
|
|
|
|
// where
|
|
$where = array();
|
|
$where[] = 'l.published = 1';
|
|
|
|
/* something to search for? (we like to search for "0" too) */
|
|
if ($search || ($search === "0")) {
|
|
switch ($filter_type) {
|
|
case 1: /* Search venues */
|
|
$where[] = 'LOWER(l.venue) LIKE "%' . $search . '%"';
|
|
break;
|
|
case 2: // Search city
|
|
$where[] = 'LOWER(l.city) LIKE "%' . $search . '%"';
|
|
break;
|
|
case 3: // Search state
|
|
$where[] = 'LOWER(l.state) LIKE "%' . $search . '%"';
|
|
}
|
|
}
|
|
|
|
if ($params->get('global_show_ownedvenuesonly')) {
|
|
$user = JemFactory::getUser();
|
|
$userid = $user->get('id');
|
|
$where[] = ' created_by = ' . (int) $userid;
|
|
}
|
|
|
|
$query->where($where);
|
|
|
|
if (strtoupper($filter_order_Dir) !== 'DESC') {
|
|
$filter_order_Dir = 'ASC';
|
|
}
|
|
|
|
// ordering
|
|
if ($filter_order && $filter_order_Dir) {
|
|
$orderby = $filter_order . ' ' . $filter_order_Dir;
|
|
} else {
|
|
$orderby = array('l.venue ASC','l.ordering ASC');
|
|
}
|
|
$query->order($orderby);
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* venues-Pagination
|
|
**/
|
|
public function getVenuesPagination()
|
|
{
|
|
$jemsettings = JemHelper::config();
|
|
$app = Factory::getApplication();
|
|
$limit = $app->getUserStateFromRequest('com_jem.selectvenue.limit', 'limit', $jemsettings->display_num, 'int');
|
|
$limitstart = $app->input->getInt('limitstart', 0);
|
|
// correct start value if required
|
|
$limitstart = $limit ? (int)(floor($limitstart / $limit) * $limit) : 0;
|
|
|
|
$query = $this->buildQueryVenues();
|
|
$total = $this->_getListCount($query);
|
|
|
|
// Create the pagination object
|
|
$pagination = new Pagination($total, $limitstart, $limit);
|
|
|
|
return $pagination;
|
|
}
|
|
|
|
##############
|
|
## CONTACTS ##
|
|
##############
|
|
|
|
/**
|
|
* Get contacts-data
|
|
*/
|
|
public function getContacts()
|
|
{
|
|
$query = $this->buildQueryContacts();
|
|
$pagination = $this->getContactsPagination();
|
|
|
|
$rows = $this->_getList($query, $pagination->limitstart, $pagination->limit);
|
|
|
|
return $rows;
|
|
}
|
|
|
|
/**
|
|
* contacts-Pagination
|
|
**/
|
|
public function getContactsPagination()
|
|
{
|
|
$jemsettings = JemHelper::config();
|
|
$app = Factory::getApplication();
|
|
$limit = $app->getUserStateFromRequest('com_jem.selectcontact.limit', 'limit', $jemsettings->display_num, 'int');
|
|
$limitstart = $app->input->getInt('limitstart', 0);
|
|
// correct start value if required
|
|
$limitstart = $limit ? (int)(floor($limitstart / $limit) * $limit) : 0;
|
|
|
|
$query = $this->buildQueryContacts();
|
|
$total = $this->_getListCount($query);
|
|
|
|
// Create the pagination object
|
|
$pagination = new Pagination($total, $limitstart, $limit);
|
|
|
|
return $pagination;
|
|
}
|
|
|
|
/**
|
|
* contacts-query
|
|
*/
|
|
protected function buildQueryContacts()
|
|
{
|
|
$app = Factory::getApplication();
|
|
$jemsettings = JemHelper::config();
|
|
|
|
$filter_order = $app->getUserStateFromRequest('com_jem.selectcontact.filter_order', 'filter_order', 'con.ordering', 'cmd');
|
|
$filter_order_Dir = $app->getUserStateFromRequest('com_jem.selectcontact.filter_order_Dir', 'filter_order_Dir', '', 'word');
|
|
|
|
$filter_order = InputFilter::getinstance()->clean($filter_order, 'cmd');
|
|
$filter_order_Dir = InputFilter::getinstance()->clean($filter_order_Dir, 'word');
|
|
|
|
$filter_type = $app->getUserStateFromRequest('com_jem.selectcontact.filter_type', 'filter_type', 0, 'int');
|
|
$search = $app->getUserStateFromRequest('com_jem.selectcontact.filter_search', 'filter_search', '', 'string');
|
|
$search = $this->_db->escape(trim(\Joomla\String\StringHelper::strtolower($search)));
|
|
|
|
// Query
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('con.*'));
|
|
$query->from('#__contact_details As con');
|
|
|
|
// where
|
|
$where = array();
|
|
$where[] = 'con.published = 1';
|
|
|
|
/* something to search for? (we like to search for "0" too) */
|
|
if ($search || ($search === "0")) {
|
|
switch ($filter_type) {
|
|
case 1: /* Search name */
|
|
$where[] = ' LOWER(con.name) LIKE \'%' . $search . '%\' ';
|
|
break;
|
|
case 2: /* Search address (not supported yet, privacy) */
|
|
//$where[] = ' LOWER(con.address) LIKE \'%' . $search . '%\' ';
|
|
break;
|
|
case 3: // Search city
|
|
$where[] = ' LOWER(con.suburb) LIKE \'%' . $search . '%\' ';
|
|
break;
|
|
case 4: // Search state
|
|
$where[] = ' LOWER(con.state) LIKE \'%' . $search . '%\' ';
|
|
break;
|
|
}
|
|
}
|
|
$query->where($where);
|
|
|
|
// ordering
|
|
|
|
// ensure it's a valid order direction (asc, desc or empty)
|
|
if (!empty($filter_order_Dir) && strtoupper($filter_order_Dir) !== 'DESC') {
|
|
$filter_order_Dir = 'ASC';
|
|
}
|
|
|
|
if ($filter_order != '') {
|
|
$orderby = $filter_order . ' ' . $filter_order_Dir;
|
|
if ($filter_order != 'con.name') {
|
|
$orderby = array($orderby, 'con.name'); // in case of city or state we should have a useful second ordering
|
|
}
|
|
} else {
|
|
$orderby = 'con.name';
|
|
}
|
|
$query->order($orderby);
|
|
|
|
return $query;
|
|
}
|
|
|
|
###########
|
|
## USERS ##
|
|
###########
|
|
|
|
/**
|
|
* Get users data
|
|
*/
|
|
public function getUsers()
|
|
{
|
|
$query = $this->buildQueryUsers();
|
|
$pagination = $this->getUsersPagination();
|
|
|
|
$rows = $this->_getList($query, $pagination->limitstart, $pagination->limit);
|
|
|
|
// Add registration status if available
|
|
$itemId = (int)$this->getState('event.id');
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$qry = $db->getQuery(true);
|
|
// #__jem_register (id, event, uid, waiting, status, comment)
|
|
$qry->select(array('reg.uid, reg.status, reg.waiting, reg.places'));
|
|
$qry->from('#__jem_register As reg');
|
|
$qry->where('reg.event = ' . $itemId);
|
|
$db->setQuery($qry);
|
|
$regs = $db->loadObjectList('uid');
|
|
|
|
// JemHelper::addLogEntry((string)$qry . "\n" . print_r($regs, true), __METHOD__);
|
|
|
|
foreach ($rows AS &$row) {
|
|
if (array_key_exists($row->id, $regs)) {
|
|
$row->status = $regs[$row->id]->status;
|
|
$row->places = $regs[$row->id]->places;
|
|
if ($row->status == 1 && $regs[$row->id]->waiting) {
|
|
++$row->status;
|
|
}
|
|
} else {
|
|
$row->status = -99;
|
|
$row->places = 0;
|
|
}
|
|
}
|
|
|
|
return $rows;
|
|
}
|
|
|
|
/**
|
|
* users-Pagination
|
|
**/
|
|
public function getUsersPagination()
|
|
{
|
|
$jemsettings = JemHelper::config();
|
|
$app = Factory::getApplication();
|
|
$limit = 0;//$app->getUserStateFromRequest('com_jem.selectusers.limit', 'limit', $jemsettings->display_num, 'int');
|
|
$limitstart = 0;//$app->input->getInt('limitstart', 0);
|
|
// correct start value if required
|
|
$limitstart = $limit ? (int)(floor($limitstart / $limit) * $limit) : 0;
|
|
|
|
$query = $this->buildQueryUsers();
|
|
$total = $this->_getListCount($query);
|
|
|
|
// Create the pagination object
|
|
$pagination = new Pagination($total, $limitstart, $limit);
|
|
|
|
return $pagination;
|
|
}
|
|
|
|
/**
|
|
* users-query
|
|
*/
|
|
protected function buildQueryUsers()
|
|
{
|
|
$app = Factory::getApplication();
|
|
$jemsettings = JemHelper::config();
|
|
|
|
// no filters, hard-coded
|
|
$filter_order = 'usr.name';
|
|
$filter_order_Dir = '';
|
|
$filter_type = '';
|
|
$search = '';
|
|
|
|
// Query
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
$query->select(array('usr.id, usr.name'));
|
|
$query->from('#__users As usr');
|
|
|
|
// where
|
|
$where = array();
|
|
$where[] = 'usr.block = 0';
|
|
$where[] = 'NOT usr.activation > 0';
|
|
|
|
/* something to search for? (we like to search for "0" too) */
|
|
if ($search || ($search === "0")) {
|
|
switch ($filter_type) {
|
|
case 1: /* Search name */
|
|
$where[] = ' LOWER(usr.name) LIKE \'%' . $search . '%\' ';
|
|
break;
|
|
}
|
|
}
|
|
$query->where($where);
|
|
|
|
// ordering
|
|
|
|
// ensure it's a valid order direction (asc, desc or empty)
|
|
if (!empty($filter_order_Dir) && strtoupper($filter_order_Dir) !== 'DESC') {
|
|
$filter_order_Dir = 'ASC';
|
|
}
|
|
|
|
if ($filter_order != '') {
|
|
$orderby = $filter_order . ' ' . $filter_order_Dir;
|
|
if ($filter_order != 'usr.name') {
|
|
$orderby = array($orderby, 'usr.name'); // in case of (???) we should have a useful second ordering
|
|
}
|
|
} else {
|
|
$orderby = 'usr.name ' . $filter_order_Dir;
|
|
}
|
|
$query->order($orderby);
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* Get list of invited users.
|
|
*/
|
|
public function getInvitedUsers()
|
|
{
|
|
$itemId = (int)$this->getState('event.id');
|
|
$db = Factory::getContainer()->get('DatabaseDriver');
|
|
$query = $db->getQuery(true);
|
|
// #__jem_register (id, event, uid, waiting, status, comment)
|
|
$query->select(array('reg.uid'));
|
|
$query->from('#__jem_register As reg');
|
|
$query->where('reg.event = ' . $itemId);
|
|
$query->where('reg.status = 0');
|
|
$db->setQuery($query);
|
|
$regs = $db->loadColumn();
|
|
|
|
// JemHelper::addLogEntry((string)$query . "\n" . implode(',', $regs), __METHOD__);
|
|
return $regs;
|
|
}
|
|
|
|
}
|