855 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			855 lines
		
	
	
		
			32 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\Table\Table;
 | |
| use Joomla\CMS\Language\Text;
 | |
| use Joomla\CMS\Plugin\PluginHelper;
 | |
| use Joomla\Registry\Registry;
 | |
| use Joomla\CMS\Log\Log;
 | |
| 
 | |
| require_once __DIR__ . '/admin.php';
 | |
| 
 | |
| /**
 | |
|  * Event model.
 | |
|  */
 | |
| class JemModelEvent extends JemModelAdmin
 | |
| {
 | |
|     /**
 | |
|      * Method to change the published state of one or more records.
 | |
|      *
 | |
|      * @param  array   &$pks  A list of the primary keys to change.
 | |
|      * @param  integer $value The value of the published state.
 | |
|      *
 | |
|      * @return boolean True on success.
 | |
|      *
 | |
|      * @since  2.2.2
 | |
|      */
 | |
|     public function publish(&$pks, $value = 1)
 | |
|     {
 | |
|         // Additionally include the JEM plugins for the onContentChangeState event.
 | |
|         PluginHelper::importPlugin('jem');
 | |
| 
 | |
|         return parent::publish($pks, $value);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to test whether a record can be deleted.
 | |
|      *
 | |
|      * @param  object  A record object.
 | |
|      * @return boolean True if allowed to delete the record. Defaults to the permission set in the component.
 | |
|      */
 | |
|     protected function canDelete($record)
 | |
|     {
 | |
|         $result = false;
 | |
| 
 | |
|         if (!empty($record->id) && ($record->published == -2)) {
 | |
|             $user = JemFactory::getUser();
 | |
| 
 | |
|             $result = $user->can('delete', 'event', $record->id, $record->created_by, !empty($record->catid) ? $record->catid : false);
 | |
|         }
 | |
| 
 | |
|         return $result;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to test whether a record can be published/unpublished.
 | |
|      *
 | |
|      * @param  object  A record object.
 | |
|      * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component.
 | |
|      */
 | |
|     protected function canEditState($record)
 | |
|     {
 | |
|         $user = JemFactory::getUser();
 | |
| 
 | |
|         $id    = isset($record->id) ? $record->id : false; // isset ensures 0 !== false
 | |
|         $owner = !empty($record->created_by) ? $record->created_by : false;
 | |
|         $cats  = !empty($record->catid) ? array($record->catid) : false;
 | |
| 
 | |
|         return $user->can('publish', 'event', $id, $owner, $cats);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns a reference to the a Table object, always creating it.
 | |
|      *
 | |
|      * @param  type   The table type to instantiate
 | |
|      * @param  string A prefix for the table class name. Optional.
 | |
|      * @param  array  Configuration array for model. Optional.
 | |
|      * @return Table A database object
 | |
|      */
 | |
|     public function getTable($type = 'Event', $prefix = 'JemTable', $config = array())
 | |
|     {
 | |
|         return Table::getInstance($type, $prefix, $config);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 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
 | |
|      */
 | |
|     public function getForm($data = array(), $loadData = true)
 | |
|     {
 | |
|         // Get the form.
 | |
|         $form = $this->loadForm('com_jem.event', 'event', array('control' => 'jform', 'load_data' => $loadData));
 | |
|         if (empty($form)) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return $form;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to get a single record.
 | |
|      *
 | |
|      * @param  integer The id of the primary key.
 | |
|      *
 | |
|      * @return mixed   Object on success, false on failure.
 | |
|      */
 | |
|     public function getItem($pk = null)
 | |
|     {
 | |
|         $jemsettings = JemAdmin::config();
 | |
| 
 | |
|         if ($item = parent::getItem($pk)){
 | |
|             // Convert the params field to an array.
 | |
|             // (this may throw an exception - but there is nothings we can do)
 | |
|             $registry = new Registry;
 | |
|             $registry->loadString($item->attribs ?? '{}');
 | |
|             $item->attribs = $registry->toArray();
 | |
| 
 | |
|             // Convert the metadata field to an array.
 | |
|             $registry = new Registry;
 | |
|             $registry->loadString($item->metadata ?? '{}');
 | |
|             $item->metadata = $registry->toArray();
 | |
| 
 | |
|             $item->articletext = ($item->fulltext && trim($item->fulltext) != '') ? $item->introtext . "<hr id=\"system-readmore\" />" . $item->fulltext : $item->introtext;
 | |
| 
 | |
|             $db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 
 | |
|             $query = $db->getQuery(true);
 | |
|             $query->select('SUM(places)');
 | |
|             $query->from('#__jem_register');
 | |
|             $query->where(array('event= '.$db->quote($item->id), 'status=1', 'waiting=0'));
 | |
| 
 | |
|             $db->setQuery($query);
 | |
|             $res = $db->loadResult();
 | |
|             $item->booked = $res;
 | |
| 
 | |
|             $files = JemAttachment::getAttachments('event'.$item->id);
 | |
|             $item->attachments = $files;
 | |
| 
 | |
|             if ($item->id){
 | |
|                 // Store current recurrence values
 | |
|                 $item->recurr_bak = new stdClass;
 | |
|                 foreach (get_object_vars($item) as $k => $v) {
 | |
|                     if (strncmp('recurrence_', $k, 11) === 0) {
 | |
|                         $item->recurr_bak->$k = $v;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $item->author_ip = $jemsettings->storeip ? JemHelper::retrieveIP() : false;
 | |
| 
 | |
|             if (empty($item->id)){
 | |
|                 $item->country = $jemsettings->defaultCountry;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $item;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to get the data that should be injected in the form.
 | |
|      */
 | |
|     protected function loadFormData()
 | |
|     {
 | |
|         // Check the session for previously entered form data.
 | |
|         $data = Factory::getApplication()->getUserState('com_jem.edit.event.data', array());
 | |
| 
 | |
|         if (empty($data)){
 | |
|             $data = $this->getItem();
 | |
|         }
 | |
| 
 | |
|         return $data;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Prepare and sanitise the table data prior to saving.
 | |
|      *
 | |
|      * @param  $table Table-object.
 | |
|      */
 | |
|     protected function _prepareTable($table)
 | |
|     {
 | |
|         $jinput = Factory::getApplication()->input;
 | |
| 
 | |
|         $db = Factory::getContainer()->get('DatabaseDriver');
 | |
|         $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES);
 | |
| 
 | |
|         // Increment version number.
 | |
|         $table->version ++;
 | |
| 
 | |
|         //get time-values from time selectlist and combine them accordingly
 | |
|         $starthours   = $jinput->get('starthours','','cmd');
 | |
|         $startminutes = $jinput->get('startminutes','','cmd');
 | |
|         $endhours     = $jinput->get('endhours','','cmd');
 | |
|         $endminutes   = $jinput->get('endminutes','','cmd');
 | |
| 
 | |
|         // StartTime
 | |
|         if ($starthours != '' && $startminutes != '') {
 | |
|             $table->times = $starthours.':'.$startminutes;
 | |
|         } else if ($starthours != '' && $startminutes == '') {
 | |
|             $startminutes = "00";
 | |
|             $table->times = $starthours.':'.$startminutes;
 | |
|         } else if ($starthours == '' && $startminutes != '') {
 | |
|             $starthours = "00";
 | |
|             $table->times = $starthours.':'.$startminutes;
 | |
|         } else {
 | |
|             $table->times = "";
 | |
|         }
 | |
| 
 | |
|         // EndTime
 | |
|         if ($endhours != '' && $endminutes != '') {
 | |
|             $table->endtimes = $endhours.':'.$endminutes;
 | |
|         } else if ($endhours != '' && $endminutes == '') {
 | |
|             $endminutes = "00";
 | |
|             $table->endtimes = $endhours.':'.$endminutes;
 | |
|         } else if ($endhours == '' && $endminutes != '') {
 | |
|             $endhours = "00";
 | |
|             $table->endtimes = $endhours.':'.$endminutes;
 | |
|         } else {
 | |
|             $table->endtimes = "";
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to save the form data.
 | |
|      *
 | |
|      * @param  $data array
 | |
|      */
 | |
|     public function save($data)
 | |
|     {
 | |
|         // Variables
 | |
|         $app         = Factory::getApplication();
 | |
|         $jinput      = $app->input;
 | |
|         $jemsettings = JemHelper::config();
 | |
|         $table       = $this->getTable();
 | |
| 
 | |
|         // Check if we're in the front or back
 | |
|         $backend = (bool)$app->isClient('administrator');
 | |
|         $new     = (bool)empty($data['id']);
 | |
| 
 | |
|         // Variables
 | |
|         $cats                 = $data['cats'];
 | |
|         $invitedusers         = isset($data['invited']) ? $data['invited'] : '';
 | |
|         $recurrencenumber     = $jinput->get('recurrence_number', '', 'int');
 | |
|         $recurrencebyday      = $jinput->get('recurrence_byday', '', 'string');
 | |
|         $metakeywords         = $jinput->get('meta_keywords', '', '');
 | |
|         $metadescription      = $jinput->get('meta_description', '', '');
 | |
|         $task                 = $jinput->get('task', '', 'cmd');
 | |
|         $data['metadata']     = isset($data['metadata']) ? $data['metadata'] : '';
 | |
|         $data['attribs']      = isset($data['attribs']) ? $data['attribs'] : '';
 | |
|         $data['ordering']     = isset($data['ordering']) ? $data['ordering'] : '';
 | |
| 
 | |
|         // convert international date formats...
 | |
|         $db = Factory::getContainer()->get('DatabaseDriver');
 | |
|         if (!empty($data['dates']) && ($data['dates'] != null)) {
 | |
|             $d = Factory::getDate($data['dates'], 'UTC');
 | |
|             $data['dates'] = $d->format('Y-m-d', true, false);
 | |
|         }
 | |
|         if (!empty($data['enddates']) && ($data['enddates'] != null)) {
 | |
|             $d = Factory::getDate($data['enddates'], 'UTC');
 | |
|             $data['enddates'] = $d->format('Y-m-d', true, false);
 | |
|         }
 | |
|         if (!empty($data['recurrence_limit_date']) && ($data['recurrence_limit_date'] != null)) {
 | |
|             $d = Factory::getDate($data['recurrence_limit_date'], 'UTC');
 | |
|             $data['recurrence_limit_date'] = $d->format('Y-m-d', true, false);
 | |
|         }
 | |
| 
 | |
|         // Load the event from db, detect if the event isn't new and is recurrence type.
 | |
|         // In this case, the event just needs to be updated if the recurrence setting hasn't changed.
 | |
|         $save = true;
 | |
| 
 | |
|         if(!$new && $data["recurrence_type"]) {
 | |
| 
 | |
|             // This is event exist in event table and it's recurrence
 | |
|             $save = false;
 | |
|             $this->eventid = $data["id"];
 | |
| 
 | |
|             // Get data event in DB
 | |
|             $eventdb = (array)$this->getEventAllData();
 | |
| 
 | |
|             // Categories
 | |
|             $eventdb ['cats'] = $this->getEventCats();
 | |
|             if(isset($data['cats'][0])){
 | |
|                 $data['cats'] = implode(',', $data['cats']);
 | |
|             }
 | |
| 
 | |
|             // Times
 | |
|             if ($_REQUEST['starthours']){
 | |
|                 $starthours    = $jinput->get('starthours', '', 'int');
 | |
|                 $startminutes = $jinput->get('startminutes', '', 'int');
 | |
|                 if ($startminutes){
 | |
|                     $data['times'] = str_pad($starthours,2,'0', STR_PAD_LEFT) . ':' . str_pad($startminutes,2,'0', STR_PAD_LEFT) . ':00';
 | |
|                 } else {
 | |
|                     $data['times'] = str_pad($starthours,2,'0', STR_PAD_LEFT) . ':00:00';
 | |
|                 }
 | |
|             } else {
 | |
|                 $data['times'] = null;
 | |
|             }
 | |
| 
 | |
|             //Endtimes
 | |
|             if ($_REQUEST['endhours']){
 | |
|                 $endhours   = $jinput->get('endhours', '', 'int');
 | |
|                 $endminutes = $jinput->get('endminutes', '', 'int');
 | |
| 
 | |
|                 if ($endminutes){
 | |
|                     $data['endtimes'] = str_pad($endhours,2,'0', STR_PAD_LEFT) . ':' . str_pad($endminutes,2,'0', STR_PAD_LEFT) . ':00';
 | |
|                 } else {
 | |
|                     $data['endtimes'] = str_pad($endhours,2,'0', STR_PAD_LEFT) . ':00:00';
 | |
|                 }
 | |
|             } else {
 | |
|                 $data['endtimes'] = null;
 | |
|             }
 | |
| 
 | |
|             // Alias
 | |
|             if(isset($data['alias'])) {
 | |
|                 if (!$data['alias']) {
 | |
|                     $alias = strtolower($data['title']);
 | |
|                     $alias = preg_replace('/[^a-z0-9]+/i', '-', $alias);
 | |
|                     $alias = preg_replace('/-+/', '-', $alias);
 | |
|                     $data['alias'] = trim($alias, '-');
 | |
|                 }
 | |
|             }else{
 | |
|                 $data['alias'] = $eventdb['alias'];
 | |
|             }
 | |
| 
 | |
|             // Introtext
 | |
|             $data['introtext'] = $data['articletext'];
 | |
| 
 | |
|             // Contact
 | |
|             if($data['contactid'] == ''){
 | |
|                 $data['contactid'] = 0;
 | |
|             }
 | |
| 
 | |
|             // Times <= Endtimes
 | |
|             if($data['enddates']!== null && $data['enddates'] != ''){
 | |
|                 if($data['dates'] > $data['enddates']){
 | |
|                     Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_EVENT_ERROR_END_BEFORE_START_DATES') . ' [ID:' . $data['id'] . ']', 'error');
 | |
|                     return false;
 | |
|                 } else {
 | |
|                     if($data['dates'] == $data['enddates']){
 | |
|                         if($data['endtimes'] !== null && $data['endtimes'] != '') {
 | |
|                             if ($data['times'] > $data['endtimes']) {
 | |
|                                 Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_EVENT_ERROR_END_BEFORE_START_TIMES') . ' [ID:' . $data['id'] . ']', 'error');
 | |
|                                 return false;
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Get the fields changed
 | |
|             $diff = array_diff_assoc($data, $eventdb);
 | |
| 
 | |
|             //If $diff contains some of fields (Defined in $fieldNotAllow) then dissolve recurrence and save again serie
 | |
|             //If not, update de field of this event (save=false).
 | |
|             $fieldNotAllow = ['recurrence_first_id', 'recurrence_number', 'recurrence_type', 'recurrence_counter', 'recurrence_limit', 'recurrence_limit_date', 'recurrence_byday'];
 | |
|             foreach ($diff as $d => $value) {
 | |
|                 if (in_array($d, $fieldNotAllow)) {
 | |
|                     // This event must be updated its fields
 | |
|                     $data[$d] =  $value;
 | |
|                     $save = true;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // If $save is true and recurrence_first_id != 0 then this event must be the first event of a new recurrence (series)
 | |
|             if($save){
 | |
|                 if($eventdb['recurrence_first_id'] != 0) {
 | |
| 				
 | |
| 					// Convert to root event
 | |
|                     $data['recurrence_first_id'] = 0;
 | |
| 
 | |
|                     // Copy the recurrence data if it doesn't exist
 | |
|                     if (!isset($data['recurrence_number'])) {
 | |
|                         $data['recurrence_number'] = $eventdb['recurrence_number'];
 | |
|                     }
 | |
|                     if (!isset($data['recurrence_type'])) {
 | |
|                         $data['recurrence_type'] = $eventdb['recurrence_type'];
 | |
|                     }
 | |
|                     if (!isset($data['recurrence_counter'])) {
 | |
|                         $data['recurrence_counter'] = $eventdb['recurrence_counter'];
 | |
|                     }
 | |
|                     if (!isset($data['recurrence_limit'])) {
 | |
|                         $data['recurrence_limit'] = $eventdb['recurrence_limit'];
 | |
|                     }
 | |
|                     if (!isset($data['recurrence_limit_date'])) {
 | |
|                         $data['recurrence_limit_date'] = $eventdb['recurrence_limit_date'];
 | |
|                     }
 | |
|                     if (!isset($data['recurrence_byday'])) {
 | |
|                         $data['recurrence_byday'] = $eventdb['recurrence_byday'];
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if($save) {
 | |
| 
 | |
|             // set to null if registration is empty
 | |
|             if($data['registra_from'] == ''){
 | |
|                 $data['registra_from'] = null;
 | |
|             }
 | |
|             if($data['registra_until'] == ''){
 | |
|                 $data['registra_until'] = null;
 | |
|             }
 | |
|             if($data['unregistra_until'] == ''){
 | |
|                 $data['unregistra_until'] = null;
 | |
|             }
 | |
|             if($data['reginvitedonly']== null){
 | |
|                 $data['reginvitedonly'] = 0;
 | |
|             }
 | |
| 
 | |
|             // event maybe first of recurrence set -> dissolve complete set
 | |
|             if (JemHelper::dissolve_recurrence($data['id'])) {
 | |
|                 $this->cleanCache();
 | |
|             }
 | |
| 
 | |
|             if ($data['dates'] == null || $data['recurrence_type'] == '0') {
 | |
|                 $data['recurrence_number'] = '0';
 | |
|                 $data['recurrence_byday'] = '0';
 | |
|                 $data['recurrence_counter'] = '0';
 | |
|                 $data['recurrence_type'] = '0';
 | |
|                 $data['recurrence_limit'] = '0';
 | |
|                 $data['recurrence_limit_date'] = null;
 | |
|                 $data['recurrence_first_id'] = '0';
 | |
|             } else {
 | |
|                 if (!$new) {
 | |
|                     // edited event maybe part of a recurrence set
 | |
|                     // -> drop event from set
 | |
|                     $data['recurrence_first_id'] = '0';
 | |
|                     $data['recurrence_counter'] = '0';
 | |
|                 }
 | |
| 
 | |
|                 $data['recurrence_number'] = $recurrencenumber;
 | |
|                 $data['recurrence_byday'] = $recurrencebyday;
 | |
| 
 | |
|                 if (!empty($data['recurrence_limit_date']) && ($data['recurrence_limit_date'] != null)) {
 | |
|                     $d = Factory::getDate($data['recurrence_limit_date'], 'UTC');
 | |
|                     $data['recurrence_limit_date'] = $d->format('Y-m-d', true, false);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $data['meta_keywords'] = $metakeywords;
 | |
|             $data['meta_description'] = $metadescription;
 | |
| 
 | |
|             // Store IP of author only.
 | |
|             if ($new) {
 | |
|                 $author_ip = $jinput->get('author_ip', '', 'string');
 | |
|                 $data['author_ip'] = $author_ip;
 | |
|             }
 | |
| 
 | |
|             // Store as copy - reset creation date, modification fields, hit counter, version
 | |
|             if ($task == 'save2copy') {
 | |
|                 unset($data['created']);
 | |
|                 unset($data['modified']);
 | |
|                 unset($data['modified_by']);
 | |
|                 unset($data['version']);
 | |
|                 unset($data['hits']);
 | |
|             }
 | |
| 
 | |
|             // Save the event
 | |
|             $saved = parent::save($data);
 | |
| 
 | |
|             if ($saved) {
 | |
|                 // At this point we do have an id.
 | |
|                 $pk = $this->getState($this->getName() . '.id');
 | |
| 
 | |
|                 if (isset($data['featured'])) {
 | |
|                     $this->featured($pk, $data['featured']);
 | |
|                 }
 | |
| 
 | |
|                 // on frontend attachment uploads maybe forbidden
 | |
|                 // so allow changing name or description only
 | |
|                 $allowed = $backend || ($jemsettings->attachmentenabled > 0);
 | |
| 
 | |
|                 if ($allowed) {
 | |
|                     // attachments, new ones first
 | |
|                     $attachments = $jinput->files->get('attach', array(), 'array');
 | |
|                     $attach_name = $jinput->post->get('attach-name', array(), 'array');
 | |
|                     $attach_descr = $jinput->post->get('attach-desc', array(), 'array');
 | |
|                     $attach_access = $jinput->post->get('attach-access', array(), 'array');
 | |
|                     foreach ($attachments as $n => &$a) {
 | |
|                         $a['customname'] = array_key_exists($n, $attach_access) ? $attach_name[$n] : '';
 | |
|                         $a['description'] = array_key_exists($n, $attach_access) ? $attach_descr[$n] : '';
 | |
|                         $a['access'] = array_key_exists($n, $attach_access) ? $attach_access[$n] : '';
 | |
|                     }
 | |
|                     JemAttachment::postUpload($attachments, 'event' . $pk);
 | |
|                 }
 | |
| 
 | |
|                 // and update old ones
 | |
|                 $old = array();
 | |
|                 $old['id'] = $jinput->post->get('attached-id', array(), 'array');
 | |
|                 $old['name'] = $jinput->post->get('attached-name', array(), 'array');
 | |
|                 $old['description'] = $jinput->post->get('attached-desc', array(), 'array');
 | |
|                 $old['access'] = $jinput->post->get('attached-access', array(), 'array');
 | |
| 
 | |
|                 foreach ($old['id'] as $k => $id) {
 | |
|                     $attach = array();
 | |
|                     $attach['id'] = $id;
 | |
|                     $attach['name'] = $old['name'][$k];
 | |
|                     $attach['description'] = $old['description'][$k];
 | |
|                     if ($allowed) {
 | |
|                         $attach['access'] = $old['access'][$k];
 | |
|                     } // else don't touch this field
 | |
|                     JemAttachment::update($attach);
 | |
|                 }
 | |
| 
 | |
|                 // Store cats
 | |
|                 if (!$this->_storeCategoriesSelected($pk, $cats, !$backend, $new)) {
 | |
|                     //	JemHelper::addLogEntry('Error storing categories for event ' . $pk, __METHOD__, Log::ERROR);
 | |
|                     $this->setError(Text::_('COM_JEM_EVENT_ERROR_STORE_CATEGORIES'));
 | |
|                     $saved = false;
 | |
|                 }
 | |
| 
 | |
|                 // Store invited users (frontend only, on backend no attendees on editevent view)
 | |
|                 if (!$backend && ($jemsettings->regallowinvitation == 1)) {
 | |
|                     if (!$this->_storeUsersInvited($pk, $invitedusers, !$backend, $new)) {
 | |
|                         //	JemHelper::addLogEntry('Error storing users invited for event ' . $pk, __METHOD__, Log::ERROR);
 | |
|                         $this->setError(Text::_('COM_JEM_EVENT_ERROR_STORE_INVITED_USERS'));
 | |
|                         $saved = false;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // check for recurrence
 | |
|                 // when filled it will perform the cleanup function
 | |
|                 $table->load($pk);
 | |
|                 if (($table->recurrence_number > 0) && ($table->dates != null)) {
 | |
|                     JemHelper::cleanup(2); // 2 = force on save, needs special attention
 | |
|                 }
 | |
|             }
 | |
|         }else{
 | |
|             // Update field of this event
 | |
|             $fieldAllow=['title', 'locid', 'cats', 'dates', 'enddates', 'times', 'endtimes', 'title', 'alias', 'modified', 'modified_by', 'version', 'author_ip', 'created', 'introtext', 'meta_keywords', 'meta_description', 'datimage', 'checked_out', 'checked_out_time', 'registra', 'registra_from', 'registra_until', 'unregistra', 'unregistra_until', 'maxplaces', 'minbookeduser', 'maxbookeduser', 'reservedplaces', 'waitinglist', 'requestanswer', 'seriesbooking', 'singlebooking', 'published', 'contactid', 'custom1', 'custom2', 'custom3', 'custom4', 'custom5', 'custom6', 'custom7', 'custom8', 'custom9', 'custom10', 'fulltext', 'created_by_alias', 'access', 'featured', 'language'];
 | |
|             $saved = true;
 | |
|             $fieldsupdated="";
 | |
|             foreach ($diff as $d => $value){
 | |
|                 if(in_array($d, $fieldAllow)) {
 | |
|                     $this->updateField($data['id'], $d, $value);
 | |
|                     $fieldsupdated = $fieldsupdated . ($fieldsupdated!=''? ', ':'') . $d;
 | |
|                 }
 | |
|             }
 | |
|             if($fieldsupdated!='') {
 | |
|                 Factory::getApplication()->enqueueMessage(Text::_('COM_JEM_EVENT_FIELDS_EVENT_UPDATED') . ' ' . $fieldsupdated . ' [ID:' . $data['id'] . ']', 'info');
 | |
|             }
 | |
|             $table->load($data['id']);
 | |
|             if (isset($table->id)) {
 | |
|                 $this->setState($this->getName() . '.id', $table->id);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $saved;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Get event all data
 | |
|      *
 | |
|      * @access public
 | |
|      * @return object
 | |
|      */
 | |
|     public function getEventAllData()
 | |
|     {
 | |
|         $db = Factory::getContainer()->get('DatabaseDriver');
 | |
|         $query = $db->getQuery(true);
 | |
|         $query->select('*');
 | |
|         $query->from('#__jem_events');
 | |
|         $query->where('id = '.$db->Quote($this->eventid));
 | |
|         $db->setQuery( $query );
 | |
|         $event = $db->loadObject();
 | |
| 
 | |
|         return $event;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Get categories of event
 | |
|      *
 | |
|      * @access public
 | |
|      * @return string
 | |
|      */
 | |
|     public function getEventCats()
 | |
|     {
 | |
|         $db = Factory::getContainer()->get('DatabaseDriver');
 | |
|         $query = $db->getQuery(true);
 | |
|         $query->select('GROUP_CONCAT(catid) as cats');
 | |
|         $query->from('#__jem_cats_event_relations');
 | |
|         $query->where('itemid = '.$db->Quote($this->eventid));
 | |
|         $db->setQuery( $query );
 | |
|         $cats = $db->loadResult();
 | |
| 
 | |
|         return $cats;
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * Method to update cats_event_selections table.
 | |
|      * Records of previously selected categories will be removed
 | |
|      * and newly selected categories will be stored.
 | |
|      * Because user may not have permissions for all categories on frontend
 | |
|      * records with non-permitted categories will be untouched.
 | |
|      *
 | |
|      * @param  int     The event id.
 | |
|      * @param  array   The categories user has selected.
 | |
|      * @param  bool    Flag to indicate if we are on frontend
 | |
|      * @param  bool    Flag to indicate new event
 | |
|      *
 | |
|      * @return boolean True on success.
 | |
|      */
 | |
|     protected function _storeCategoriesSelected($eventId, $categories, $frontend, $new)
 | |
|     {
 | |
|         $user = JemFactory::getUser();
 | |
|         $db   = Factory::getContainer()->get('DatabaseDriver');
 | |
| 
 | |
|         $eventId = (int)$eventId;
 | |
|         if (empty($eventId) || !is_array($categories)) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         // get previous entries
 | |
|         $query = $db->getQuery(true);
 | |
|         $query->select('catid')
 | |
|             ->from('#__jem_cats_event_relations')
 | |
|             ->where('itemid = ' . $eventId)
 | |
|             ->order('catid');
 | |
|         $db->setQuery($query);
 | |
|         $cur_cats = $db->loadColumn();
 | |
| 
 | |
|         if (!is_array($cur_cats)) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $ret = true;
 | |
|         $del_cats = array_diff($cur_cats, $categories);
 | |
|         $add_cats = array_diff($categories, $cur_cats);
 | |
| 
 | |
|         /* Attention!
 | |
|          *  On frontend user maybe not permitted to see all categories attached.
 | |
|          *  But these categories must not removed from this event!
 | |
|          */
 | |
|         if ($frontend) {
 | |
|             // Note: JFormFieldCatOptions calls the same function to know which categories user is allowed (un)select.
 | |
|             $limit_cats = array_keys($user->getJemCategories($new ? array('add') : array('add', 'edit'), 'event'));
 | |
|             $del_cats = array_intersect($del_cats, $limit_cats);
 | |
|             $add_cats = array_intersect($add_cats, $limit_cats);
 | |
|         }
 | |
| 
 | |
|         if (!empty($del_cats)) {
 | |
|             $query = $db->getQuery(true);
 | |
|             $query->delete($db->quoteName('#__jem_cats_event_relations'));
 | |
|             $query->where('itemid = ' . $eventId);
 | |
|             $query->where('catid IN (' . implode(',', $del_cats) . ')');
 | |
|             $db->setQuery($query);
 | |
|             $ret &= ($db->execute() !== false);
 | |
|         }
 | |
| 
 | |
|         if (!empty($add_cats)) {
 | |
|             $query = $db->getQuery(true);
 | |
|             $query->insert($db->quoteName('#__jem_cats_event_relations'))
 | |
|                 ->columns($db->quoteName(array('catid', 'itemid','ordering')));
 | |
|             foreach ($add_cats as $catid) {
 | |
|                 $query->values((int)$catid . ',' . $eventId.','.'0');
 | |
|             }
 | |
|             $db->setQuery($query);
 | |
|             $ret &= ($db->execute() !== false);
 | |
|         }
 | |
| 
 | |
|         return $ret;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to update cats_event_selections table.
 | |
|      * Records of previously selected categories will be removed
 | |
|      * and newly selected categories will be stored.
 | |
|      * Because user may not have permissions for all categories on frontend
 | |
|      * records with non-permitted categories will be untouched.
 | |
|      *
 | |
|      * @param  int     The event id.
 | |
|      * @param  mixed   The user ids as array or comma separated string.
 | |
|      * @param  bool    Flag to indicate if we are on frontend
 | |
|      * @param  bool    Flag to indicate new event
 | |
|      *
 | |
|      * @return boolean True on success.
 | |
|      */
 | |
|     protected function _storeUsersInvited($eventId, $users, $frontend, $new)
 | |
|     {
 | |
|         $eventId = (int)$eventId;
 | |
|         if (!is_array($users)) {
 | |
|             $users = explode(',', $users);
 | |
|         }
 | |
|         $users = array_unique($users);
 | |
|         $users = array_filter($users);
 | |
| 
 | |
|         if (empty($eventId)) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 
 | |
|         # Get current registrations
 | |
|         $query = $db->getQuery(true);
 | |
|         $query->select(array('reg.id, reg.uid, reg.status, reg.waiting'));
 | |
|         $query->from('#__jem_register As reg');
 | |
|         $query->where('reg.event = ' . $eventId);
 | |
|         $db->setQuery($query);
 | |
|         $regs = $db->loadObjectList('uid');
 | |
| 
 | |
|         PluginHelper::importPlugin('jem');
 | |
|         $dispatcher = JemFactory::getDispatcher();
 | |
| 
 | |
|         # Add new records, ignore users already registered
 | |
|         foreach ($users AS $user)
 | |
|         {
 | |
|             if (!array_key_exists($user, $regs)) {
 | |
|                 $query = $db->getQuery(true);
 | |
|                 $query->insert('#__jem_register');
 | |
|                 $query->columns(array('event', 'uid', 'status'));
 | |
|                 $query->values($eventId.','.$user.',0');
 | |
|                 $db->setQuery($query);
 | |
|                 try {
 | |
|                     $ret = $db->execute();
 | |
|                 } catch (Exception $e) {
 | |
|                     JemHelper::addLogEntry('Exception: '. $e->getMessage(), __METHOD__, Log::ERROR);
 | |
|                     $ret = false;
 | |
|                 }
 | |
| 
 | |
|                 if ($ret !== false) {
 | |
|                     $id = $db->insertid();
 | |
|                     $dispatcher->triggerEvent('onEventUserRegistered', array($id));
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         # Remove obsolete invitations
 | |
|         foreach ($regs as $reg)
 | |
|         {
 | |
|             if (($reg->status == 0) && (array_search($reg->uid, $users) === false)) {
 | |
|                 $query = $db->getQuery(true);
 | |
|                 $query->delete('#__jem_register');
 | |
|                 $query->where('id = '.$reg->id);
 | |
|                 $db->setQuery($query);
 | |
|                 try {
 | |
|                     $ret = $db->execute();
 | |
|                 } catch (Exception $e) {
 | |
|                     JemHelper::addLogEntry('Exception: '. $e->getMessage(), __METHOD__, Log::ERROR);
 | |
|                     $ret = false;
 | |
|                 }
 | |
| 
 | |
|                 if ($ret !== false) {
 | |
|                     $dispatcher->triggerEvent('onEventUserUnregistered', array($eventId, $reg));
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $cache = Factory::getCache('com_jem');
 | |
|         $cache->clean();
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to toggle the featured setting of articles.
 | |
|      *
 | |
|      * @param  array   The ids of the items to toggle.
 | |
|      * @param  int     The value to toggle to.
 | |
|      *
 | |
|      * @return boolean True on success.
 | |
|      */
 | |
|     public function featured($pks, $value = 0)
 | |
|     {
 | |
|         // Sanitize the ids.
 | |
|         $pks = (array)$pks;
 | |
|         \Joomla\Utilities\ArrayHelper::toInteger($pks);
 | |
| 
 | |
|         if (empty($pks)) {
 | |
|             $this->setError(Text::_('COM_JEM_EVENTS_NO_ITEM_SELECTED'));
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             $db = Factory::getContainer()->get('DatabaseDriver');
 | |
| 
 | |
|             $db->setQuery(
 | |
|                 'UPDATE #__jem_events' .
 | |
|                 ' SET featured = '.(int) $value.
 | |
|                 ' WHERE id IN ('.implode(',', $pks).')'
 | |
|             );
 | |
|             $db->execute() ;
 | |
| 
 | |
|         } catch (Exception $e) {
 | |
|             $this->setError($e->getMessage());
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $this->cleanCache();
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Method to update the field in the events table.
 | |
|      *
 | |
|      * @param  int     The id of event.
 | |
|      * @param  string  The field of event table.
 | |
|      * @param  string  The value of field (to update).
 | |
|      *
 | |
|      * @return boolean True on success.
 | |
|      */
 | |
|     public function updateField($eventid, $field, $value)
 | |
|     {
 | |
|         // Sanitize the ids.
 | |
|         $eventid = (int)$eventid;
 | |
| 
 | |
|         if (empty($eventid)) {
 | |
|             $this->setError(Text::_('COM_JEM_EVENTS_NO_ITEM_SELECTED'));
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             $db = Factory::getContainer()->get('DatabaseDriver');
 | |
|             if($field == 'cats'){
 | |
|                 $cats = explode (',', $value);
 | |
| 
 | |
|                 // Delete all old categories for id event
 | |
|                 $db->setQuery('DELETE FROM #__jem_cats_event_relations WHERE itemid = ' . $db->quote($eventid) );
 | |
|                 $db->execute();
 | |
| 
 | |
|                 // Insert new categories for id event
 | |
|                 foreach($cats as $c){
 | |
|                     $db->setQuery('INSERT INTO #__jem_cats_event_relations (catid, itemid, ordering) VALUES  (' . $c . ',' . $db->quote($eventid) . ',0)');
 | |
|                     $db->execute();
 | |
|                 }
 | |
|             } else {
 | |
|                 // Update the value of field into events table
 | |
|                 $db->setQuery('UPDATE #__jem_events SET ' . $field . ' = ' . ($value!==null ? $db->quote($value) : 'null') . ' WHERE id = ' . $db->quote($eventid));
 | |
|                 $db->execute();
 | |
|             }
 | |
| 
 | |
|         } catch (Exception $e) {
 | |
|             $this->setError($e->getMessage());
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $this->cleanCache();
 | |
|         return true;
 | |
|     }
 | |
| }
 |