Exemplo n.º 1
0
 /**
  * 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;
 }
Exemplo n.º 2
0
 /**
  * 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();
     }
 }
Exemplo n.º 3
0
 /**
  * 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;
 }