Files
2024-12-17 17:34:10 +01:00

272 lines
7.5 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\MVC\Model\ListModel;
use Joomla\CMS\Language\Text;
use Joomla\CMS\HTML\HTMLHelper;
/**
* Model: Attendees
*/
class JemModelAttendees extends ListModel
{
protected $eventid = 0;
/**
* Constructor
*/
public function __construct($config = array())
{
if (empty($config['filter_fields'])) {
$config['filter_fields'] = array(
'u.name', 'u.username',
'r.uid', 'r.waiting',
'r.uregdate','r.id'
);
}
parent::__construct($config);
$app = Factory::getApplication();
$eventid = $app->input->getInt('eventid', 0);
$this->setId($eventid);
}
public function setId($eventid)
{
$this->eventid = $eventid;
}
/**
* Method to auto-populate the model state.
*
* Note. Calling getState in this method will result in recursion.
*/
protected function populateState($ordering = null, $direction = null)
{
$app = Factory::getApplication();
$limit = $app->getUserStateFromRequest('com_jem.attendees.limit', 'limit', $app->get('list_limit'), 'int');
$limitstart = $app->getUserStateFromRequest('com_jem.attendees.limitstart', 'limitstart', 0, 'int');
$limitstart = $limit ? (int)(floor($limitstart / $limit) * $limit) : 0;
$this->setState('limit', $limit);
$this->setState('limitstart', $limitstart);
//set unlimited if export or print action | task=export or task=print
$task = $app->input->getCmd('task');
$this->setState('unlimited', ($task == 'export' || $task == 'print') ? '1' : '');
$filter_type = $app->getUserStateFromRequest( 'com_jem.attendees.filter_type', 'filter_type', 0, 'int' );
$this->setState('filter_type', $filter_type);
$filter_search = $app->getUserStateFromRequest( 'com_jem.attendees.filter_search', 'filter_search', '', 'string' );
$this->setState('filter_search', $filter_search);
$filter_status = $app->getUserStateFromRequest( 'com_jem.attendees.filter_status', 'filter_status', -2, 'int' );
$this->setState('filter_status', $filter_status);
parent::populateState('u.username', 'asc');
}
/**
* Method to get a store id based on model configuration state.
*
* This is necessary because the model is used by the component and
* different modules that might need different sets of data or different
* ordering requirements.
*
* @param string $id A prefix for the store id.
* @return string A store id.
*
*/
protected function getStoreId($id = '')
{
// Compile the store id.
$id.= ':' . $this->getState('filter_search');
$id.= ':' . $this->getState('filter_status');
$id.= ':' . $this->getState('filter_type');
return parent::getStoreId($id);
}
/**
* Build an SQL query to load the list data.
*
* @return JDatabaseQuery
*/
protected function getListQuery()
{
// Create a new query object.
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
// Select the required fields from the table.
$query->select($this->getState('list.select', 'r.*'));
$query->from($db->quoteName('#__jem_register').' AS r');
// Join event data
$query->select('a.waitinglist AS waitinglist');
$query->join('LEFT', '#__jem_events AS a ON (r.event = a.id)');
// Join user info
$query->select(array('u.username','u.name','u.email'));
$query->join('LEFT', '#__users AS u ON (u.id = r.uid)');
// load only data from current event
$query->where('r.event = '.$db->Quote($this->eventid));
// TODO: filter status
$filter_status = $this->getState('filter_status', -2);
if ($filter_status > -2) {
if ($filter_status >= 1) {
$waiting = $filter_status == 2 ? 1 : 0;
$filter_status = 1;
$query->where('(a.waitinglist = 0 OR r.waiting = '.$db->quote($waiting).')');
}
$query->where('r.status = '.$db->quote($filter_status));
}
// search name
$filter_type = $this->getState('filter_type');
$filter_search = $this->getState('filter_search');
if (!empty($filter_search) && $filter_type == 1) {
$filter_search = $db->Quote('%'.$db->escape($filter_search, true).'%');
$query->where('u.name LIKE '.$filter_search);
}
// search username
if (!empty($filter_search) && $filter_type == 2) {
$filter_search = $db->Quote('%'.$db->escape($filter_search, true).'%');
$query->where('u.username LIKE '.$filter_search);
}
// Add the list ordering clause.
$orderCol = $this->state->get('list.ordering');
$orderDirn = $this->state->get('list.direction');
$query->order($db->escape($orderCol.' '.$orderDirn));
return $query;
}
/**
* Get event data
*
* @access public
* @return object
*/
public function getEvent()
{
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
$query->select(array('id','title','dates','maxplaces','waitinglist'));
$query->from('#__jem_events');
$query->where('id = '.$db->Quote($this->eventid));
$db->setQuery( $query );
$event = $db->loadObject();
return $event;
}
/**
* Delete registered users
*
* @access public
* @return true on success
*/
public function remove($cid = array())
{
if (is_array($cid) && count($cid))
{
\Joomla\Utilities\ArrayHelper::toInteger($cid);
$user = implode(',', $cid);
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true);
$query->delete($db->quoteName('#__jem_register'));
$query->where('id IN ('.$user.')');
$db->setQuery($query);
// TODO: use exception handling
if ($db->execute() === false) {
throw new Exception($db->getErrorMsg(), 500);
}
}
return true;
}
/**
* Returns a CSV file with Attendee data
* @return boolean
*/
public function getCsv()
{
$jemconfig = JemConfig::getInstance()->toRegistry();
$separator = $jemconfig->get('csv_separator', ';');
$delimiter = $jemconfig->get('csv_delimiter', '"');
$csv_bom = $jemconfig->get('csv_bom', '1');
$comments = $jemconfig->get('regallowcomments', 0);
$event = $this->getEvent();
$items = $this->getItems();
$waitinglist = isset($event->waitinglist) ? $event->waitinglist : false;
$csv = fopen('php://output', 'w');
$header = array(
Text::_('COM_JEM_NAME'),
Text::_('COM_JEM_USERNAME'),
Text::_('COM_JEM_EMAIL'),
Text::_('COM_JEM_REGDATE'),
Text::_('COM_JEM_ATTENDEES_PLACES'),
Text::_('COM_JEM_HEADER_WAITINGLIST_STATUS')
);
if ($comments) {
$header[] = Text::_('COM_JEM_COMMENT');
}
$header[] = Text::_('COM_JEM_ATTENDEES_REGID');
fputcsv($csv, $header, $separator, $delimiter);
foreach ($items as $item)
{
$status = isset($item->status) ? $item->status : 1;
if ($status < 0) {
$txt_stat = 'COM_JEM_ATTENDEES_NOT_ATTENDING';
} elseif ($status > 0) {
$txt_stat = $item->waiting ? 'COM_JEM_ATTENDEES_ON_WAITINGLIST' : 'COM_JEM_ATTENDEES_ATTENDING';
} else {
$txt_stat = 'COM_JEM_ATTENDEES_INVITED';
}
$data = array(
$item->name,
$item->username,
$item->email,
empty($item->uregdate) ? '' : HTMLHelper::_('date', $item->uregdate, Text::_('DATE_FORMAT_LC2')),
$item->places,
Text::_($txt_stat)
);
if ($comments) {
$comment = strip_tags($item->comment);
// comments are limited to 255 characters in db so we don't need to truncate them on export
$data[] = $comment;
}
$data[] = $item->uid;
fputcsv($csv, $data, $separator, $delimiter);
}
return fclose($csv);
}
}