function setupModuleCatids($modparams) { $this->myItemid = findAppropriateMenuID($this->catidsOut, $this->catids, $this->catidList, $modparams->toObject(), $this->moduleAllCats); // set menu/module constraint values for later use $this->mmcatids = array(); // New system $newcats = $modparams->get("catidnew", false); if ($newcats && is_array($newcats)) { foreach ($newcats as $newcat) { if (!in_array($newcat, $this->mmcatids)) { $this->mmcatids[] = $newcat; } } } else { for ($c = 0; $c < 999; $c++) { $nextCID = "catid{$c}"; // stop looking for more catids when you reach the last one! if (!($nextCatId = $modparams->get($nextCID, null))) { break; } if (!in_array($nextCatId, $this->mmcatids)) { $this->mmcatids[] = $nextCatId; } } } $this->mmcatidList = implode(",", $this->mmcatids); return $this->myItemid; }
/** * Search method * * The sql must return the following fields that are used in a common display * routine: href, title, section, created, text, browsernav * @param string Target search string * @param string matching option, exact|any|all * @param string ordering option, newest|oldest|popular|alpha|category */ function onSearch($text, $phrase = '', $ordering = '', $areas = null) { $db = JFactory::getDBO(); $user = JFactory::getUser(); $groups = version_compare(JVERSION, '1.6.0', '>=') ? implode(',', $user->getAuthorisedViewLevels()) : false; $limit = version_compare(JVERSION, '1.6.0', '>=') ? $this->params->get('search_limit', 50) : $this->_params->def('search_limit', 50); $dateformat = version_compare(JVERSION, '1.6.0', ">=") ? $this->params->get('date_format', "%d %B %Y") : $this->_params->def('date_format', "%d %B %Y"); $allLanguages = $this->params->get('all_language_search', true); $limit = "\n LIMIT {$limit}"; $text = trim($text); if ($text == '') { return array(); } if (is_array($areas)) { $test = array_keys(plgSearchEventsSearchAreas()); if (!array_intersect($areas, array_keys(plgSearchEventsSearchAreas()))) { return array(); } } $params = JComponentHelper::getParams("com_jevents"); // See http://www.php.net/manual/en/timezones.php $tz = $params->get("icaltimezonelive", ""); if ($tz != "" && is_callable("date_default_timezone_set")) { $timezone = date_default_timezone_get(); date_default_timezone_set($tz); $this->jeventstimezone = $timezone; } $search_ical_attributes = array('det.summary', 'det.description', 'det.location', 'det.contact', 'det.extra_info'); // process the new plugins // get extra data and conditionality from plugins $extrawhere = array(); $extrajoin = array(); $needsgroup = false; $filterarray = array("published"); $dataModel = new JEventsDataModel(); $compparams = JComponentHelper::getParams("com_jevents"); if ($compparams->get("multicategory", 0)) { $catwhere = "\n AND catmap.catid IN(" . $dataModel->accessibleCategoryList(null, null, null, $allLanguages) . ")"; $catjoin = "\n LEFT JOIN #__jevents_catmap as catmap ON catmap.evid = rpt.eventid"; $catjoin .= "\n LEFT JOIN #__categories AS b ON catmap.catid = b.id"; } else { $catwhere = "\n AND ev.catid IN(" . $dataModel->accessibleCategoryList(null, null, null, $allLanguages) . ")"; $catjoin = "\n INNER JOIN #__categories AS b ON b.id = ev.catid"; } // If there are extra filters from the module then apply them now $reg = JFactory::getConfig(); $modparams = $reg->get("jev.modparams", false); if ($modparams && $modparams->get("extrafilters", false)) { $filterarray = array_merge($filterarray, explode(",", $modparams->get("extrafilters", false))); } $filters = jevFilterProcessing::getInstance($filterarray); $filters->setWhereJoin($extrawhere, $extrajoin); $needsgroup = $filters->needsGroupBy(); JPluginHelper::importPlugin('jevents'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('onListIcalEvents', array(&$extrafields, &$extratables, &$extrawhere, &$extrajoin, &$needsgroup)); $extrajoin = count($extrajoin) ? " \n LEFT JOIN " . implode(" \n LEFT JOIN ", $extrajoin) : ''; $extrawhere = count($extrawhere) ? ' AND ' . implode(' AND ', $extrawhere) : ''; $extrasearchfields = array(); $dispatcher->trigger('onSearchEvents', array(&$extrasearchfields, &$extrajoin, &$needsgroup)); $wheres = array(); $wheres_ical = array(); switch ($phrase) { case 'exact': $text = $db->Quote('%' . $db->escape($text, true) . '%', false); // ical $wheres2 = array(); foreach ($search_ical_attributes as $search_item) { $wheres2[] = "LOWER({$search_item}) LIKE " . $text; } $where_ical = '(' . implode(') OR (', $wheres2) . ')'; break; case 'all': case 'any': default: $words = explode(' ', $text); $text = $db->Quote('%' . $db->escape($text, true) . '%', false); // ical $wheres = array(); foreach ($words as $word) { $word = $db->Quote('%' . $db->escape($word) . '%', false); $wheres2 = array(); foreach ($search_ical_attributes as $search_item) { $wheres2[] = "LOWER({$search_item}) LIKE " . $word; } $wheres[] = implode(' OR ', $wheres2); } $where_ical = '(' . implode($phrase == 'all' ? ') AND (' : ') OR (', $wheres) . ')'; break; } if (count($extrasearchfields) > 0) { $extraor = implode(" OR ", $extrasearchfields); $extraor = " OR " . $extraor; // replace the ### placeholder with the keyword // $text is already exscaped above $extraor = str_replace("###", $text, $extraor); $where_ical .= $extraor; } // some of the where statements may already be escaped $where_ical = str_replace("%'%'", "%'", $where_ical); $where_ical = str_replace("''", "'", $where_ical); $where_ical = str_replace("'%'%", "'%", $where_ical); $morder = ''; $morder_ical = ''; switch ($ordering) { case 'oldest': $order = 'a.created ASC'; $order_ical = 'det.created ASC'; break; case 'popular': $order = 'a.hits DESC'; $order_ical = 'det.created ASC'; // no hit field available break; case 'alpha': $order = 'a.title ASC'; $order_ical = 'det.summary ASC'; break; case 'category': $order = 'b.title ASC, a.title ASC'; $morder = 'a.title ASC'; $order_ical = 'b.title ASC, det.summary ASC'; $morder_ical = 'det.summary ASC'; break; case 'newest': default: $order = 'a.created DESC'; $order_ical = 'det.created DESC'; break; } $eventstitle = JText::_("Events Calendar"); // Now Search Icals $display2 = array(); foreach ($search_ical_attributes as $search_ical_attribute) { $display2[] = "{$search_ical_attribute}"; } $display = 'CONCAT(' . implode(", ' ', ", $display2) . ')'; $query = "SELECT det.evdet_id, det.summary as title," . "\n ev.created as created," . "\n {$display} as text," . "\n CONCAT('{$eventstitle}','/',det.summary) AS section," . "\n CONCAT('index.php?option=com_jevents&task=icalrepeat.detail&evid=',min(rpt.rp_id)) AS href," . "\n '2' AS browsernav ," . "\n rpt.startrepeat, rpt.rp_id " . "\n FROM (#__jevents_vevent as ev)" . "\n LEFT JOIN #__jevents_repetition as rpt ON rpt.eventid = ev.ev_id" . $catjoin . "\n LEFT JOIN #__jevents_vevdetail as det ON det.evdet_id = rpt.eventdetail_id" . "\n LEFT JOIN #__jevents_icsfile as icsf ON icsf.ics_id = ev.icsid" . $extrajoin . "\n WHERE ({$where_ical})" . "\n AND icsf.state = 1" . "\n AND icsf.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . $groups . ')' : ' <= ' . $user->gid) . "\n AND ev.state = 1" . "\n AND ev.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . $groups . ')' : ' <= ' . $user->gid) . "\n AND b.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . $groups . ')' : ' <= ' . $user->gid) . "\n AND b.published = '1'" . $extrawhere . $catwhere . "\n GROUP BY det.evdet_id" . "\n ORDER BY " . ($morder_ical ? $morder_ical : $order_ical) . $limit; $db->setQuery($query); $list_ical = $db->loadObjectList('evdet_id'); jimport('joomla.utilities.date'); if ($list_ical) { foreach ($list_ical as $id => $item) { $user = JFactory::getUser(); $query = "SELECT ev.*, ev.state as published, rpt.*, rr.*, det.*, ev.created as created, ex_id, exception_type " . "\n , YEAR(rpt.startrepeat) as yup, MONTH(rpt.startrepeat ) as mup, DAYOFMONTH(rpt.startrepeat ) as dup" . "\n , YEAR(rpt.endrepeat ) as ydn, MONTH(rpt.endrepeat ) as mdn, DAYOFMONTH(rpt.endrepeat ) as ddn" . "\n , HOUR(rpt.startrepeat) as hup, MINUTE(rpt.startrepeat ) as minup, SECOND(rpt.startrepeat ) as sup" . "\n , HOUR(rpt.endrepeat ) as hdn, MINUTE(rpt.endrepeat ) as mindn, SECOND(rpt.endrepeat ) as sdn" . "\n FROM #__jevents_vevent as ev" . "\n LEFT JOIN #__jevents_repetition as rpt ON rpt.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_vevdetail as det ON det.evdet_id = rpt.eventdetail_id" . "\n LEFT JOIN #__jevents_rrule as rr ON rr.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_exception as ex ON det.evdet_id = ex.eventdetail_id" . "\n WHERE ev.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . $groups . ')' : ' <= ' . $user->gid) . "\n AND det.evdet_id = {$id}" . "\n ORDER BY rpt.startrepeat ASC limit 1"; $db->setQuery($query); $row = $db->loadObject(); if (!$row) { continue; } $event = new jIcalEventRepeat($row); // only get the next repeat IF its not an exception if (is_null($row->ex_id)) { $event = $event->getNextRepeat(); } $startdate = new JevDate(strtotime($event->_startrepeat)); $item->title = $item->title . " (" . $startdate->toFormat($dateformat) . ")"; $item->startrepeat = $event->_startrepeat; $myitemid = $this->params->get("target_itemid", 0); if ($myitemid == 0) { // I must find the itemid that allows this event to be shown $catidsOut = $modcatids = $catidList = $modparams = $showall = ""; // Use the plugin params to ensure menu item is picked up //$modparams = new JRegistry($this->_plugin->params); $modparams = new JRegistry(null); // pretend to have category restriction $modparams->set("catid0", $row->catid); $modparams->set("ignorecatfilter", 1); $myitemid = findAppropriateMenuID($catidsOut, $modcatids, $catidList, $modparams->toObject(), $showall); } $item->href = $event->viewDetailLink($event->yup(), $event->mup(), $event->dup(), false, $myitemid); $link = $item->href; $list_ical[$id] = $item; } } // Must reset the timezone back!! if ($tz && is_callable("date_default_timezone_set")) { date_default_timezone_set($timezone); } return $list_ical; }
function setupModuleCatids($modparams) { $this->myItemid = findAppropriateMenuID($this->catidsOut, $this->catids, $this->catidList, $modparams->toObject(), $this->moduleAllCats); return $this->myItemid; }
function displayLatestEvents($asHTML = true) { global $mainframe; global $database; global $_MAMBOTS; static $isloaded_css = false; $now = time() + $mainframe->getCfg('offset') * 60 * 60; $now_Y_m_d = date('Y-m-d', $now); $now_d = date('d', $now); $now_m = date('m', $now); $now_Y = date('Y', $now); $now_w = date("w", $now); $content = null; if ($this->inccss && !$isloaded_css && $asHTML) { $content .= '<link href="' . $mainframe->getCfg('live_site') . '/modules/mod_events_latest.css" rel="stylesheet" type="text/css" />' . "\n"; $isloaded_css = true; } $catidsOut = null; $modcatids = null; $catidList = null; $myItemid = findAppropriateMenuID($catidsOut, $modcatids, $catidList, $this->modparams->toObject()); $cat = ""; if ($catidsOut != 0) { $cat = '&catids=' . $catidsOut; } // derive the event date range we want based on current date and // form the db query. $todayBegin = $now_Y_m_d . " 00:00:00"; $yesterdayEnd = date('Y-m-d', mktime(0, 0, 0, $now_m, $now_d - 1, $now_Y)) . " 23:59:59"; switch ($this->dispMode) { case 0: case 1: // week start (ie. Sun or Mon) is according to what has been selected in the events // component configuration thru the events admin interface. $numDay = ($now_w - $this->com_starday + 7) % 7; // begin of this week $beginDate = date('Y-m-d', mktime(0, 0, 0, $now_m, $now_d - $numDay, $now_Y)) . " 00:00:00"; //$thisWeekEnd = date('Y-m-d', mktime(0,0,0,date('m'),date('d') - date('w')+6, date('Y'))." 23:59:59"; // end of next week $endDate = date('Y-m-d', mktime(0, 0, 0, $now_m, $now_d - $numDay + 13, $now_Y)) . " 23:59:59"; break; case 2: case 3: // begin of today - $days $beginDate = date('Y-m-d', mktime(0, 0, 0, $now_m, $now_d - $this->rangeDays, $now_Y)) . " 00:00:00"; // end of today + $days $endDate = date('Y-m-d', mktime(0, 0, 0, $now_m, $now_d + $this->rangeDays, $now_Y)) . " 23:59:59"; break; case 4: default: // beginning of this month $beginDate = date('Y-m-d', mktime(0, 0, 0, $now_m, 1, $now_Y)) . " 00:00:00"; // end of this month $endDate = date('Y-m-d', mktime(0, 0, 0, $now_m + 1, 0, $now_Y)) . " 23:59:59"; break; } $query = "SELECT #__events.* " . "\n , YEAR(publish_up ) as yup, MONTH(publish_up ) as mup, DAYOFMONTH(publish_up ) as dup" . "\n , YEAR(publish_down) as ydn, MONTH(publish_down) as mdn, DAYOFMONTH(publish_down) as ddn" . "\n , HOUR(publish_up ) as hup, MINUTE(publish_up ) as minup, SECOND(publish_up ) as sup" . "\n , HOUR(publish_down) as hdn, MINUTE(publish_down) as mindn, SECOND(publish_down) as sdn" . "\n FROM (#__events)" . "\n WHERE #__events.catid IN(" . accessibleCategoryList($this->gid, $modcatids, $catidList) . ")" . "\n AND #__events.access <= {$this->gid}" . "\n AND (#__events.state='1' AND #__events.checked_out='0')" . "\n AND ((publish_up <= '{$todayBegin}%' AND publish_down >= '{$todayBegin}%')" . "\n OR (publish_up <= '{$endDate}%' AND publish_down >= '{$endDate}%')" . "\n OR (publish_up <= '{$endDate}%' AND publish_up >= '{$todayBegin}%')" . "\n OR (publish_down <= '{$endDate}%' AND publish_down >= '{$todayBegin}%'))" . "\n ORDER BY publish_up ASC"; // initialise the query in the $database connector // this translates the '#__' prefix into the real database prefix $database->setQuery($query); // retrieve the list of returned records as an array of objects $rows = $database->loadObjectList(); // determine the events that occur each day within our range $events = 0; $date = $now; $lastDate = mktime(0, 0, 0, intval(substr($endDate, 5, 2)), intval(substr($endDate, 8, 2)), intval(substr($endDate, 0, 4))); $i = 0; if ($asHTML) { $content .= '<table class="mod_events_latest_table" width="100%" border="0" cellspacing="0" cellpadding="0" align="center">'; } $seenThisEvent = array(); if (count($rows)) { while ($date <= $lastDate) { // get the events for this $date $eventsThisDay = $this->getEventsByDate($rows, $date, $seenThisEvent, $this->norepeat); if (count($eventsThisDay)) { // dmcd May 7/04 bug fix to not exceed maxEvents $eventsToAdd = min($this->maxEvents - $events, count($eventsThisDay)); $eventsThisDay = array_slice($eventsThisDay, 0, $eventsToAdd); $eventsByRelDay[$i] = $eventsThisDay; $events += count($eventsByRelDay[$i]); } if ($events >= $this->maxEvents) { break; } $date = mktime(0, 0, 0, date('m', $date), date('d', $date) + 1, date('Y', $date)); $i++; } } if ($events < $this->maxEvents && ($this->dispMode == 1 || $this->dispMode == 3)) { // display some recent previous events too up to a total of $maxEvents $query = "SELECT #__events.* " . "\n , YEAR(publish_up ) as yup, MONTH(publish_up ) as mup, DAYOFMONTH(publish_up ) as dup" . "\n , YEAR(publish_down) as ydn, MONTH(publish_down) as mdn, DAYOFMONTH(publish_down) as ddn" . "\n , HOUR(publish_up ) as hup, MINUTE(publish_up ) as minup, SECOND(publish_up ) as sup" . "\n , HOUR(publish_down) as hdn, MINUTE(publish_down) as mindn, SECOND(publish_down) as sdn" . "\n FROM (#__events)" . "\n WHERE #__events.catid IN(" . accessibleCategoryList($this->gid, $modcatids, $catidList) . ")" . "\n AND #__events.access <= {$this->gid}" . "\n AND (#__events.state='1' AND #__events.checked_out='0')" . "\n AND ((publish_up <= '{$beginDate}%' AND publish_down >= '{$beginDate}%')" . "\n OR (publish_up <= '{$yesterdayEnd}%' AND publish_down >= '{$yesterdayEnd}%')" . "\n OR (publish_up <= '{$yesterdayEnd}%' AND publish_up >= '{$beginDate}%')" . "\n OR (publish_down <= '{$yesterdayEnd}%' AND publish_down >= '{$beginDate}%'))" . "\n ORDER BY publish_up DESC"; // initialise the query in the $database connector // this translates the '#__' prefix into the real database prefix $database->setQuery($query); // retrieve the list of returned records as an array of objects $prows = $database->loadObjectList(); if (count($prows)) { // start from yesterday $date = mktime(23, 59, 59, $now_m, $now_d - 1, $now_Y); $lastDate = mktime(0, 0, 0, intval(substr($beginDate, 5, 2)), intval(substr($beginDate, 8, 2)), intval(substr($beginDate, 0, 4))); $i = -1; while ($date >= $lastDate) { // get the events for this $date $eventsThisDay = $this->getEventsByDate($prows, $date, $seenThisEvent, $this->norepeat); if (count($eventsThisDay)) { $eventsByRelDay[$i] = $eventsThisDay; $events += count($eventsByRelDay[$i]); } if ($events >= $this->maxEvents) { break; } $date = mktime(0, 0, 0, date('m', $date), date('d', $date) - 1, date('Y', $date)); $i--; } } } //asdbg_break(); if (isset($eventsByRelDay) && count($eventsByRelDay)) { // Now to display these events, we just start at the smallest index of the $eventsByRelDay array // and work our way up. ksort($eventsByRelDay, SORT_NUMERIC); reset($eventsByRelDay); $firstTime = true; // initialize name of com_events module and task defined to view // event detail. Note that these could change in future com_event // component revisions!! Note that the '$itemId' can be left out in // the link parameters for event details below since the event.php // component handler will fetch its own id from the db menu table // anyways as far as I understand it. $option = 'com_events'; $task_events = 'view_detail'; // Note we MUST get the $Itemid value for the events component // here, or some mambo things can break. /* replace by findAppropriateMenuID [tstahl] $query = "SELECT id" . "\n FROM #__menu WHERE" . "\n link = 'index.php?option=$option'" . "\n AND published = 1" . "\n AND access <= $this->gid" . "\n ORDER BY access ASC"; $database->setQuery($query); $Itemid = intval($database->loadResult()); */ /* tstahl, 30.05.2006, fetch $category and $users attributes by class function on demand // get the com_events category names from the categories mos table $database->setQuery("SELECT id, name FROM #__categories WHERE section= 'com_events' AND published='1'"); $category = $database->loadObjectList('id'); // get the usernames and email addresses from the users mos table $database->setQuery("SELECT id, username, sendEmail, email FROM #__users WHERE block ='0'"); $users = $database->loadObjectList('id'); */ // see if $customFormatStr has been specified. If not, set it to the default format // of date followed by event title. if ($this->customFormatStr == NULL) { $this->customFormatStr = $this->defaultfFormatStr; } else { $this->customFormatStr = preg_replace('/^"(.*)"$/', "\$1", $this->customFormatStr); $this->customFormatStr = preg_replace("/^'(.*)'\$/", "\$1", $this->customFormatStr); // escape all " within the string // $customFormatStr = preg_replace('/"/','\"', $customFormatStr); } // strip out event variables and run the string thru an html checker to make sure // it is legal html. If not, we will not use the custom format and print an error // message in the module output. This functionality is not here for now. // parse the event variables and reformat them into php syntax with special handling // for the startDate and endDate fields. //asdbg_break(); $customFormat = $this->customFormatStr; $keywords = array('content', 'eventDetailLink', 'createdByAlias', 'color', 'createdByUserName', 'createdByUserEmail', 'createdByUserEmailLink', 'eventDate', 'endDate', 'startDate', 'title', 'category', 'contact', 'addressInfo', 'extraInfo'); $keywords_or = implode('|', $keywords); $whsp = '[\\t ]*'; // white space $datefm = '\\([^\\)]*\\)'; // date formats //$modifiers = '(?::[[:alnum:]]*)'; $pattern = '/(\\$\\{' . $whsp . '(?:' . $keywords_or . ')(?:' . $datefm . ')?' . $whsp . '\\})/'; // keyword pattern $cond_pattern = '/(\\[!?[[:alnum:]]+:[^\\]]*])/'; // conditional string pattern e.g. [!a: blabla ${endDate(%a)}] // tokenize conditional strings $splitTerm = preg_split($cond_pattern, $customFormat, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $splitCustomFormat = array(); foreach ($splitTerm as $key => $value) { if (preg_match('/^\\[(.*)\\]$/', $value, $matches)) { // remove outer [] $splitCustomFormat[$key]['data'] = $matches[1]; // split condition preg_match('/^([^:]*):(.*)$/', $splitCustomFormat[$key]['data'], $matches); $splitCustomFormat[$key]['cond'] = $matches[1]; $splitCustomFormat[$key]['data'] = $matches[2]; } else { $splitCustomFormat[$key]['data'] = $value; } // tokenize into array $splitCustomFormat[$key]['data'] = preg_split($pattern, $splitCustomFormat[$key]['data'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); } // cleanup, remove white spaces from key words, seperate date parm string and modifier into array; // e.g. ${ keyword ( 'aaaa' ) } => array('keyword', 'aaa',) foreach ($splitCustomFormat as $ix => $yy) { foreach ($splitCustomFormat[$ix]['data'] as $keyToken => $customToken) { if (preg_match('/\\$\\{' . $whsp . '(' . $keywords_or . ')(' . $datefm . ')?' . $whsp . '}/', $customToken, $matches)) { $splitCustomFormat[$ix]['data'][$keyToken] = array(); $splitCustomFormat[$ix]['data'][$keyToken]['keyword'] = stripslashes($matches[1]); if (isset($matches[2])) { // ('aaa') => aaa $splitCustomFormat[$ix]['data'][$keyToken]['dateParm'] = preg_replace('/^\\(["\']?(.*)["\']?\\)$/', "\$1", stripslashes($matches[2])); } } else { $splitCustomFormat[$ix]['data'][$keyToken] = stripslashes($customToken); } } } $_MAMBOTS->loadBotGroup('content'); foreach ($eventsByRelDay as $relDay => $daysEvents) { reset($daysEvents); // get all of the events for this day foreach ($daysEvents as $dayEvent) { // get the title and start time $startDate = $dayEvent->publish_up; $eventDate = mktime(substr($startDate, 11, 2), substr($startDate, 14, 2), substr($startDate, 17, 2), $now_m, $now_d + $relDay, $now_Y); $startDate = mktime(substr($startDate, 11, 2), substr($startDate, 14, 2), substr($startDate, 17, 2), substr($startDate, 5, 2), substr($startDate, 8, 2), substr($startDate, 0, 4)); $endDate = $dayEvent->publish_down; $endDate = mktime(substr($endDate, 11, 2), substr($endDate, 14, 2), substr($endDate, 17, 2), substr($endDate, 5, 2), substr($endDate, 8, 2), substr($endDate, 0, 4)); $year = date('Y', $startDate); $month = date('m', $startDate); $day = date('d', $startDate); if ($asHTML) { if ($firstTime) { $content .= '<tr><td class="mod_events_latest_first">'; } else { $content .= '<tr><td class="mod_events_latest">'; } } // generate output according custom string foreach ($splitCustomFormat as $condtoken) { // evaluate all_day_event $all_day_event = false; //if ($dayEvent->publish_up == $dayEvent->publish_down) { if ($dayEvent->hup == $dayEvent->hdn && $dayEvent->minup == $dayEvent->mindn && $dayEvent->sup == $dayEvent->sdn) { $all_day_event = true; } if (isset($condtoken['cond'])) { if ($condtoken['cond'] == 'a' && !$all_day_event) { continue; } if ($condtoken['cond'] == '!a' && $all_day_event) { continue; } } foreach ($condtoken['data'] as $token) { unset($match); unset($dateParm); $match = ''; if (is_array($token)) { $match = $token['keyword']; $dateParm = isset($token['dateParm']) ? trim($token['dateParm']) : ""; } else { $content .= $token; continue; } switch ($match) { case 'endDate': case 'startDate': case 'eventDate': // Note we need to examine the date specifiers used to determine if language translation will be // necessary. Do this later when script is debugged. if (!$this->disableDateStyle && $asHTML) { $content .= '<span class="mod_events_latest_date">'; } if (!isset($dateParm) || $dateParm == '') { // no actual format specified, use default, eg. Fri Oct 12th, @7:30pm\ // use the strftime function for international support if ($this->lang == 'english') { //if($lang == 'english'){ $time_fmt = $all_day_event ? '' : ', @g:ia'; $dateFormat = $this->displayYear ? 'D, M jS, Y' . $time_fmt : 'D, M jS' . $time_fmt; $content .= date($dateFormat, ${$match}); } else { $time_fmt = $all_day_event ? '' : ' @%I:%M%p'; $dateFormat = $this->displayYear ? '%a %b %d, %Y' . $time_fmt : '%a %b %d' . $time_fmt; $content .= strftime($dateFormat, ${$match}); } } else { // if a '%' sign detected in date format string, we assume strftime() is to be used, if (preg_match("/\\%/", $dateParm)) { $content .= strftime($dateParm, ${$match}); } else { $content .= date($dateParm, ${$match}); } } if (!$this->disableDateStyle && $asHTML) { $content .= "</span>"; } break; case 'title': if (!$this->disableTitleStyle && $asHTML) { $content .= '<span class="mod_events_latest_content">'; } if ($this->displayLinks) { $content .= $this->_htmlLinkCloaking("index.php?option=" . $option . "&task=" . $task_events . "&agid=" . $dayEvent->id . "&year=" . date("Y", $eventDate) . "&month=" . date("m", $eventDate) . "&day=" . date("d", $eventDate) . "&Itemid=" . $myItemid . $cat, $dayEvent->title); } else { $content .= $dayEvent->title; } if (!$this->disableTitleStyle && $asHTML) { $content .= '</span>'; } break; case 'category': $catobj = $this->_getCategory($dayEvent->catid); $content .= $catobj->name; break; case 'contact': // Also want to cloak contact details so $this->modparams->set("image", 1); $dayEvent->text = $dayEvent->contact_info; $_MAMBOTS->trigger('onPrepareContent', array(&$dayEvent, &$this->modparams, 0), true); $dayEvent->contact_info = $dayEvent->text; $content .= $dayEvent->contact_info; break; case 'content': // Added by Kaz McCoy 1-10-2004 $this->modparams->set("image", 1); $dayEvent->text = $dayEvent->content; $results = $_MAMBOTS->trigger('onPrepareContent', array(&$dayEvent, &$this->modparams, 0), true); $dayEvent->content = $dayEvent->text; //$content .= substr($dayEvent->content, 0, 150); $content .= $dayEvent->content; break; case 'addressInfo': $content .= $dayEvent->adresse_info; break; case 'extraInfo': $content .= $dayEvent->extra_info; break; case 'createdByAlias': $content .= $dayEvent->created_by_alias; break; case 'createdByUserName': $catobj = $this->_getUser($dayEvent->created_by); $content .= $catobj->username; break; case 'createdByUserEmail': // Note that users email address will NOT be available if they don't want to receive email $catobj = $this->_getUser($dayEvent->created_by); $content .= $catobj->sendEmail ? $catobj->email : ''; break; case 'createdByUserEmailLink': // Note that users email address will NOT be available if they don't want to receive email $content .= sefRelToAbs("index.php?option=" . $option . "&task=" . $task_events . "&agid=" . $dayEvent->id . "&year=" . $year . "&month=" . $month . "&day=" . $day . "&Itemid=" . $myItemid . $cat); break; case 'color': $content .= $dayEvent->color_bar; break; case 'eventDetailLink': $content .= sefRelToAbs("index.php?option=" . $option . "&task=" . $task_events . "&agid=" . $dayEvent->id . "&year=" . $year . "&month=" . $month . "&day=" . $day . "&Itemid=" . $myItemid . $cat); break; default: if ($match) { $content .= $match; } break; } // end of switch } // end of foreach } // end of foreach if ($asHTML) { $content .= "</td></tr>\n"; } else { $content .= "\n"; } $firstTime = false; } // end of foreach } // end of foreach } else { if ($asHTML) { $content .= '<tr><td class="mod_events_latest_noevents">' . _CAL_LANG_NO_EVENTS . '</td></tr>' . "\n"; } else { $content .= _CAL_LANG_NO_EVENTS . "\n"; } } if ($asHTML) { $content .= "</table>\n"; } return $content; }
function displayCalendarMod($time, $linkString, &$day_name, $monthMustHaveEvent = false) { global $startday, $database, $timeWithOffset, $my, $modparams; $myItemid = findAppropriateMenuID($catidsOut, $modcatids, $catidList, $modparams); $gid = $my->gid; if (strlen($catidsOut) > 0) { $cat = "&catids={$catidsOut}"; } else { $cat = ""; } $cal_year = date("Y", $time); $cal_month = date("m", $time); $calmonth = date("n", $time); $month_name = EventsHelper::getMonthName($cal_month); $to_day = date("Y-m-d", $timeWithOffset); $cal_prev_month = $cal_month - 1; $cal_prev_month_yy = $cal_year; $cal_next_month = $cal_month + 1; $cal_next_month_yy = $cal_year; $cal_mod_next_year = $cal_year + 1; $cal_mod_prev_year = $cal_year - 1; $content = ''; // additional EBS if ($cal_prev_month == 0) { $cal_prev_month = 12; $cal_prev_month_yy = $cal_prev_month_yy - 1; } if ($cal_next_month == 13) { $cal_next_month = 1; $cal_next_month_yy = $cal_next_month_yy + 1; } if ($modparams->minical_showlink) { $content = '<table cellpadding="0" cellspacing="0" width="140" align="center" class="mod_events_monthyear">' . "\n" . '<tr >' . "\n"; if ($modparams->minical_showlink == 1) { $link = 'index.php?option=com_events&Itemid=' . $myItemid . $cat . '&task='; if ($modparams->minical_prevyear) { $seflinkPrevYear = sefRelToAbs($link . 'view_year' . '&day=1&month=' . $cal_month . '&year=' . $cal_mod_prev_year . '&mod_cal_year=' . $cal_mod_prev_year . '&mod_cal_month=' . $cal_month); $content .= '<td>'; $content .= '<a class="mod_events_link" href="' . $seflinkPrevYear . '" title="' . _CAL_LANG_CLICK_TOSWITCH_PY . '">«</a>' . "\n"; $content .= '</td>'; } if ($modparams->minical_prevmonth) { $seflinkPrevMon = sefRelToAbs($link . 'view_month' . '&day=1&month=' . $cal_prev_month . '&year=' . $cal_prev_month_yy . '&mod_cal_year=' . $cal_prev_month_yy . '&mod_cal_month=' . $cal_prev_month); $content .= '<td>'; $content .= '<a class="mod_events_link" href="' . $seflinkPrevMon . '" title="' . _CAL_LANG_CLICK_TOSWITCH_PM . '"><</a>' . "\n"; $content .= '</td>'; } if ($modparams->minical_actmonth == 1) { // combination of actual month and year: view month $seflinkActMonth = sefRelToAbs($link . 'view_month' . '&month=' . $cal_month . '&year=' . $cal_year); $content .= '<td align="center">'; $content .= '<a class="mod_events_link" href="' . $seflinkActMonth . '" title="' . _CAL_LANG_CLICK_TOSWITCH_MON . '">' . $month_name . '</a>' . "\n"; if ($modparams->minical_actyear < 1) { $content .= '</td>'; } } elseif ($modparams->minical_actmonth == 2) { $content .= '<td align="center">'; $content .= $month_name . "\n"; if ($modparams->minical_actyear < 1) { $content .= '</td>'; } } if ($modparams->minical_actyear == 1) { // combination of actual month and year: view year $seflinkActYear = sefRelToAbs($link . 'view_year' . '&month=' . $cal_month . '&year=' . $cal_year); if ($modparams->minical_actmonth < 1) { $content .= '<td align="center">'; } $content .= '<a class="mod_events_link" href="' . $seflinkActYear . '" title="' . _CAL_LANG_CLICK_TOSWITCH_YEAR . '">' . $cal_year . '</a>' . "\n"; $content .= '</td>'; } elseif ($modparams->minical_actyear == 2) { if ($modparams->minical_actmonth < 1) { $content .= '<td align="center">'; } $content .= $cal_year . "\n"; $content .= '</td>'; } if ($modparams->minical_nextmonth) { $seflinkNextMon = sefRelToAbs($link . 'view_month' . '&day=1&month=' . $cal_next_month . '&year=' . $cal_next_month_yy . '&mod_cal_year=' . $cal_next_month_yy . '&mod_cal_month=' . $cal_next_month); $content .= '<td>'; $content .= '<a class="mod_events_link" href="' . $seflinkNextMon . '" title="' . _CAL_LANG_CLICK_TOSWITCH_NM . '">></a>' . "\n"; $content .= '</td>'; } if ($modparams->minical_nextyear) { $seflinkNextYear = sefRelToAbs($link . 'view_year' . '&day=1&month=' . $cal_month . '&year=' . $cal_mod_next_year . '&mod_cal_year=' . $cal_mod_next_year . '&mod_cal_month=' . $cal_month); $content .= '<td>'; $content .= '<a class="mod_events_link" href="' . $seflinkNextYear . '" title="' . _CAL_LANG_CLICK_TOSWITCH_NY . '">»</a>' . "\n"; $content .= '</td>'; } // combination of actual month and year: view year & month [ mic: not used here ] // $seflinkActYM = sefRelToAbs( $link . 'view_month' . '&month=' . $cal_month // . '&year=' . $cal_year ); } else { // show only text $content .= '<td>'; $content .= $month_name . ' ' . $cal_year; $content .= '</td>'; } $content .= "</tr>\n" . "</table>\n"; } $content .= '<table align="center" class="mod_events_table" cellspacing="0" cellpadding="2">' . "\n" . '<tr class="mod_events_dayname">' . "\n"; // Days name rows for ($i = 0; $i < 7; $i++) { $content .= "<td class='mod_events_td_dayname'>" . $day_name[($i + $startday) % 7] . "</td>\n"; } $content .= "</tr>\n"; // dmcd May 7/04 fix to fill in end days out of month correctly $dayOfWeek = $startday; $start = (date("w", mktime(0, 0, 0, $cal_month, 1, $cal_year)) - $startday + 7) % 7; $d = date("t", mktime(0, 0, 0, $cal_month, 0, $cal_year)) - $start + 1; if ($start > 0) { $content .= "<tr>\n"; } for ($a = $start; $a > 0; $a--) { $content .= "<td class='mod_events_td_dayoutofmonth'>" . $d++ . "</td>\n"; $dayOfWeek++; } $monthHasEvent = false; $lastDayOfMonth = date("t", mktime(0, 0, 0, $cal_month, 1, $cal_year)); /********** COPIED FROM EVENTS.PHP **********/ $select_date = $cal_year . '-' . $cal_month . '-01 00:00:00'; $select_date_fin = $cal_year . '-' . $cal_month . '-' . $lastDayOfMonth . ' 23:59:59'; $query = "SELECT #__events.*" . "\n , YEAR(publish_up ) as yup, MONTH(publish_up ) as mup, DAYOFMONTH(publish_up ) as dup" . "\n , YEAR(publish_down) as ydn, MONTH(publish_down) as mdn, DAYOFMONTH(publish_down) as ddn" . "\n , HOUR(publish_up ) as hup, MINUTE(publish_up ) as minup, SECOND(publish_up ) as sup" . "\n , HOUR(publish_down) as hdn, MINUTE(publish_down) as mindn, SECOND(publish_down) as sdn" . "\n FROM #__events" . "\n WHERE #__events.catid IN(" . accessibleCategoryList($gid, $modcatids, $catidList) . ")" . "\n AND #__events.access <= {$gid}" . "\n AND (((publish_up >= '{$select_date}%' AND publish_up <= '{$select_date_fin}%')" . "\n OR (publish_down >= '{$select_date}%' AND publish_down <= '{$select_date_fin}%')" . "\n OR (publish_up >= '{$select_date}%' AND publish_down <= '{$select_date_fin}%')" . "\n OR (publish_up <= '{$select_date}%' AND publish_down >= '{$select_date_fin}%')" . "\n )" . "\n AND #__events.state = '1')" . "\n ORDER BY publish_up ASC"; $database->setQuery($query); $rows = $database->loadObjectList(); /********** END COPIED FROM EVENTS.PHP **********/ $rowcount = count($rows); $repeatArray = array(); for ($i = 0; $i < $rowcount; $i++) { // build array of dates for each event $repeatArray[$i] = mosEventRepeatArrayMonth($rows[$i], $cal_year, $cal_month); } for ($d = 1; $d <= $lastDayOfMonth; $d++) { // Note that if we are on the last day of the month and last day of week then we won't have // any out of month days so don't start a new row! if ((date('w', mktime(0, 0, 0, $cal_month, $d, $cal_year)) - $startday) % 7 == 0) { // && $d!=date( 't', mktime( 0, 0, 0, $cal_month, $d, $cal_year ))){ $content .= "<tr>"; } $do = $d < 10 ? "0{$d}" : "{$d}"; $selected_date = "{$cal_year}-{$cal_month}-{$do}"; $cellDate = mktime(0, 0, 0, $cal_month, $d, $cal_year); $mark_bold = ''; $mark_close_bold = ''; $class = $selected_date == $to_day ? 'mod_events_td_todaynoevents' : 'mod_events_td_daynoevents'; $dayHasEvent = false; for ($r = 0; $r < $rowcount && !$dayHasEvent; $r++) { if (array_key_exists($cellDate, $repeatArray[$r])) { $monthHasEvent = true; $dayHasEvent = true; $mark_bold = "<b>"; $mark_close_bold = "</b>"; $class = $selected_date == $to_day ? "mod_events_td_todaywithevents" : "mod_events_td_daywithevents"; break; } } $sefdaylink = sefRelToAbs("index.php?option=com_events&task=view_day&year=" . $cal_year . "&month=" . $cal_month . "&day=" . $do . "&Itemid=" . $myItemid . $cat); $content .= "<td class='" . $class . "'><a class='mod_events_daylink' href='" . $sefdaylink . "' title='" . _CAL_LANG_CLICK_TOSWITCH_DAY . "'>" . $mark_bold . $d . $mark_close_bold . "</a></td>\n"; // Check if Next week row // dmcd May 7/04 fix to fill in end days out of month correctly //if(((date("w",mktime(0,0,0,$cal_month,$d,$cal_year))-$startday+1)%7)==0) { if ((1 + $dayOfWeek++) % 7 == $startday && intval($d) != date('t', mktime(0, 0, 0, $cal_month, $d, $cal_year))) { $content .= "</tr>\n"; } } // Days out of the month // dmcd May 7/04 fix to fill in end days out of month correctly //if(((date("w",mktime(0,0,0,$cal_month+1,1,$cal_year))-$startday)%7)<>1) { $d = 1; // while(((date("w",mktime(0,0,0,($cal_month+1),$d,$cal_year))-$startday+1)%7)<>1) { while ($dayOfWeek++ % 7 != $startday) { $content .= '<td class="mod_events_td_dayoutofmonth">' . $d . "</td>\n"; $d++; } $content .= '</tr></table>' . "\n"; // Many people found this confusing! (geraint) /* just a textlink [mic] - if wanted just delete the remarks at cont[] * if remarks are deleted at content, the links will be displayed right after each months * otherwise with cont[] as 1 block after the last month */ //$seflink = sefRelToAbs( 'index.php?option=com_events&task=view_month&Itemid=' . $myItemid //. '&month=' . $cal_month . '&year=' . $cal_year ); //$content .= '<table width="140" align="center"><tr><td class="mod_events_thismonth" >' . "\n"; //$content .= '<div align="center"><a class="mod_events_link" href="' . $seflink . '">' //. $linkString . '</a></div>' . "\n"; //$cont[] .= '<div align="center"><a class="mod_events_link" href="' . $seflink . '">' . $linkString.'</a></div>'."\n"; //$content .= '</td></tr>' . "\n"; //$content .= '</table>' . "\n"; /* end textlink */ // Now check to see if this month needs to have at least 1 event in order to display if (!$monthMustHaveEvent || $monthHasEvent) { return $content; } else { return ''; } }