/** * Saves xref data * @param array * @return boolean true on success */ function storeXref($data) { $user =& JFactory::getUser(); $settings =& redEVENTHelper::config(); // TODO : check user group access ? $row =& JTable::getInstance('RedEvent_eventvenuexref', ''); if ($data['id']) { if (!$this->canManageXref($data['id'])) { $this->setError('YOU ARE NOT ALLOWED TO EDIT THIS DATE'); return false; } $row->load($data['id']); } else { if (!$this->getCanAddXref()) { $this->setError('YOU ARE NOT ALLOWED TO ADD EVENT DATE'); return false; } } if (!$row->bind($data)) { $this->setError('SUBMIT XREF ERROR BINDING DATA'); RedeventHelperLog::simplelog('SUBMIT XREF ERROR BINDING DATA'); return false; } if (!$row->check()) { $this->setError('SUBMIT XREF ERROR CHECK DATA'); RedeventHelperLog::simplelog('SUBMIT XREF ERROR CHECK DATA'); return false; } if (!$row->store(true)) { $this->setError('SUBMIT XREF ERROR STORE DATA'); RedeventHelperLog::simplelog('SUBMIT XREF ERROR STORE DATA'); return false; } /** roles **/ // first remove current rows $query = ' DELETE FROM #__redevent_sessions_roles ' . ' WHERE xref = ' . $this->_db->Quote($row->id); $this->_db->setQuery($query); if (!$this->_db->query()) { $this->setError($this->_db->getErrorMsg()); return false; } // then recreate them if any foreach ((array) $data['rrole'] as $k => $r) { if (!($data['rrole'][$k] && $data['urole'][$k])) { continue; } $new =& JTable::getInstance('RedEvent_sessions_roles', ''); $new->set('xref', $row->id); $new->set('role_id', $r); $new->set('user_id', $data['urole'][$k]); if (!($new->check() && $new->store())) { $this->setError($new->getError()); return false; } } /** roles END **/ /** prices **/ // first remove current rows $query = ' DELETE FROM #__redevent_sessions_pricegroups ' . ' WHERE xref = ' . $this->_db->Quote($row->id); $this->_db->setQuery($query); if (!$this->_db->query()) { $this->setError($this->_db->getErrorMsg()); return false; } // then recreate them if any foreach ((array) $data['pricegroup'] as $k => $r) { if (!$data['pricegroup'][$k]) { continue; } $new =& JTable::getInstance('RedEvent_sessions_pricegroups', ''); $new->set('xref', $row->id); $new->set('pricegroup_id', $r); $new->set('price', $data['price'][$k]); if (!($new->check() && $new->store())) { $this->setError($new->getError()); return false; } } /** prices END **/ // we need to save the recurrence too $recurrence =& JTable::getInstance('RedEvent_recurrences', ''); if (!isset($data['recurrenceid']) || !$data['recurrenceid']) { $rrule = RedeventHelperRecurrence::parsePost($data); if (!empty($rrule)) { // new recurrence $recurrence->rrule = $rrule; if (!$recurrence->store()) { $this->setError($recurrence->getError()); return false; } // add repeat record $repeat =& JTable::getInstance('RedEvent_repeats', ''); $repeat->set('xref_id', $row->id); $repeat->set('recurrence_id', $recurrence->id); $repeat->set('count', 0); if (!$repeat->store()) { $this->setError($repeat->getError()); return false; } } } else { if ($data['repeat'] == 0) { $recurrence->load($data['recurrenceid']); // reset the status $recurrence->ended = 0; // TODO: maybe add a check to have a choice between updating rrule or not... $rrule = RedeventHelperRecurrence::parsePost($data); $recurrence->rrule = $rrule; if (!$recurrence->store()) { $this->setError($recurrence->getError()); return false; } } } if ($recurrence->id) { redEVENTHelper::generaterecurrences($recurrence->id); } return true; }
/** * Performs dayly scheduled cleanups * * Currently it archives and removes outdated events * and takes care of the recurrence of events * * @since 0.9 */ function cleanup($forced = 0) { $db =& JFactory::getDBO(); $elsettings =& redEVENTHelper::config(); $params =& JComponentHelper::getParams('com_redevent'); $now = time(); $query = ' SELECT lastupdate ' . ' FROM #__redevent_settings '; $db->setQuery($query); $lastupdate = $db->loadResult(); //last update later then 24h? //$difference = $now - $lastupdate; //if ( $difference > 86400 ) { //better: new day since last update? $nrdaysnow = floor($now / 86400); $nrdaysupdate = floor($lastupdate / 86400); if ($nrdaysnow > $nrdaysupdate || $forced) { $nulldate = '0000-00-00'; $limit_date = strftime('%Y-%m-%d', time() - $params->get('pastevents_delay', 3) * 3600 * 24); redEVENTHelper::generaterecurrences(); // date filtering $where = array('x.dates IS NOT NULL'); switch ($params->get('pastevents_reference_date', 'end')) { case 'start': $where[] = ' DATEDIFF(' . $db->Quote($limit_date) . ', x.dates) >= 0 '; break; case 'registration': $where[] = ' DATEDIFF(' . $db->Quote($limit_date) . ', (IF (x.registrationend <> ' . $db->Quote($nulldate) . ', x.registrationend, x.dates))) >= 0 '; break; case 'end': $where[] = ' DATEDIFF(' . $db->Quote($limit_date) . ', (IF (x.enddates <> ' . $db->Quote($nulldate) . ', x.enddates, x.dates))) >= 0 '; break; } $where_date = implode(' AND ', $where); //delete outdated events if ($params->get('pastevents_action', 0) == 1) { // lists event_id for which we are going to delete xrefs $query = ' SELECT x.eventid FROM #__redevent_event_venue_xref AS x '; $query .= ' WHERE ' . $where_date; $db->SetQuery($query); $event_ids = $db->loadResultArray(); if (!count($event_ids)) { return true; } $query = ' DELETE x FROM #__redevent_event_venue_xref AS x ' . ' WHERE ' . $where_date; $db->SetQuery($query); if (!$db->Query()) { RedeventHelperLog::simpleLog('CLEANUP Error while deleting old xrefs: ' . $db->getErrorMsg()); } if ($params->get('pastevents_events_action', 1)) { // now delete the events with no more xref $query = ' DELETE e FROM #__redevent_events AS e ' . ' LEFT JOIN #__redevent_event_venue_xref AS x ON x.eventid = e.id ' . ' WHERE x.id IS NULL ' . ' AND e.id IN (' . implode(', ', $event_ids) . ')'; $db->SetQuery($query); if (!$db->Query()) { RedeventHelperLog::simpleLog('CLEANUP Error while deleting old events with no more xrefs: ' . $db->getErrorMsg()); } } } //Set state archived of outdated events if ($params->get('pastevents_action', 0) == 2) { // lists xref_id and associated event_id for which we are going to be archived $query = ' SELECT x.id, x.eventid ' . ' FROM #__redevent_event_venue_xref AS x ' . ' WHERE ' . $where_date . ' AND x.published = 1 '; $db->SetQuery($query); $xrefs = $db->loadObjectList(); if (empty($xrefs)) { return true; } // build list of xref and corresponding events $event_ids = array(); $xref_ids = array(); foreach ($xrefs as $xref) { $event_ids[] = $db->Quote($xref->eventid); $xref_ids[] = $db->Quote($xref->id); } // filter duplicates $event_ids = array_unique($event_ids); // update xref to archive $query = ' UPDATE #__redevent_event_venue_xref AS x ' . ' SET x.published = -1 ' . ' WHERE x.id IN (' . implode(', ', $xref_ids) . ')'; $db->SetQuery($query); if (!$db->Query()) { RedeventHelperLog::simpleLog('CLEANUP Error while archiving old xrefs: ' . $db->getErrorMsg()); } if ($params->get('pastevents_events_action', 1)) { // update events to archive (if no more published xref) $query = ' UPDATE #__redevent_events AS e ' . ' LEFT JOIN #__redevent_event_venue_xref AS x ON x.eventid = e.id AND x.published <> -1 ' . ' SET e.published = -1 ' . ' WHERE x.id IS NULL ' . ' AND e.id IN (' . implode(', ', $event_ids) . ')'; $db->SetQuery($query); if (!$db->Query()) { RedeventHelperLog::simpleLog('CLEANUP Error while archiving events with only archived xrefs: ' . $db->getErrorMsg()); } } } //Set timestamp of last cleanup $query = 'UPDATE #__redevent_settings SET lastupdate = ' . time() . ' WHERE id = 1'; $db->SetQuery($query); $db->Query(); } }
/** * save xref data * * @param array $data * @return boolean true on success */ function savexref($data) { $id = (int) $data['id']; $object =& JTable::getInstance('RedEvent_eventvenuexref', ''); if ($id) { $object->load($id); } if (!$object->bind($data)) { $this->setError($object->getError()); return false; } if (!$object->check()) { $this->setError($object->getError()); return false; } if (!$object->store(true)) { $this->setError($object->getError()); return false; } // we need to save the recurrence too $recurrence =& JTable::getInstance('RedEvent_recurrences', ''); if (!$data['recurrenceid']) { $rrule = RedeventHelperRecurrence::parsePost($data); if (!empty($rrule)) { // new recurrence $recurrence->rrule = $rrule; if (!$recurrence->store()) { $this->setError($recurrence->getError()); return false; } // add repeat record $repeat =& JTable::getInstance('RedEvent_repeats', ''); $repeat->set('xref_id', $object->id); $repeat->set('recurrence_id', $recurrence->id); $repeat->set('count', 0); if (!$repeat->store()) { $this->setError($repeat->getError()); return false; } } } else { if ($data['repeat'] == 0) { $recurrence->load($data['recurrenceid']); // reset the status $recurrence->ended = 0; // TODO: maybe add a check to have a choice between updating rrule or not... $rrule = RedeventHelperRecurrence::parsePost($data); $recurrence->rrule = $rrule; if (!$recurrence->store()) { $this->setError($recurrence->getError()); return false; } } } if ($recurrence->id) { redEVENTHelper::generaterecurrences($recurrence->id); } /** roles **/ // first remove current rows $query = ' DELETE FROM #__redevent_sessions_roles ' . ' WHERE xref = ' . $this->_db->Quote($object->id); $this->_db->setQuery($query); if (!$this->_db->query()) { $this->setError($this->_db->getErrorMsg()); return false; } // then recreate them if any foreach ((array) $data['rrole'] as $k => $r) { if (!($data['rrole'][$k] && $data['urole'][$k])) { continue; } $new =& JTable::getInstance('RedEvent_sessions_roles', ''); $new->set('xref', $object->id); $new->set('role_id', $r); $new->set('user_id', $data['urole'][$k]); if (!($new->check() && $new->store())) { $this->setError($new->getError()); return false; } } /** roles END **/ /** prices **/ // first remove current rows $query = ' DELETE FROM #__redevent_sessions_pricegroups ' . ' WHERE xref = ' . $this->_db->Quote($object->id); $this->_db->setQuery($query); if (!$this->_db->query()) { $this->setError($this->_db->getErrorMsg()); return false; } // then recreate them if any foreach ((array) $data['pricegroup'] as $k => $r) { if (!$data['pricegroup'][$k]) { continue; } $new =& JTable::getInstance('RedEvent_sessions_pricegroups', ''); $new->set('xref', $object->id); $new->set('pricegroup_id', $r); $new->set('price', $data['price'][$k]); if (!($new->check() && $new->store())) { $this->setError($new->getError()); return false; } } /** prices END **/ return $object->id; }