392 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			392 lines
		
	
	
		
			10 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
 | |
|  *
 | |
|  * Based on: https://gist.github.com/dongilbert/4195504
 | |
|  */
 | |
|  
 | |
| defined('_JEXEC') or die;
 | |
| 
 | |
| use Joomla\CMS\Factory;
 | |
| use Joomla\CMS\MVC\Model\ListModel;
 | |
| use Joomla\CMS\Component\ComponentHelper;
 | |
| 
 | |
| jimport('joomla.application.component.modellist');
 | |
| 
 | |
| /**
 | |
|  * JEM Component Export Model
 | |
|  */
 | |
| class JemModelExport extends ListModel
 | |
| {
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 *
 | |
| 	 * @param array An optional associative array of configuration settings.
 | |
| 	 * @see   JController
 | |
| 	 */
 | |
| 	public function __construct($config = array())
 | |
| 	{
 | |
| 		if (empty($config['filter_fields'])) {
 | |
| 			$config['filter_fields'] = array(
 | |
| 				'id',
 | |
| 				'a.id'
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		parent::__construct($config);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Method to auto-populate the model state.
 | |
| 	 *
 | |
| 	 * @Note Calling getState in this method will result in recursion.
 | |
| 	 */
 | |
| 	protected function populateState($ordering = null, $direction = null)
 | |
| 	{
 | |
| 		// Load the filter state.
 | |
| 		$filter_form_type = $this->getUserStateFromRequest($this->context . '.filter.form_type', 'filter_form_type');
 | |
| 		$this->setState('filter.form_type', $filter_form_type);
 | |
| 
 | |
| 		$filter_start_date = $this->getUserStateFromRequest($this->context . '.filter.start_date', 'filter_start_date');
 | |
| 		$this->setState('filter.start_date', $filter_start_date);
 | |
| 
 | |
| 		$filter_end_date = $this->getUserStateFromRequest($this->context . '.filter.end_date', 'filter_end_date');
 | |
| 		$this->setState('filter.end_date', $filter_end_date);
 | |
| 
 | |
| 		// Load the parameters.
 | |
| 		$params = ComponentHelper::getParams('com_jem');
 | |
| 		$this->setState('params', $params);
 | |
| 
 | |
| 		// List state information.
 | |
| 		parent::populateState('a.first_name', 'asc');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Build an SQL query to load the Events data.
 | |
| 	 *
 | |
| 	 * @return JDatabaseQuery
 | |
| 	 */
 | |
| 	protected function getListQuery()
 | |
| 	{
 | |
| 		// Retrieve variables
 | |
| 		$jinput    = Factory::getApplication()->input;
 | |
| 		$startdate = $jinput->get('dates', '', 'string');
 | |
| 		$enddate   = $jinput->get('enddates', '', 'string');
 | |
| 		$cats      = $jinput->get('cid', array(), 'array');
 | |
| 
 | |
| 		// Create a new query object.
 | |
| 		$db    = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$query = $db->getQuery(true);
 | |
| 
 | |
| 		// Select the required fields from the table.
 | |
| 		$query->select('a.*');
 | |
| 		$query->from('#__jem_events AS a');
 | |
| 		$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');
 | |
| 
 | |
| 		// check if startdate and/or enddate are set.
 | |
| 		if (!empty($startdate)) {
 | |
| 			// note: open date is always after $startdate
 | |
| 			$query->where('((a.dates IS NULL) OR (DATEDIFF(IF (a.enddates IS NOT NULL, a.enddates, a.dates), ' . $db->quote($startdate) . ') >= 0))');
 | |
| 		}
 | |
| 		if (!empty($enddate)) {
 | |
| 			// note: open date is before $enddate as long as $enddate is not before today
 | |
| 			$query->where('(((a.dates IS NULL) AND (DATEDIFF(CURDATE(), ' . $db->quote($enddate) . ') <= 0)) OR (DATEDIFF(a.dates, ' . $db->quote($enddate) . ') <= 0))');
 | |
| 		}
 | |
| 
 | |
| 		// check if specific category's have been selected
 | |
| 		if (! empty($cats)) {
 | |
| 			\Joomla\Utilities\ArrayHelper::toInteger($cats);
 | |
| 			$query->where('  c.id IN (' . implode(',', $cats) . ')');
 | |
| 		}
 | |
| 
 | |
| 		// Group the query
 | |
| 		$query->group('a.id');
 | |
| 
 | |
| 		return $query;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns a CSV file with Events data
 | |
| 	 *
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	public function getCsv()
 | |
| 	{
 | |
| 		$this->populateState();
 | |
| 
 | |
| 		$jinput = Factory::getApplication()->input;
 | |
| 		$includecategories = $jinput->get('categorycolumn', 0, 'int');
 | |
| 
 | |
| 		$db  = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$jemconfig = JemConfig::getInstance()->toRegistry();
 | |
| 		$separator = $jemconfig->get('csv_separator', ';');
 | |
| 		$delimiter = $jemconfig->get('csv_delimiter', '"');
 | |
| 		$csv_bom   = $jemconfig->get('csv_bom', '1');
 | |
| 		$csv = fopen('php://output', 'w');
 | |
| 		if ($csv_bom ==1 ) {
 | |
| 			//add BOM to fix UTF-8 in Excel
 | |
| 			fputs($csv, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
 | |
| 		}
 | |
| 
 | |
| 		if ($includecategories == 1) {
 | |
| 			$events = array_keys($db->getTableColumns('#__jem_events'));
 | |
| 			$categories = array();
 | |
| 			$categories[] = "categories";
 | |
| 			$header = array_merge($events, $categories);
 | |
| 
 | |
| 			fputcsv($csv, $header, $separator, $delimiter);
 | |
| 
 | |
| 			$query = $this->getListQuery();
 | |
| 			$items = $this->_getList($query);
 | |
| 
 | |
| 			foreach ($items as $item) {
 | |
| 				$item->categories = $this->getCatEvent($item->id);
 | |
| 			}
 | |
| 		} else {
 | |
| 			$header = array_keys($db->getTableColumns('#__jem_events'));
 | |
| 			fputcsv($csv, $header, $separator, $delimiter);
 | |
| 			$query = $this->getListQuery();
 | |
| 			$items = $this->_getList($query);
 | |
| 		}
 | |
| 
 | |
| 		foreach ($items as $lines) {
 | |
| 			fputcsv($csv, (array) $lines, $separator, $delimiter);
 | |
| 		}
 | |
| 
 | |
| 		return fclose($csv);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Build an SQL query to load the Categories data.
 | |
| 	 *
 | |
| 	 * @return JDatabaseQuery
 | |
| 	 */
 | |
| 	protected function getListQuerycats()
 | |
| 	{
 | |
| 		// Create a new query object.
 | |
| 		$db    = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$query = $db->getQuery(true);
 | |
| 
 | |
| 		// Select the required fields from the table.
 | |
| 		$query->select('a.*');
 | |
| 		$query->from('#__jem_categories AS a');
 | |
| 
 | |
| 		return $query;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns a CSV file with Categories data
 | |
| 	 *
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	public function getCsvcats()
 | |
| 	{
 | |
| 		$this->populateState();
 | |
| 		$jemconfig = JemConfig::getInstance()->toRegistry();
 | |
| 		$separator = $jemconfig->get('csv_separator', ';');
 | |
| 		$delimiter = $jemconfig->get('csv_delimiter', '"');
 | |
| 		$csv_bom   = $jemconfig->get('csv_bom', '1');
 | |
| 		$csv = fopen('php://output', 'w');
 | |
| 		if ($csv_bom ==1 ) {
 | |
| 			//add BOM to fix UTF-8 in Excel
 | |
| 			fputs($csv, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
 | |
| 		}
 | |
| 		$db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$header = array_keys($db->getTableColumns('#__jem_categories'));
 | |
| 		fputcsv($csv, $header, $separator, $delimiter);
 | |
| 
 | |
| 		$db->setQuery($this->getListQuerycats());
 | |
| 		$items = $db->loadObjectList();
 | |
| 
 | |
| 		foreach ($items as $lines) {
 | |
| 			fputcsv($csv, (array) $lines, $separator, $delimiter);
 | |
| 		}
 | |
| 
 | |
| 		return fclose($csv);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Build an SQL query to load the Venues data.
 | |
| 	 *
 | |
| 	 * @return JDatabaseQuery
 | |
| 	 */
 | |
| 	protected function getListQueryvenues()
 | |
| 	{
 | |
| 		// Create a new query object.
 | |
| 		$db    = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$query = $db->getQuery(true);
 | |
| 
 | |
| 		// Select the required fields from the table.
 | |
| 		$query->select('a.*');
 | |
| 		$query->from('#__jem_venues AS a');
 | |
| 
 | |
| 		return $query;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns a CSV file with Venues data
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	public function getCsvvenues()
 | |
| 	{
 | |
| 		$this->populateState();
 | |
| 		$jemconfig = JemConfig::getInstance()->toRegistry();
 | |
| 		$separator = $jemconfig->get('csv_separator', ';');
 | |
| 		$delimiter = $jemconfig->get('csv_delimiter', '"');
 | |
| 		$csv_bom   = $jemconfig->get('csv_bom', '1');
 | |
| 		$csv = fopen('php://output', 'w');
 | |
| 		if ($csv_bom ==1 ) {
 | |
| 			//add BOM to fix UTF-8 in Excel
 | |
| 			fputs($csv, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
 | |
| 		}
 | |
| 		$db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$header = array_keys($db->getTableColumns('#__jem_venues'));
 | |
| 		fputcsv($csv, $header, $separator, $delimiter);
 | |
| 
 | |
| 		$db->setQuery($this->getListQueryvenues());
 | |
| 		$items = $db->loadObjectList();
 | |
| 
 | |
| 		foreach ($items as $lines) {
 | |
| 			fputcsv($csv, (array) $lines, $separator, $delimiter);
 | |
| 		}
 | |
| 
 | |
| 		return fclose($csv);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Build an SQL query to load the Cats/Events data.
 | |
| 	 *
 | |
| 	 * @return JDatabaseQuery
 | |
| 	 */
 | |
| 	protected function getListQuerycatsevents()
 | |
| 	{
 | |
| 		// Create a new query object.
 | |
| 		$db    = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$query = $db->getQuery(true);
 | |
| 
 | |
| 		// Select the required fields from the table.
 | |
| 		$query->select('a.*');
 | |
| 		$query->from('#__jem_cats_event_relations AS a');
 | |
| 
 | |
| 		return $query;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns a CSV file with Cats/Events data
 | |
| 	 * @return boolean
 | |
| 	 */
 | |
| 	public function getCsvcatsevents()
 | |
| 	{
 | |
| 		$this->populateState();
 | |
| 		$jemconfig = JemConfig::getInstance()->toRegistry();
 | |
| 		$separator = $jemconfig->get('csv_separator', ';');
 | |
| 		$delimiter = $jemconfig->get('csv_delimiter', '"');
 | |
| 		$csv_bom   = $jemconfig->get('csv_bom', '1');
 | |
| 		$csv = fopen('php://output', 'w');
 | |
| 		if ($csv_bom ==1 ) {
 | |
| 			//add BOM to fix UTF-8 in Excel
 | |
| 			fputs($csv, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
 | |
| 		}
 | |
| 		$db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$header = array_keys($db->getTableColumns('#__jem_cats_event_relations'));
 | |
| 		fputcsv($csv, $header, $separator, $delimiter);
 | |
| 
 | |
| 		$db->setQuery($this->getListQuerycatsevents());
 | |
| 		$items = $db->loadObjectList();
 | |
| 
 | |
| 		foreach ($items as $lines) {
 | |
| 			fputcsv($csv, (array) $lines, $separator, $delimiter);
 | |
| 		}
 | |
| 
 | |
| 		return fclose($csv);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * logic to get the categories
 | |
| 	 */
 | |
| 	public function getCategories()
 | |
| 	{
 | |
| 		// @todo alter function
 | |
| 
 | |
|         $db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$where = ' WHERE c.published = 1';
 | |
| 		$query = 'SELECT c.* FROM #__jem_categories AS c' . $where . ' ORDER BY parent_id, c.lft';
 | |
| 		
 | |
| 
 | |
| 		// Check for a database error.
 | |
| 		// if ($db->getErrorNum()){
 | |
| 		// 	Factory::getApplication()->enqueueMessage($db->getErrorMsg(), 'notice');
 | |
| 		// }
 | |
| 		try
 | |
| 		{
 | |
| 			$db->setQuery($query);
 | |
| 			$mitems = $db->loadObjectList();
 | |
| 		}
 | |
| 		catch (RuntimeException $e)
 | |
| 		{			
 | |
| 			Factory::getApplication()->enqueueMessage($e->getMessage(), 'notice');
 | |
| 		}
 | |
| 
 | |
| 		if (!$mitems) {
 | |
| 			$children = array();
 | |
| 			$mitems   = array();
 | |
| 			$parentid = 0;
 | |
| 		} else {
 | |
| 			$children = array();
 | |
| 			// First pass - collect children
 | |
| 			foreach ($mitems as $v) {
 | |
| 				$pt = $v->parent_id;
 | |
| 				$list = isset($children[$pt]) ? $children[$pt] : array();
 | |
| 				array_push($list, $v);
 | |
| 				$children[$pt] = $list;
 | |
| 			}
 | |
| 
 | |
| 			// list childs of "root" which has no parent and normally id 1
 | |
| 			$parentid = intval(isset($children[0][0]->id) ? $children[0][0]->id : 1);
 | |
| 		}
 | |
| 
 | |
| 		//get list of the items
 | |
| 		$list = JemCategories::treerecurse($parentid, '', array(), $children, 9999, 0, 0);
 | |
| 
 | |
| 		return $list;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Get Category IDs for a specific event.
 | |
| 	 *
 | |
| 	 * @param  int $id event id
 | |
| 	 * @return string|boolean Comma separated list of ids on success or false otherwise.
 | |
| 	 */
 | |
| 	public function getCatEvent($id)
 | |
| 	{
 | |
| 		// Create a new query object.
 | |
| 		$db    = Factory::getContainer()->get('DatabaseDriver');
 | |
| 		$query = $db->getQuery(true);
 | |
| 
 | |
| 		// Select the required fields from the table.
 | |
| 		$query->select('catid');
 | |
| 		$query->from('#__jem_cats_event_relations');
 | |
| 		$query->where('itemid = ' . $db->quote($id));
 | |
| 
 | |
| 		$db->setQuery($query);
 | |
| 		$catidlist = $db->loadObjectList();
 | |
| 
 | |
| 		if (is_array($catidlist) && count($catidlist)) {
 | |
| 			$catidarray = array();
 | |
| 			foreach ($catidlist as $obj) {
 | |
| 				$catidarray[] = $obj->catid;
 | |
| 			}
 | |
| 
 | |
| 			$catids = implode(',', $catidarray);
 | |
| 		} else {
 | |
| 			$catids = false;
 | |
| 		}
 | |
| 
 | |
| 		return $catids;
 | |
| 	}
 | |
| }
 |