current_date = getdate(); // set today 00:00:00 as start date $this->date_start = mktime(0, 0, 0, $this->current_date['mon'], $this->current_date['mday'], $this->current_date['year']); // by default date_start + 1 year $this->date_end = mktime(0, 0, 0, $this->current_date['mon'], $this->current_date['mday'], $this->current_date['year'] + 1) - 1; $this->dbReset(); } /** * Reset db base vars */ function dbReset() { $this->where = ''; $this->select = '*'; $this->join_on = ''; $this->group_by = ''; $this->order_by = 'calendar_start ASC'; $this->limit = 0; } function defaultTemplate() { $this->template = ''; $this->href = ''; } /** * search string for calendar tag and parse */ function parse(& $string) { if( preg_match_all('/\{CALENDAR:(.*?)\}/s', $string, $matches) ) { if( isset($matches[1]) ) { foreach($matches[1] as $key => $value) { $this->parse_match($value); $result = $this->render(); // replace calendar by result $string = str_replace($matches[0][$key], $result, $string); } $string = html_parser($string); } } } function render() { $items = array(); foreach($this->dates as $key => $date) { $url = ''; $target = ''; $href = $this->href ? $this->href . '&show_date='.date('Y-m-d', $date['calendar_start_date']).'_'.$date['calendar_id'] : ''; if(!empty($date['calendar_refid'])) { $date['calendar_refid'] = get_redirect_link($date['calendar_refid'], ' ', ''); $date['calendar_refid']['link'] = trim($date['calendar_refid']['link']); $date['calendar_refid']['link'] = trim($date['calendar_refid']['link'], '#'); $target = $date['calendar_refid']['target']; if(is_intval($date['calendar_refid']['link'])) { $url = rel_url(array(), array(), 'aid='.$date['calendar_refid']['link']); //'index.php?aid='.$date['calendar_refid']['link']; } elseif(strpos($date['calendar_refid']['link'], '://') || strpos($date['calendar_refid']['link'], '?') || strpos($date['calendar_refid']['link'], '.')) { $url = $date['calendar_refid']['link']; } elseif(!empty($date['calendar_refid']['link'])) { $url = rel_url(array(), array(), $date['calendar_refid']['link']); } } $items[$key] = $this->template; $items[$key] = render_cnt_template($items[$key], 'HREF', $href); $items[$key] = render_cnt_template($items[$key], 'URL', $url); $items[$key] = render_cnt_template($items[$key], 'TARGET', $target); $items[$key] = render_cnt_template($items[$key], 'TITLE', html_specialchars($date['calendar_title'])); $items[$key] = render_cnt_template($items[$key], 'TEXT', plaintext_htmlencode($date['calendar_teaser'])); $items[$key] = render_cnt_template($items[$key], 'PLACE', html_specialchars($date['calendar_where'])); $items[$key] = render_cnt_date($items[$key], $date['calendar_start_date'], $date['calendar_start_date'], $date['calendar_end_date']); } return implode(LF, $items); } /** * Parse matched replacement tag */ function parse_match($match='') { $default = array(); $match = trim($match); // set query defaults $this->dbReset(); $this->defaultTemplate(); if($match !== '' && strpos($match, '=') !== FALSE ) { // oh yes fix, in case LF was converted to
by phpwcms $match = str_replace('
', LF, $match); // result is a normal array $match = parse_ini_str($match, false); $default['items'] = isset($match['items']) ? intval($match['items']) : 0; $default['template'] = empty($match['template']) ? '' : trim($match['template']); $default['lang'] = empty($match['lang']) ? '' : trim($match['lang']); $default['tag'] = empty($match['tag']) ? '' : trim($match['tag']); $default['tagmode'] = empty($match['tagmode']) ? 'OR' : ( trim($match['tagmode']) == 'AND' ? 'AND' : 'OR' ); $default['href'] = empty($match['href']) ? '' : trim($match['href']); } else { // base format // 2,main_page.tmpl,de en, href, tag1, tag2 tag2, tag3 : date_start, date_end // [item count,[template[,language(en de - separated by space)[, href, tags, tag, tag, tag]]]] $match = explode(',', $match, 5); $default['items'] = intval($match[0]); $default['lang'] = empty($match[1]) ? '' : $match[1]; $default['template'] = empty($match[2]) ? '' : trim($match[2]) ; $default['href'] = empty($match[3]) ? '' : trim($match[3]); $default['tagmode'] = 'OR'; if(empty($match[4])) { $default['tag'] = ''; } else { // check for start/end date $match[4] = explode(':', $match[4], 2); if(isset($match[4][1])) { $match[4][1] = explode(',', $match[4][1], 2); if(!empty($match[4][1][0])) { $match['date_start'] = $match[4][1][0]; } else { $match['date_start'] = 'TODAY'; } if(!empty($match[4][1][1])) { $match['date_end'] = $match[4][1][1]; } else { $match['date_end'] = 364 * 24 * 60 * 60; // + 364 days } } } } // set custom defined start/end date if(!empty($match['date_start'])) { $match['date_start'] = trim($match['date_start']); if(strtoupper($match['date_start']) == 'TODAY') { $this->date_start = mktime(0, 0, 0, $this->current_date['mon'], $this->current_date['mday'], $this->current_date['year']); } else { $match['date_start'] = phpwcms_strtotime($match['date_start']); if($match['date_start']) { $this->date_start = $match['date_start']; } } } if(!empty($match['date_end'])) { $match['date_end'] = trim($match['date_end']); if(is_intval($match['date_end'])) { $this->date_end = $this->date_start + ($match['date_end'] * 24 * 60 * 60); } elseif(strtoupper($match['date_end']) == 'TODAY') { $this->date_end = mktime(23, 59, 59, $this->current_date['mon'], $this->current_date['mday'], $this->current_date['year']); } else { $match['date_end'] = phpwcms_strtotime($match['date_end']); if($match['date_end']) { $this->date_end = $match['date_end']; } } } if($this->date_end <= $this->date_start) { $this->date_end = mktime(0, 0, 0, $this->current_date['mon'], $this->current_date['mday'], $this->current_date['year'] + 1) - 1; } //dumpVar($this->date_start . ' - ' . $this->date_end . ' / ' . date('d.m.Y, H:i:s', $this->date_start) . ' - ' . date('d.m.Y, H:i:s', $this->date_end)); $this->limit = $default['items']; $this->href = $default['href']; if($default['template'] !== '') { $default['template'] = preg_replace('/[\/\\:]/', '', $default['template']); if(is_file(PHPWCMS_TEMPLATE.'calendar/'.$default['template'])) { $this->template = file_get_contents(PHPWCMS_TEMPLATE.'calendar/'.$default['template']); $this->template = str_replace('{STARTDATE', '{LIVEDATE', $this->template); $this->template = str_replace('{ENDDATE', '{KILLDATE', $this->template); } else { $default['template'] = ''; } } $where = array(); if($default['lang'] !== '') { $default['lang'] = str_replace(',', ' ', preg_replace('/[^a-z\-]/', '', strtolower($default['lang']))); $default['lang'] = array_intersect( convertStringToArray( $default['lang'], ' '), $GLOBALS['phpwcms']['allowed_lang']); if(count($default['lang'])) { $where[] = "calendar_lang IN ('" . implode("','", $default['lang']) . "')"; } } if($default['tag'] !== '') { $default['tag'] = convertStringToArray( strtolower( $default['tag'] ), ','); if(count($default['tag'])) { $tag_where = array(); foreach($default['tag'] as $tag) { $tag_where[] = "cat_name='".aporeplace($tag)."'"; } if(count($tag_where)) { $where[] = '(' . implode(' '.$default['tagmode'] . ' ', $tag_where) . ')'; $this->join_on = 'LEFT JOIN '.DB_PREPEND.'phpwcms_categories ON cat_pid=calendar_id'; $this->group_by = 'calendar_id'; } }; } $this->where = implode(' AND ', $where); $this->getDate(); return $default; } function getDate() { // 1 daily // 2 Every weekday (Mon-Fri) // 3 Every Mon., Wed. and Fri. // 4 Every Tues. and Thurs. // 5 Weekly // 6 Monthly // 7 yearly if(is_string($this->order_by) && trim($this->order_by) != '') { $this->order_by = ' ORDER BY '.$this->order_by; } else { $this->order_by = ''; } if(is_int($this->limit) && $this->limit > 0) { $this->limit = ' LIMIT '.$this->limit; } else { $this->limit = ''; } if(is_string($this->group_by) && trim($this->group_by) != '') { $this->group_by = ' GROUP BY '.$this->group_by; } else { $this->group_by = ''; } $sql = 'SELECT '. $this->select .', '; $sql .= "UNIX_TIMESTAMP(calendar_start) AS calendar_start_date, "; $sql .= "UNIX_TIMESTAMP(calendar_end) AS calendar_end_date "; $sql .= ' FROM '.DB_PREPEND.'phpwcms_calendar pc '; $sql .= $this->join_on; $sql .= ' WHERE '; $sql .= 'calendar_status = 1 AND '; $sql .= "calendar_start >= '".aporeplace( date('Y-m-d H:i:s', $this->date_start) )."' AND "; $sql .= "calendar_start <= '".aporeplace( date('Y-m-d H:i:s', $this->date_end) )."'"; if(!empty($this->where)) { $sql .= ' AND ' . $this->where; } $sql .= $this->group_by; $sql .= $this->order_by; $sql .= $this->limit; $this->dates = _dbQuery($sql); if( !$this->dates ) { $this->dates = array(); } } } ?>