| Current Path : /home/wuectly/www/administrator/components/com_icagenda/models/ |
| Current File : /home/wuectly/www/administrator/components/com_icagenda/models/event.php |
<?php
/**
*------------------------------------------------------------------------------
* iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
*------------------------------------------------------------------------------
* @package com_icagenda
* @copyright Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
*
* @license GNU General Public License version 3 or later; see LICENSE.txt
* @author Cyril Rezé (Lyr!C)
* @link http://www.joomlic.com
*
* @version 3.5.12 2015-09-25
* @since 1.0
*------------------------------------------------------------------------------
*/
// No direct access to this file
defined('_JEXEC') or die();
jimport('joomla.application.component.modeladmin');
/**
* iCagenda model.
*/
class iCagendaModelEvent extends JModelAdmin
{
/**
* @var string The prefix to use with controller messages.
* @since 1.0
*/
protected $text_prefix = 'COM_ICAGENDA';
/**
* Method to test whether a record can be deleted.
*
* @param object $record A record object.
*
* @return boolean True if allowed to delete the record. Defaults to the permission set in the component.
*
* @since 3.5.6
*/
protected function canDelete($record)
{
if ( ! empty($record->id))
{
if ($record->state != -2)
{
return false;
}
$user = JFactory::getUser();
if ($user->authorise('core.delete'))
{
icagendaCustomfields::deleteData($record->id, 2);
icagendaCustomfields::cleanData(2);
return true;
}
}
return false;
}
/**
* Prepare and sanitise the table prior to saving.
*
* @param JTable $table A JTable object.
*
* @return void
*
* @since 1.0
*/
protected function prepareTable( $table )
{
$date = JFactory::getDate();
$user = JFactory::getUser();
$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
if (empty($table->id))
{
// Set the values
$table->created = $date->toSql();
// Set ordering to the last item if not set
if (empty($table->ordering))
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('MAX(ordering)')
->from($db->quoteName('#__icagenda_events'));
$db->setQuery($query);
$max = $db->loadResult();
$table->ordering = $max + 1;
}
}
else
{
// Set the values
$table->modified = $date->toSql();
$table->modified_by = $user->get('id');
}
}
/**
* Returns a Table object, always creating it.
*
* @param string $type The table type to instantiate
* @param string $prefix A prefix for the table class name. Optional.
* @param array $config Configuration array for model. Optional.
*
* @return JTable A database object
*
* @since 1.0
*/
public function getTable($type = 'Event', $prefix = 'iCagendaTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
/**
* Method to get a single record.
*
* @param integer $pk The id of the primary key.
*
* @return mixed Object on success, false on failure.
*
* @since 1.0
*/
public function getItem($pk = null)
{
if ($item = parent::getItem($pk))
{
// Do any procesing on fields here if needed
}
return $item;
}
/**
* Method to get the record form.
*
* @param array $data Data for the form.
* @param boolean $loadData True if the form is to load its own data (default case), false if not.
*
* @return mixed A JForm object on success, false on failure
*
* @since 1.0
*/
public function getForm($data = array(), $loadData = true)
{
// Get the form.
$form = $this->loadForm('com_icagenda.event', 'event',
array('control' => 'jform', 'load_data' => $loadData));
if (empty($form))
{
return false;
}
return $form;
}
/**
* Method to get the data that should be injected in the form.
*
* @return mixed The data for the form.
*
* @since 1.0
*/
protected function loadFormData()
{
// Check the session for previously entered form data.
$app = JFactory::getApplication();
$data_array = $app->getUserState('com_icagenda.edit.event.data', array());
if (empty($data_array))
{
$data = $this->getItem();
}
else
{
$data = new JObject;
$data->setProperties($data_array);
}
// If not array, creates array with week days data
if ( ! is_array($data->weekdays))
{
$data->weekdays = explode(',', $data->weekdays);
}
// Retrieves data, to display selected week days
$arrayWeekDays = $data->weekdays;
foreach ($arrayWeekDays as $allTest)
{
if ($allTest == '')
{
$data->weekdays = '0,1,2,3,4,5,6';
}
}
// Set displaytime default value
if ( ! isset($data->displaytime))
{
$data->displaytime = JComponentHelper::getParams('com_icagenda')->get('displaytime', '1');
}
// Set Features
$data->features = $this->getFeatures($data->id);
// Convert features into an array so that the form control can be set
if ( ! isset($data->features))
{
$data->features = array();
}
if ( ! is_array($data->features))
{
$data->features = explode(',', $data->features);
}
return $data;
}
/**
* Method to save the form data.
*
* @param array $data The form data.
*
* @return boolean True on success.
*
* @since 3.4.0
*/
public function save($data)
{
$input = JFactory::getApplication()->input;
$date = JFactory::getDate();
$user = JFactory::getUser();
// Fix version before 3.4.0 to set a created date (will use last modified date if exists, or current date)
if (empty($data['created']))
{
$data['created'] = ( ! empty($data['modified'])) ? $data['modified'] : $date->toSql();
}
// Alter the title for save as copy
if ($input->get('task') == 'save2copy')
{
$origTable = clone $this->getTable();
$origTable->load($input->getInt('id'));
if ($data['title'] == $origTable->title)
{
list($title, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['title']);
$data['title'] = $title;
$data['alias'] = $alias;
}
else
{
if ($data['alias'] == $origTable->alias)
{
$data['alias'] = '';
}
}
$data['state'] = 0;
}
// Automatic handling of alias for empty fields
if (in_array($input->get('task'), array('apply', 'save', 'save2new')) && (int) $input->get('id') == 0)
{
if ($data['alias'] == null)
{
if (JFactory::getConfig()->get('unicodeslugs') == 1)
{
$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
}
else
{
$data['alias'] = JFilterOutput::stringURLSafe($data['title']);
}
$table = JTable::getInstance('Event', 'iCagendaTable');
if ($table->load(array('alias' => $data['alias'], 'catid' => $data['catid'])))
{
$msg = JText::_('COM_ICAGENDA_ALERT_EVENT_SAVE_WARNING');
}
list($title, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['title']);
$data['alias'] = $alias;
if (isset($msg))
{
JFactory::getApplication()->enqueueMessage($msg, 'warning');
}
}
}
// Generates Alias if empty
if ($data['alias'] == null || empty($data['alias']))
{
$data['alias'] = JFilterOutput::stringURLSafe($data['title']);
if ($data['alias'] == null || empty($data['alias']))
{
if (JFactory::getConfig()->get('unicodeslugs') == 1)
{
$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
}
else
{
$data['alias'] = JFilterOutput::stringURLSafe($data['created']);
}
}
}
// Set File Uploaded
if ( ! isset($data['file']))
{
$file = JRequest::getVar('jform', null, 'files', 'array');
$fileUrl = $this->upload($file);
$data['file'] = $fileUrl;
}
// Set Creator infos
$userId = $user->get('id');
$userName = $user->get('name');
if (empty($data['created_by']))
{
$data['created_by'] = (int) $userId;
}
$data['username'] = $userName;
// Set Params
if (isset($data['params']) && is_array($data['params']))
{
// Convert the params field to a string.
$parameter = new JRegistry;
$parameter->loadArray($data['params']);
$data['params'] = (string)$parameter;
}
// Get Event ID from the result back to the Table after saving.
$table = $this->getTable();
if ($table->save($data) === true)
{
$data['id'] = $table->id;
}
else
{
$data['id'] = null;
}
if (parent::save($data))
{
// Save Features to database
$this->maintainFeatures($data);
// Save Custom Fields to database
if (isset($data['custom_fields']) && is_array($data['custom_fields']))
{
icagendaCustomfields::saveToData($data['custom_fields'], $data['id'], 2);
}
return true;
}
return false;
}
/**
* Upload
*
* @since 3.5.3
*/
function upload($file)
{
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$filename = JFile::makeSafe($file['name']['file']);
// Get media path
$params_media = JComponentHelper::getParams('com_media');
$image_path = $params_media->get('image_path', 'images');
// Paths to thumbs folder
$thumbsPath = $image_path . '/icagenda/thumbs';
if ($filename != '')
{
$src = $file['tmp_name']['file'];
$dest = JPATH_SITE . '/' . $image_path . '/icagenda/files/' . $filename;
if ( ! is_dir($dest))
{
mkdir($intDir, 0755);
}
if (JFile::upload($src, $dest, false))
{
echo 'upload';
return $image_path . '/icagenda/files/' . $filename;
}
return $image_path . '/icagenda/files/' . $filename;
}
}
/**
* Maintain features to data
*
* @since 3.4.0
*/
protected function maintainFeatures($data)
{
// Get the list of feature ids to be linked to the event
$features = isset($data['features']) && is_array($data['features']) ? implode(',', $data['features']) : '';
$db = JFactory::getDbo();
// Write any new feature records to the icagenda_feature_xref table
if ( ! empty($features))
{
// Get a list of the valid features already present for this event
$query = $db->getQuery(true);
$query->select('feature_id')
->from($db->qn('#__icagenda_feature_xref'));
$query->where('event_id = ' . (int) $data['id']);
$query->where('feature_id IN (' . $features . ')');
$db->setQuery($query);
$existing_features = $db->loadColumn(0);
// Identify the insert list
if (empty($existing_features))
{
$new_features = $data['features'];
}
else
{
$new_features = array();
foreach ($data['features'] as $feature)
{
if ( ! in_array($feature, $existing_features))
{
$new_features[] = $feature;
}
}
}
// Write the needed xref records
if ( ! empty($new_features))
{
$xref = new JObject;
$xref->set('event_id', $data['id']);
foreach ($new_features as $feature)
{
$xref->set('feature_id', $feature);
$db->insertObject('#__icagenda_feature_xref', $xref);
$db->setQuery($query);
if ( ! $db->execute())
{
return false;
}
}
}
}
// Delete any unwanted feature records from the icagenda_feature_xref table
$query = $db->getQuery(true);
$query->delete($db->qn('#__icagenda_feature_xref'));
$query->where('event_id = ' . (int) $data['id']);
if ( ! empty($features))
{
// Delete only unwanted features
$query->where('feature_id NOT IN (' . $features . ')');
}
$db->setQuery($query);
$db->execute($query);
if ( ! $db->execute())
{
return false;
}
return true;
}
/**
* Extracts the list of Feature IDs linked to the event and returns an array
*
* @param integer $event_id
*
* @return array/integer Set of Feature IDs
*
* @since 3.5.3
*/
protected function getFeatures($event_id)
{
// Write any new feature records to the icagenda_feature_xref table
if (empty($event_id))
{
return '';
}
else
{
$db = JFactory::getDbo();
// Get a comma separated list of the ids of features present for this event
// Note: Direct extraction of a comma separated list is avoided because each db type uses proprietary syntax
$query = $db->getQuery(true);
$query->select('fx.feature_id')
->from($db->qn('#__icagenda_events', 'e'))
->innerJoin('#__icagenda_feature_xref AS fx ON e.id=fx.event_id')
->innerJoin('#__icagenda_feature AS f ON fx.feature_id=f.id AND f.state=1');
$query->where('e.id = ' . (int) $event_id);
$db->setQuery($query);
$features = $db->loadColumn(0);
// Return a comma separated list
return implode(',', $features);
}
}
/**
* Approve Function.
*
* @since 3.2.0
*/
function approve($cid, $publish)
{
if (count($cid))
{
JArrayHelper::toInteger($cid);
$cids = implode( ',', $cid );
$query = 'UPDATE #__icagenda_events'
. ' SET approval = '.(int) $publish
. ' WHERE id IN ( '.$cids.' )';
$this->_db->setQuery( $query );
if ( ! $this->_db->query())
{
$this->setError($this->_db->getErrorMsg());
return false;
}
}
return true;
}
/**
* Method to test whether a record can be deleted.
*
* @param object $record A record object.
*
* @return boolean True if allowed to delete the record. Defaults to the permission set in the component.
*
* @since 3.6.0
*/
// protected function canDelete($record)
// {
// if ( ! empty($record->id))
// {
// if ($record->state != -2)
// {
// return false;
// }
// $user = JFactory::getUser();
// return $user->authorise('core.delete', 'com_icagenda.event.' . (int) $record->id);
// }
// return false;
// }
/**
* Method to test whether a record can have its state edited.
*
* @param object $record A record object.
*
* @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component.
*
* @since 3.6.0
*/
// protected function canEditState($record)
// {
// $user = JFactory::getUser();
// Check for existing event.
// if (!empty($record->id))
// {
// return $user->authorise('core.edit.state', 'com_icagenda.event.' . (int) $record->id);
// }
// New event, so check against the category.
// elseif (!empty($record->catid))
// {
// return $user->authorise('core.edit.state', 'com_icagenda.event.' . (int) $record->catid);
// }
// Default to component settings if neither event nor category known.
// else
// {
// return parent::canEditState('com_icagenda');
// }
// }
}