/** * Pseudo Constructor * * @param iCal Entry parsed from ICS file as an array $ice * @return n/a */ public static function iCalRRuleFromData($rrule) { $db = JFactory::getDBO(); $temp = new iCalRRule($db); $temp->data = $rrule; $temp->freq = $temp->data['FREQ']; // Should really test count $temp->processField("count", 999); $temp->processField("interval", 1); //interval ios a mysql reserved word $temp->rinterval = $temp->interval; $temp->_interval = $temp->interval; unset($temp->interval); if ($temp->freq == "none") { $temp->processField("until", ""); } else { // cap indefinate repeats if count is blank as well as until if (array_key_exists("COUNT", $temp->data)) { $temp->processField("until", ""); } else { $cfg = JEVConfig::getInstance(); $temp->processField("until", JevDate::mktime(23, 59, 59, 12, 12, $cfg->get("com_latestyear", 2020))); $temp->processField("count", 9999); } } $temp->processField("untilraw", ""); $temp->processField("bysecond", ""); $temp->processField("byminute", ""); $temp->processField("byhour", ""); $temp->processField("byday", ""); $temp->processField("bymonthday", ""); $temp->processField("byyearday", ""); $temp->processField("byweekno", ""); $temp->processField("bymonth", ""); $temp->processField("bysetpos", ""); $temp->processField("irregulardates", ""); $temp->irregulardates = json_encode($temp->irregulardates); $temp->processField("wkst", ""); return $temp; }
function _deleteFuture() { $cid = JRequest::getVar('cid', array(0)); if (!is_array($cid)) { $cid = array(intval($cid)); } JArrayHelper::toInteger($cid); $db = JFactory::getDBO(); foreach ($cid as $id) { // I should be able to do this in one operation but that can come later $event = $this->queryModel->listEventsById(intval($id), 1, "icaldb"); if (!JEVHelper::canDeleteEvent($event)) { throw new Exception(JText::_('ALERTNOTAUTH'), 403); return false; } $query = "SELECT * FROM #__jevents_repetition WHERE rp_id={$id}"; $db->setQuery($query); $repeatdata = null; $repeatdata = $db->loadObject(); if (is_null($repeatdata)) { throw new Exception(JText::_('NO_SUCH_EVENT'), 4777); return; } $query = "SELECT detail_id FROM #__jevents_vevent WHERE ev_id={$repeatdata->eventid}"; $db->setQuery($query); $eventdetailid = $db->loadResult(); // Find detail ids for future repetitions that don't match the global event detail $query = "SELECT eventdetail_id FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "' AND eventdetail_id<>" . $eventdetailid; $db->setQuery($query); $detailids = $db->loadColumn(); // Find repeat ids future repetitions $query = "SELECT rp_id FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $rp_ids = $db->loadColumn(); foreach ($rp_ids as $rp_id) { // May want to send notification messages etc. $dispatcher = JDispatcher::getInstance(); // just incase we don't have jevents plugins registered yet JPluginHelper::importPlugin("jevents"); $res = $dispatcher->trigger('onDeleteEventRepeat', $rp_id); } // Change the underlying event repeat rule details !! $query = "SELECT * FROM #__jevents_rrule WHERE eventid={$repeatdata->eventid}"; $db->setQuery($query); $this->rrule = null; $this->rrule = $db->loadObject(); $this->rrule = iCalRRule::iCalRRuleFromDB(get_object_vars($this->rrule)); if (intval($this->rrule->until) > 0) { // Find latest matching repetition $query = "SELECT max(startrepeat) FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat<'" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $lastrepeat = $db->loadResult(); $this->rrule->until = JevDate::strtotime($lastrepeat); } else { // Find latest matching repetition $query = "SELECT count(startrepeat) FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat<'" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $countrepeat = $db->loadResult(); $this->rrule->count = $countrepeat; } $this->rrule->store(); if (!is_null($detailids) && count($detailids) > 0) { $query = "DELETE FROM #__jevents_vevdetail WHERE evdet_id IN (" . implode(",", $detailids) . ")"; $db->setQuery($query); $db->query(); // I also need to clean out associated custom data $dispatcher = JDispatcher::getInstance(); // just incase we don't have jevents plugins registered yet JPluginHelper::importPlugin("jevents"); $res = $dispatcher->trigger('onDeleteEventDetails', array(implode(",", $detailids))); } // setup exception data foreach ($rp_ids as $rp_id) { $query = "SELECT * FROM #__jevents_repetition WHERE rp_id={$rp_id}"; $db->setQuery($query); $data = null; $data = $db->loadObject(); $exception = iCalException::loadByRepeatId($rp_id); if (!$exception) { $exception = new iCalException($db); $exception->bind(get_object_vars($data)); } $exception->exception_type = 0; // deleted $exception->store(); } $query = "DELETE FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $db->query(); // Also clear out defunct exceptions $query = "DELETE FROM #__jevents_exception WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "' and exception_type=1 "; $db->setQuery($query); $db->query(); } }
/** * Pseudo Constructor * * @param iCal Event parsed from ICS file as an array $ice * @return n/a */ function iCalEventFromDB($icalrowAsArray) { $db =& JFactory::getDBO(); $temp = new iCalEvent($db); foreach ($icalrowAsArray as $key => $val) { $temp->{$key} = $val; } if ($temp->freq != "") { $temp->rrule = iCalRRule::iCalRRuleFromDB($icalrowAsArray); } $temp->setupEventDetailFromDB($icalrowAsArray); return $temp; }