Esempio n. 1
0
	/**
	 * Performs daily scheduled cleanups
	 *
	 * Currently it archives and removes outdated events
	 * and takes care of the recurrence of events
	 */
	static function cleanup($forced = 0)
	{
		$jemsettings	= JemHelper::config();
		$weekstart 		= $jemsettings->weekdaystart;
		$anticipation	= $jemsettings->recurrence_anticipation;

		$now = time();
		$lastupdate = $jemsettings->lastupdate;

		// New day since last update?
		$nrdaysnow = floor($now / 86400);
		$nrdaysupdate = floor($lastupdate / 86400);

		if ($nrdaysnow > $nrdaysupdate || $forced) {

			// trigger an event to let plugins handle whatever cleanup they want to do.
			if (JPluginHelper::importPlugin('jem')) {
				$dispatcher = JDispatcher::getInstance();
				$dispatcher->trigger('onJemBeforeCleanup', array($jemsettings, $forced));
			}

			$db = JFactory::getDbo();
			$query = $db->getQuery(true);

			// Get the last event occurence of each recurring published events, with unlimited repeat, or last date not passed.
			// Ignore published field to prevent duplicate events.
			$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 #__jem_events '
					. ' WHERE recurrence_type <> "0" '
					. ' AND CASE recurrence_limit_date WHEN '.$nulldate.' THEN 1 ELSE NOW() < recurrence_limit_date END '
					. ' AND recurrence_number <> "0" '
					. ' GROUP BY first_id'
					. ' ORDER BY dates DESC';
			$db->SetQuery($query);
			$recurrence_array = $db->loadAssocList();

			// If there are results we will be doing something with it
			foreach($recurrence_array as $recurrence_row)
			{
				// get the info of reference event for the duplicates
				$ref_event = JTable::getInstance('Event', 'JemTable');
				$ref_event->load($recurrence_row['id']);

				$db = JFactory::getDbo();
				$query = $db->getQuery(true);
				$query->select('*');
				$query->from($db->quoteName('#__jem_events').' AS a');
				$query->where('id = '.(int)$recurrence_row['id']);
				$db->setQuery($query);
				$reference = $db->loadAssoc();

				// if reference event is "unpublished"(0) new event is "unpublished" too
				// but on "archived"(2) and "trashed"(-2) reference events create "published"(1) event
				if ($reference['published'] != 0) {
					$reference['published'] = 1;
				}

				// the first day of the week is used for certain rules
				$recurrence_row['weekstart'] = $weekstart;

				// calculate next occurence date
				$recurrence_row = JemHelper::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('Event', 'JemTable');
					$new_event->bind($reference, array('id', 'hits', 'dates', 'enddates','checked_out_time','checked_out'));
					$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'];
					$new_event->_autocreate = true; // to tell table class this has to be stored AS IS (the underscore is important!)

					if ($new_event->store())
					{
						$recurrence_row['counter']++;
						//duplicate categories event relationships
						$query = ' INSERT INTO #__jem_cats_event_relations (itemid, catid) '
								. ' SELECT ' . $db->Quote($new_event->id) . ', catid FROM #__jem_cats_event_relations '
								. ' WHERE itemid = ' . $db->Quote($ref_event->id);
						$db->setQuery($query);

						if ($db->execute() === false) {
							// run query always but don't show error message to "normal" users
							$user = JemFactory::getUser();
							if($user->authorise('core.manage')) {
								echo JText::_('Error saving categories for event "' . $ref_event->title . '" new recurrences\n');
							}
						}
					}

					$recurrence_row = JemHelper::calculate_recurrence($recurrence_row);
				}
			}

			//delete outdated events
			if ($jemsettings->oldevent == 1) {
				$query = 'DELETE FROM #__jem_events WHERE dates > 0 AND '
						.' DATE_SUB(NOW(), INTERVAL '.(int)$jemsettings->minus.' DAY) > (IF (enddates IS NOT NULL, enddates, dates))';
				$db->SetQuery($query);
				$db->execute();
			}

			//Set state archived of outdated events
			if ($jemsettings->oldevent == 2) {
				$query = 'UPDATE #__jem_events SET published = 2 WHERE dates > 0 AND '
						.' DATE_SUB(NOW(), INTERVAL '.(int)$jemsettings->minus.' DAY) > (IF (enddates IS NOT NULL, enddates, dates)) '
						.' AND published = 1';
				$db->SetQuery($query);
				$db->execute();
			}

			//Set timestamp of last cleanup
			$query = 'UPDATE #__jem_settings SET lastupdate = '.time().' WHERE id = 1';
			$db->SetQuery($query);
			$db->execute();
		}
	}