/** * Performs dayly scheduled cleanups * * Currently it archives and removes outdated events * and takes care of the recurrence of events * * @since 0.9 */ function cleanup() { $elsettings =& ELHelper::config(); $now = time(); $lastupdate = $elsettings->lastupdate; //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) { $db =& JFactory::getDBO(); $nulldate = '0000-00-00'; $query = 'SELECT * FROM #__eventlist_events WHERE DATE_SUB(NOW(), INTERVAL ' . $elsettings->minus . ' DAY) > (IF (enddates <> ' . $nulldate . ', enddates, dates)) AND recurrence_number <> "0" AND recurrence_type <> "0" AND `published` = 1'; $db->SetQuery($query); $recurrence_array = $db->loadAssocList(); foreach ($recurrence_array as $recurrence_row) { $insert_keys = ''; $insert_values = ''; $wherequery = ''; // get the recurrence information $recurrence_number = $recurrence_row['recurrence_number']; $recurrence_type = $recurrence_row['recurrence_type']; $recurrence_row = ELHelper::calculate_recurrence($recurrence_row); if ($recurrence_row['dates'] <= $recurrence_row['recurrence_counter'] || $recurrence_row['recurrence_counter'] == "0000-00-00") { // create the INSERT query foreach ($recurrence_row as $key => $result) { if ($key != 'id') { if ($insert_keys != '') { if (ELHelper::where_table_rows($key)) { $wherequery .= ' AND '; } $insert_keys .= ', '; $insert_values .= ', '; } $insert_keys .= $key; if (($key == "enddates" || $key == "times" || $key == "endtimes") && $result == "") { $insert_values .= "NULL"; $wherequery .= '`' . $key . '` IS NULL'; } else { $insert_values .= "'" . $result . "'"; if (ELHelper::where_table_rows($key)) { $wherequery .= '`' . $key . '` = "' . $result . '"'; } } } } $query = 'SELECT id FROM #__eventlist_events WHERE ' . $wherequery . ';'; $db->SetQuery($query); if (count($db->loadAssocList()) == 0) { $query = 'INSERT INTO #__eventlist_events (' . $insert_keys . ') VALUES (' . $insert_values . ');'; $db->SetQuery($query); $db->Query(); } } } //delete outdated events if ($elsettings->oldevent == 1) { $query = 'DELETE FROM #__eventlist_events WHERE DATE_SUB(NOW(), INTERVAL ' . $elsettings->minus . ' DAY) > (IF (enddates <> ' . $nulldate . ', enddates, dates))'; $db->SetQuery($query); $db->Query(); } //Set state archived of outdated events if ($elsettings->oldevent == 2) { $query = 'UPDATE #__eventlist_events SET published = -1 WHERE DATE_SUB(NOW(), INTERVAL ' . $elsettings->minus . ' DAY) > (IF (enddates <> ' . $nulldate . ', enddates, dates))'; $db->SetQuery($query); $db->Query(); } //Set timestamp of last cleanup $query = 'UPDATE #__eventlist_settings SET lastupdate = ' . time() . ' WHERE id = 1'; $db->SetQuery($query); $db->Query(); } }
/** * 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) { $elsettings =& ELHelper::config(); $params =& JComponentHelper::getParams('com_eventlist'); $weekstart = $params->get('weekdaystart', 0); $anticipation = $params->get('recurrence_anticipation', 30); $now = time(); $lastupdate = $elsettings->lastupdate; //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) { $db =& JFactory::getDBO(); // get the last event occurence of each recurring published events, with unlimited repeat, or last date not passed. $nulldate = '0000-00-00'; $query = ' SELECT id, CASE recurrence_first_id WHEN 0 THEN id ELSE recurrence_first_id END AS first_id, ' . ' recurrence_number, recurrence_type, recurrence_limit_date, recurrence_limit, recurrence_byday, ' . ' MAX(dates) as dates, MAX(enddates) as enddates, MAX(recurrence_counter) as counter ' . ' FROM #__eventlist_events ' . ' WHERE recurrence_type <> "0" ' . ' AND CASE recurrence_limit_date WHEN ' . $nulldate . ' THEN 1 ELSE NOW() < recurrence_limit_date END ' . ' AND recurrence_number <> "0" ' . ' AND `published` = 1 ' . ' GROUP BY first_id' . ' ORDER BY dates DESC'; $db->SetQuery($query); $recurrence_array = $db->loadAssocList(); foreach ($recurrence_array as $recurrence_row) { // get the info of reference event for the duplicates $ref_event =& JTable::getInstance('eventlist_events', ''); $ref_event->load($recurrence_row['id']); // get the recurrence information $recurrence_number = $recurrence_row['recurrence_number']; $recurrence_type = $recurrence_row['recurrence_type']; // the first day of the week is used for certain rules $recurrence_row['weekstart'] = $weekstart; // calculate next occurence date $recurrence_row = ELHelper::calculate_recurrence($recurrence_row); // add events as long as we are under the interval and under the limit, if specified. while (($recurrence_row['recurrence_limit_date'] == $nulldate || strtotime($recurrence_row['dates']) <= strtotime($recurrence_row['recurrence_limit_date'])) && strtotime($recurrence_row['dates']) <= time() + 86400 * $anticipation) { $new_event =& JTable::getInstance('eventlist_events', ''); $new_event->bind($ref_event, array('id', 'hits', 'dates', 'enddates')); $new_event->recurrence_first_id = $recurrence_row['first_id']; $new_event->recurrence_counter = $recurrence_row['counter'] + 1; $new_event->dates = $recurrence_row['dates']; $new_event->enddates = $recurrence_row['enddates']; if ($new_event->store()) { $recurrence_row['counter']++; //duplicate categories event relationships $query = ' INSERT INTO #__eventlist_cats_event_relations (itemid, catid) ' . ' SELECT ' . $db->Quote($new_event->id) . ', catid FROM #__eventlist_cats_event_relations WHERE itemid = ' . $db->Quote($ref_event->id); $db->setQuery($query); if (!$db->query()) { echo JText::_('Error saving categories for event "' . $ref_event->title . '" new recurrences\\n'); } } $recurrence_row = ELHelper::calculate_recurrence($recurrence_row); } } //delete outdated events if ($elsettings->oldevent == 1) { $query = 'DELETE FROM #__eventlist_events WHERE DATE_SUB(NOW(), INTERVAL ' . $elsettings->minus . ' DAY) > (IF (enddates <> ' . $nulldate . ', enddates, dates))'; $db->SetQuery($query); $db->Query(); } //Set state archived of outdated events if ($elsettings->oldevent == 2) { $query = 'UPDATE #__eventlist_events SET published = -1 WHERE DATE_SUB(NOW(), INTERVAL ' . $elsettings->minus . ' DAY) > (IF (enddates <> ' . $nulldate . ', enddates, dates)) AND published = 1'; $db->SetQuery($query); $db->Query(); } //Set timestamp of last cleanup $query = 'UPDATE #__eventlist_settings SET lastupdate = ' . time() . ' WHERE id = 1'; $db->SetQuery($query); $db->Query(); } }