primo commit
This commit is contained in:
450
components/com_jem/models/myplanning.php
Normal file
450
components/com_jem/models/myplanning.php
Normal file
@ -0,0 +1,450 @@
|
||||
<?php
|
||||
/**
|
||||
* @version 2.2.2
|
||||
* @package JEM
|
||||
* @copyright (C) 2013-2017 joomlaeventmanager.net
|
||||
* @copyright (C) 2005-2009 Christoph Lukes
|
||||
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
|
||||
*/
|
||||
defined('_JEXEC') or die ;
|
||||
|
||||
require_once dirname(__FILE__) . '/eventslist.php';
|
||||
|
||||
/**
|
||||
* Model-Calendar
|
||||
*/
|
||||
class JemModelMyplanning extends JemModelEventslist
|
||||
{
|
||||
protected $_date = 0;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->setdate(time());
|
||||
|
||||
}
|
||||
|
||||
public function setdate($date)
|
||||
{
|
||||
$this->_date = $date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to auto-populate the model state.
|
||||
*/
|
||||
protected function populateState($ordering = null, $direction = null)
|
||||
{
|
||||
# parent::populateState($ordering, $direction);
|
||||
$app = JFactory::getApplication();
|
||||
$params = $app->getParams();
|
||||
$task = $app->input->get('task','','cmd');
|
||||
$top_category = $params->get('top_category', 0);
|
||||
$startdayonly = $params->get('show_only_start', false);
|
||||
|
||||
# params
|
||||
$this->setState('params', $params);
|
||||
|
||||
# publish state
|
||||
$this->_populatePublishState($task);
|
||||
|
||||
###########
|
||||
## DATES ##
|
||||
###########
|
||||
|
||||
#only select events within specified dates. (chosen month)
|
||||
$monthstart = mktime(0, 0, 1, strftime('%m', $this->_date), 1, strftime('%Y', $this->_date));
|
||||
$monthend = mktime(0, 0, -1, strftime('%m', $this->_date)+1, 1, strftime('%Y', $this->_date));
|
||||
|
||||
$filter_date_from = $this->_db->Quote(strftime('%Y-%m-%d', $monthstart));
|
||||
$filter_date_to = $this->_db->Quote(strftime('%Y-%m-%d', $monthend));
|
||||
|
||||
$where = ' DATEDIFF(IF (a.enddates IS NOT NULL, a.enddates, a.dates), '. $filter_date_from .') >= 0';
|
||||
$this->setState('filter.calendar_from',$where);
|
||||
|
||||
$where = ' DATEDIFF(a.dates, '. $filter_date_to .') <= 0';
|
||||
$this->setState('filter.calendar_to',$where);
|
||||
|
||||
##################
|
||||
## TOP-CATEGORY ##
|
||||
##################
|
||||
|
||||
if ($top_category) {
|
||||
$children = JemCategories::getChilds($top_category);
|
||||
if (count($children)) {
|
||||
$where = 'rel.catid IN ('. implode(',', $children) .')';
|
||||
$this->setState('filter.category_top', $where);
|
||||
}
|
||||
}
|
||||
|
||||
# set filter
|
||||
$this->setState('filter.calendar_multiday',true);
|
||||
$this->setState('filter.calendar_startdayonly',(bool)$startdayonly);
|
||||
$this->setState('filter.groupby',array('a.id'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a list of events.
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
$items = parent::getItems();
|
||||
|
||||
if ($items) {
|
||||
return $items;
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return JDatabaseQuery
|
||||
*/
|
||||
protected function getListQuery()
|
||||
{
|
||||
|
||||
|
||||
|
||||
// Create a new query object.
|
||||
|
||||
$app = JFactory::getApplication();
|
||||
$task = $app->input->getCmd('task', '');
|
||||
$itemid = $app->input->getInt('id', 0) . ':' . $app->input->getInt('Itemid', 0);
|
||||
|
||||
$params = $app->getParams();
|
||||
$settings = JemHelper::globalattribs();
|
||||
$user = JemFactory::getUser();
|
||||
$levels = $user->getAuthorisedViewLevels();
|
||||
|
||||
# Query
|
||||
$db = JFactory::getDBO();
|
||||
$query = $db->getQuery(true);
|
||||
|
||||
# Event
|
||||
$query->select(
|
||||
$this->getState('list.select',
|
||||
'a.access,a.alias,a.attribs,a.checked_out,a.checked_out_time,a.contactid,a.created,a.created_by,a.created_by_alias,a.custom1,a.custom2,a.custom3,a.custom4,a.custom5,a.custom6,a.custom7,a.custom8,a.custom9,a.custom10,a.dates,a.datimage,a.enddates,a.endtimes,a.featured,' .
|
||||
'a.fulltext,a.hits,a.id,a.introtext,a.language,a.locid,a.maxplaces,a.metadata,a.meta_keywords,a.meta_description,a.modified,a.modified_by,a.published,a.registra,a.times,a.title,a.unregistra,a.waitinglist,DAYOFMONTH(a.dates) AS created_day, YEAR(a.dates) AS created_year, MONTH(a.dates) AS created_month,' .
|
||||
'a.recurrence_byday,a.recurrence_counter,a.recurrence_first_id,a.recurrence_limit,a.recurrence_limit_date,a.recurrence_number, a.recurrence_type,a.version'
|
||||
)
|
||||
);
|
||||
$query->from('#__jem_events as a');
|
||||
|
||||
|
||||
# Venue
|
||||
$query->select(array('l.alias AS l_alias','l.checked_out AS l_checked_out','l.checked_out_time AS l_checked_out_time','l.city','l.country','l.created AS l_created','l.created_by AS l_createdby'));
|
||||
$query->select(array('l.custom1 AS l_custom1','l.custom2 AS l_custom2','l.custom3 AS l_custom3','l.custom4 AS l_custom4','l.custom5 AS l_custom5','l.custom6 AS l_custom6','l.custom7 AS l_custom7','l.custom8 AS l_custom8','l.custom9 AS l_custom9','l.custom10 AS l_custom10'));
|
||||
$query->select(array('l.id AS l_id','l.latitude','l.locdescription','l.locimage','l.longitude','l.map','l.meta_description AS l_meta_description','l.meta_keywords AS l_meta_keywords','l.modified AS l_modified','l.modified_by AS l_modified_by','l.postalCode'));
|
||||
$query->select(array('l.publish_up AS l_publish_up','l.publish_down AS l_publish_down','l.published AS l_published','l.state','l.street','l.url','l.venue','l.version AS l_version'));
|
||||
$query->join('LEFT', '#__jem_venues AS l ON l.id = a.locid');
|
||||
|
||||
|
||||
# the rest
|
||||
$case_when_e = ' CASE WHEN ';
|
||||
$case_when_e .= $query->charLength('a.alias','!=', '0');
|
||||
$case_when_e .= ' THEN ';
|
||||
$id_e = $query->castAsChar('a.id');
|
||||
$case_when_e .= $query->concatenate(array($id_e, 'a.alias'), ':');
|
||||
$case_when_e .= ' ELSE ';
|
||||
$case_when_e .= $id_e.' END as slug';
|
||||
|
||||
$case_when_l = ' CASE WHEN ';
|
||||
$case_when_l .= $query->charLength('l.alias', '!=', '0');
|
||||
$case_when_l .= ' THEN ';
|
||||
$id_l = $query->castAsChar('a.locid');
|
||||
$case_when_l .= $query->concatenate(array($id_l, 'l.alias'), ':');
|
||||
$case_when_l .= ' ELSE ';
|
||||
$case_when_l .= $id_l.' END as venueslug';
|
||||
|
||||
$query->select(array($case_when_e, $case_when_l));
|
||||
|
||||
# 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');
|
||||
|
||||
#############
|
||||
## FILTERS ##
|
||||
#############
|
||||
|
||||
#####################
|
||||
## FILTER - EVENTS ##
|
||||
#####################
|
||||
|
||||
# Filter by a single or group of events.
|
||||
$eventId = $this->getState('filter.event_id');
|
||||
|
||||
if (is_numeric($eventId)) {
|
||||
$type = $this->getState('filter.event_id.include', true) ? '= ' : '<> ';
|
||||
$query->where('a.id '.$type.(int) $eventId);
|
||||
}
|
||||
elseif (is_array($eventId) && !empty($eventId)) {
|
||||
JArrayHelper::toInteger($eventId);
|
||||
$eventId = implode(',', $eventId);
|
||||
$type = $this->getState('filter.event_id.include', true) ? 'IN' : 'NOT IN';
|
||||
$query->where('a.id '.$type.' ('.$eventId.')');
|
||||
}
|
||||
|
||||
###################
|
||||
## FILTER-ACCESS ##
|
||||
###################
|
||||
|
||||
# Filter by access level - always.
|
||||
$query->where('a.access IN ('.implode(',', $levels).')');
|
||||
|
||||
####################
|
||||
## FILTER-PUBLISH ##
|
||||
####################
|
||||
|
||||
# Filter by published state.
|
||||
$where_pub = $this->_getPublishWhere();
|
||||
if (!empty($where_pub)) {
|
||||
$query->where('(' . implode(' OR ', $where_pub) . ')');
|
||||
} else {
|
||||
// something wrong - fallback to published events
|
||||
$query->where('a.published = 1');
|
||||
}
|
||||
#####################
|
||||
## FILTER-FEATURED ##
|
||||
#####################
|
||||
|
||||
# Filter by featured flag.
|
||||
$featured = $this->getState('filter.featured');
|
||||
|
||||
if (is_numeric($featured)) {
|
||||
$query->where('a.featured = ' . (int) $featured);
|
||||
}
|
||||
elseif (is_array($featured) && !empty($featured)) {
|
||||
JArrayHelper::toInteger($featured);
|
||||
$featured = implode(',', $featured);
|
||||
$query->where('a.featured IN ('.$featured.')');
|
||||
}
|
||||
|
||||
#############################
|
||||
## FILTER - CALENDAR_DATES ##
|
||||
#############################
|
||||
$cal_from = $this->getState('filter.calendar_from');
|
||||
$cal_to = $this->getState('filter.calendar_to');
|
||||
|
||||
if ($cal_from) {
|
||||
$query->where($cal_from);
|
||||
}
|
||||
|
||||
if ($cal_to) {
|
||||
$query->where($cal_to);
|
||||
}
|
||||
|
||||
#############################
|
||||
## FILTER - OPEN_DATES ##
|
||||
#############################
|
||||
$opendates = $this->getState('filter.opendates');
|
||||
|
||||
switch ($opendates) {
|
||||
case 0: // don't show events without start date
|
||||
default:
|
||||
$query->where('a.dates IS NOT NULL');
|
||||
break;
|
||||
case 1: // show all events, with or without start date
|
||||
break;
|
||||
case 2: // show only events without startdate
|
||||
$query->where('a.dates IS NULL');
|
||||
break;
|
||||
}
|
||||
|
||||
#####################
|
||||
### FILTER - BYCAT ##
|
||||
#####################
|
||||
|
||||
$filter_catid = $this->getState('filter.filter_catid');
|
||||
if ($filter_catid) { // categorycal
|
||||
$query->where('c.id = '.(int)$filter_catid);
|
||||
}else {
|
||||
$cats = $this->getCategories('all');
|
||||
if (!empty($cats)) {
|
||||
$query->where('c.id IN (' . implode(',', $cats) . ')');
|
||||
}
|
||||
}
|
||||
|
||||
####################
|
||||
## FILTER - BYLOC ##
|
||||
####################
|
||||
$filter_locid = $this->getState('filter.filter_locid');
|
||||
if ($filter_locid) {
|
||||
$query->where('a.locid = '.(int)$filter_locid);
|
||||
}
|
||||
|
||||
####################
|
||||
## FILTER - VENUE ##
|
||||
####################
|
||||
|
||||
$venueId = $this->getState('filter.venue_id');
|
||||
|
||||
if (is_numeric($venueId)) {
|
||||
$type = $this->getState('filter.venue_id.include', true) ? '= ' : '<> ';
|
||||
$query->where('l.id '.$type.(int) $venueId);
|
||||
}
|
||||
elseif (is_array($venueId) && !empty($venueId)) {
|
||||
JArrayHelper::toInteger($venueId);
|
||||
$venueId = implode(',', $venueId);
|
||||
$type = $this->getState('filter.venue_id.include', true) ? 'IN' : 'NOT IN';
|
||||
$query->where('l.id '.$type.' ('.$venueId.')');
|
||||
}
|
||||
|
||||
##########################
|
||||
## FILTER - VENUE STATE ##
|
||||
##########################
|
||||
|
||||
$venueState = $this->getState('filter.venue_state');
|
||||
|
||||
if (!empty($venueState)) {
|
||||
$venueState = explode(',', $venueState);
|
||||
|
||||
$venueStateMode = $this->getState('filter.venue_state.mode', 0);
|
||||
switch ($venueStateMode) {
|
||||
case 0: # complete match: venue's state must be equal (ignoring upper/lower case) one of the strings given by filter
|
||||
default:
|
||||
array_walk($venueState, create_function('&$v,$k,$db','$v = $db->quote(trim($v));'), $db);
|
||||
$query->where('l.state IN ('.implode(',', $venueState).')');
|
||||
break;
|
||||
case 1: # contain: venue's state must contain one of the strings given by filter
|
||||
array_walk($venueState, create_function('&$v,$k,$db','$v = quotemeta($db->escape(trim($v), true));'), $db);
|
||||
$query->where('l.state REGEXP '.$db->quote(implode('|', $venueState)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
###################
|
||||
## 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('a.id = '.(int) substr($search, 3));
|
||||
} else {
|
||||
$search = $db->Quote('%'.$db->escape($search, true).'%', false); // escape once
|
||||
|
||||
if ($search && $settings->get('global_show_filter')) {
|
||||
switch ($filter) {
|
||||
# case 4 is category, so it is omitted
|
||||
case 1:
|
||||
$query->where('a.title LIKE '.$search);
|
||||
break;
|
||||
case 2:
|
||||
$query->where('l.venue LIKE '.$search);
|
||||
break;
|
||||
case 3:
|
||||
$query->where('l.city LIKE '.$search);
|
||||
break;
|
||||
case 5:
|
||||
$query->where('l.state LIKE '.$search);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Group
|
||||
$group = $this->getState('filter.groupby');
|
||||
if ($group) {
|
||||
$query->group($group);
|
||||
}
|
||||
|
||||
# ordering
|
||||
$orderby = $this->getState('filter.orderby');
|
||||
if ($orderby) {
|
||||
$query->order($orderby);
|
||||
}
|
||||
|
||||
|
||||
// suite
|
||||
|
||||
|
||||
# Get the WHERE clause for the query
|
||||
$where = $this->_buildWhere();
|
||||
|
||||
|
||||
|
||||
// here we can extend the query of the Eventslist model
|
||||
//$query->select('DATEDIFF(a.enddates, a.dates) AS datesdiff, DAYOFMONTH(a.dates) AS start_day, YEAR(a.dates) AS start_year, MONTH(a.dates) AS start_month');
|
||||
$query->where( $where);
|
||||
|
||||
|
||||
|
||||
return $query;
|
||||
}
|
||||
/**
|
||||
* Build the where clause
|
||||
*
|
||||
* @access private
|
||||
* @return string
|
||||
*/
|
||||
protected function _buildWhere()
|
||||
{
|
||||
$app = JFactory::getApplication();
|
||||
$task = $app->input->getCmd('task', '');
|
||||
$params = $app->getParams();
|
||||
$settings = JemHelper::globalattribs();
|
||||
$user = JemFactory::getUser();
|
||||
// Support Joomla access levels instead of single group id
|
||||
$levels = $user->getAuthorisedViewLevels();
|
||||
|
||||
$filter = $app->getUserStateFromRequest('com_jem.myevents.filter', 'filter', 0, 'int');
|
||||
$search = $app->getUserStateFromRequest('com_jem.myevents.filter_search', 'filter_search', '', 'string');
|
||||
$search = $this->_db->escape(trim(JString::strtolower($search)));
|
||||
|
||||
$where = array();
|
||||
// a.published traité auparavant
|
||||
|
||||
$where[] = ' c.published = 1';
|
||||
// a.access traité auparavant
|
||||
$where[] = ' c.access IN (' . implode(',', $levels) . ')';
|
||||
|
||||
// then if the user is the owner of the event
|
||||
$where[] = ' a.created_by = '.$this->_db->Quote($user->id);
|
||||
|
||||
// get excluded categories
|
||||
$excluded_cats = trim($params->get('excluded_cats', ''));
|
||||
|
||||
if ($excluded_cats != '') {
|
||||
$cats_excluded = explode(',', $excluded_cats);
|
||||
JArrayHelper::toInteger($cats_excluded);
|
||||
$where[] = ' c.id NOT IN (' . implode(',', $cats_excluded) . ')';
|
||||
}
|
||||
// === END Excluded categories add === //
|
||||
|
||||
if ($settings->get('global_show_filter') && $search) {
|
||||
switch($filter) {
|
||||
case 1:
|
||||
$where[] = ' LOWER(a.title) LIKE \'%'.$search.'%\' ';
|
||||
break;
|
||||
case 2:
|
||||
$where[] = ' LOWER(l.venue) LIKE \'%'.$search.'%\' ';
|
||||
break;
|
||||
case 3:
|
||||
$where[] = ' LOWER(l.city) LIKE \'%'.$search.'%\' ';
|
||||
break;
|
||||
case 4:
|
||||
$where[] = ' LOWER(c.catname) LIKE \'%'.$search.'%\' ';
|
||||
break;
|
||||
case 5:
|
||||
default:
|
||||
$where[] = ' LOWER(l.state) LIKE \'%'.$search.'%\' ';
|
||||
}
|
||||
}
|
||||
|
||||
$where2 = (count($where) ? ' ' . implode(' AND ', $where) : '');
|
||||
|
||||
|
||||
return $where2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user