'representant') * @return string */ public function _formatTemplate ($file, array $subs) { $tplObj = new FileReader($file); $tpl = $tplObj->read($tplObj->length()); foreach ($subs as $k => $v) $tpl=str_replace("{{$k}}",$v,$tpl); return $tpl; } /** * Verifica se uma data passada é uma data de verdade * * @param string $date no formato YYYY-MM-DD HH:NN ou YYYY-MM-DD * @return bool */ public function _isValidDate($date) { $date=trim($date); preg_match('@^(\d{4}-\d{2}-\d{2})(\s\d{2}:\d{2})?$@', $date, $match); if (!(bool) $match) return false; if (sizeof(split(' ',$date)) == 1) $time = '00:00'; else list($date, $time) = split(' ', $date); list($year, $month, $day) = split('-', $date); list($hour, $minute) = split(':', $time); if (date('Y-m-d', mktime(0,0,0,$month,$day,$year)) !== $date) return false; if ((int) $hour > 23 || (int) $minute > 59) return false; return true; } /** * Initializate the plugin * * @return object $wpdb */ public function init () { global $wpdb; Agenda::$wpdb = $wpdb; Agenda::$info = array('plugin_dir' => dirname(__FILE__)); add_action ('admin_menu', array('Agenda','options')); register_sidebar_widget('Agenda', array('Agenda', 'widget_agenda_lista')); return Agenda::$wpdb; } /** * Make option Page */ function option_page () { $dir=Agenda::$info['plugin_dir']; $o=ob_get_contents();ob_end_clean();ob_start();wp_nonce_field('update-options');$wp_nonce_field=ob_get_flush();ob_end_clean(); $options = array (); $categories=get_categories(array('hide_empty' => false)); foreach ($categories as $cat) $options[] = sprintf('', $cat->cat_ID, ($cat->cat_ID == get_option('event_category') ? ' selected="selected"' : ''), $cat->category_nicename); $options = implode ("\n", $options); ob_start(); print $o . Agenda::_formatTemplate("$dir/form_option.html", array( 'TITLE' => __('Events Options'), 'UPDATE_OPTIONS' => $wp_nonce_field, 'OPTIONS' => $options, 'CATEGORY' => __('Global Category
Who manipulate yours events?'), 'SAVE' => __('Save') )); } /** * Makes the menu options, calling the right function * */ function options (){ add_management_page (__('Events'), __('Events'), 8, 'agenda/manage', array('Agenda','manipulate_list')); add_action('load-edit.php', array('Agenda', 'loadEditPage')); add_action('load-write_page_agenda/write', array('Agenda', 'loadWriteEvent')); add_submenu_page( 'post.php', 'Write', 'Event', 8, 'agenda/write', array('Agenda', 'manipulate')); add_options_page(__('Agenda'), __('Agenda'), 10, 'agenda/options', array('Agenda', 'option_page')); register_widget_control('Agenda', array('Agenda', 'widget_agenda_lista_control')); } /** * Creates a configuration for the widget */ function widget_agenda_lista_control() { $dir = Agenda::$info['plugin_dir']; $options = get_option('widget_agenda_lista'); if ( !is_array($options) ) $options = array('title'=> __('List of events'),'next'=>5,'destak'=>true, 'show_date' => true, 'before'=>'
  • ', 'after'=>'
  • '); if ($_POST['widget_agenda_lista-submit']) { foreach (array('title', 'next', 'before', 'after', 'destak', 'show_date') as $item) $options[$item]=$_POST['widget_agenda_lista-'.$item]; update_option('widget_agenda_lista', $options); } foreach (array('destak', 'show_date') as $item) $options[$item] = $options[$item] == 'true' ? ' checked="checked"' : ''; extract($options); print Agenda::_formatTemplate("$dir/widget.html",array( 'TITLE' => __('Title'), 'NEXT' => __('Next'), 'EVENTS' => __('events'), 'ONLY_DESTAK' => __('Show only Highlighted Events'), 'SHOW_DATE' => __('Show date'), 'BEFORE' => __('Before each event'), 'AFTER' => __('After each event'), 'v_title' => $title, 'v_next' => $next, 'v_destak' => $destak, 'v_show_date' => $show_date, 'v_before' => $before, 'v_after' => $after, )); } /** * Generates a widget for your events */ function widget_agenda_lista ($args) { extract($args); $options=get_option('widget_agenda_lista'); foreach (array('destak', 'show_date') as $item) $options[$item] = ($options[$item] === 'true'); extract($options); echo $before_widget . $before_title . $title . $after_title; agenda_list ($next, $destak, $show_date, $before, $after); echo $after_widget; } /** * Add filter for edit post */ public function loadEditPage() { add_filter('request', array ('Agenda', 'filter_posts')); } /** * Load Scripts on Edit/Write Event */ public function loadWriteEvent () { wp_enqueue_script('post'); if ( user_can_richedit() ) wp_enqueue_script('editor'); add_thickbox(); wp_enqueue_script('thickbox'); wp_enqueue_script('media-upload'); } public function filter_posts ($q) { $q['cat'] = implode (',', array($q['cat'], '-'.get_option('event_category'))); return $q; } /** * Install the plugin, create the categorie and put the id in the wordpress options * * @return true */ public function install () { $wpdb = Agenda::init(); /* @var $wpdb wpdb */ $cat_id = $wpdb->get_var("SELECT * FROM $wpdb->terms WHERE slug = '__events__'"); if (!$category) { $cat = array('cat_name' => '__events__', 'category_description' => 'Events Category', 'category_nicename' => '__events__'); $cat_id = wp_insert_category ($cat); } add_option ('event_category', $cat_id); return true; } /** * Generates a form to make an event * * @param bool $print If true, prints this form */ public function form ($post = array(), $msg = '', $print = true) { global $current_user, $user_ID; $default_post = array( 'v_what' => '', 'v_when_start_date' => '', 'v_when_start_time' => '', 'v_when_end_date' => '', 'v_when_end_time' => '', 'v_all_day' => '', 'v_where' => '', 'v_calendar' => array(), 'content' => '', 'v_tags' => '', 'v_repeat_weekly_on_sunday' => '', 'v_repeat_weekly_on_monday' => '', 'v_repeat_weekly_on_tuesday' => '', 'v_repeat_weekly_on_wednesday' => '', 'v_repeat_weekly_on_thursday' => '', 'v_repeat_weekly_on_friday' => '', 'v_repeat_weekly_on_saturday' => '', 'v_repeat_no_repeat' => '', 'v_repeat_daily' => '', 'v_repeat_weekly' => '', 'v_repeat_monthly' => '', 'v_repeat_yearly' => '', 'repeat_monthly_by' => '', 'v_repeat_monthly_by_day_of_the_week' => '', 'v_repeat_monthly_by_day_of_the_month' => '', 'range' => '', 'v_range_never' => '', 'v_range_until' => '', 'v_range_ends_until' => '', 'repeat_weekly_every' => '', 'repeat_daily_every' => '', 'repeat_monthly_every' => '', 'repeat_yearly_every' => '', 'v_excerpt' => '', 'v_author' => $user_ID, 'v_pings' => 'open', 'v_comments' => 'open', 'v_destak' => 0 ); $post = array_merge((array) $default_post, (array) $post, $_REQUEST); $post['v_author'] = wp_dropdown_users( array('include' => $authors, 'name' => 'v_author', 'selected' => $post['v_author'], 'echo' => false) ); ob_start (); checked($post['v_pings'], 'open'); $post['v_pings'] = ob_get_contents(); ob_end_clean(); ob_start (); checked($post['v_destak'], '1'); $post['v_destak'] = ob_get_contents(); ob_end_clean(); ob_start (); checked($post['v_comments'], 'open'); $post['v_comments'] = ob_get_contents(); ob_end_clean(); ob_start (); the_editor($post['content'], 'content', 'title', true); $editor = ob_get_contents(); ob_end_clean(); $post['v_repeat_monthly_by_day_of_the_'.($post['repeat_monthly_by'] == 'week' ? 'week' : 'month')] = ' checked="checked"'; $post['v_range_'.($post['range'] == 'never' ? 'never' : 'until')] = ' checked="checked"'; if ($post['v_all_day'] == 'v_all_day') $post['v_all_day'] = ' checked="checked"'; if (in_array($post['repeat'], array('no_repeat','daily','weekly','monthly','yearly'))) $post['v_repeat_'.$post['repeat']] = ' checked="checked"'; foreach (array ('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday') as $item) if ($post['v_repeat_weekly_on_'.$item]) $post['v_repeat_weekly_on_'.$item] = ' checked="checked"'; $wpdb = Agenda::init(); $dir = Agenda::$info['plugin_dir']; $style = Agenda::_formatTemplate("$dir/style.css", array()); $style = preg_replace ('/(\{|;)\n\s*/i', '${1}', $style); $style = preg_replace ('/:\s+/', ':', $style); $style = preg_replace ('/\n+/', "\n", $style); $script = Agenda::_formatTemplate("$dir/script.js", array()); $options = array(); foreach (array ('repeat_weekly_every', 'repeat_daily_every', 'repeat_monthly_every', 'repeat_yearly_every') as $v) foreach (range(1,30) as $i) $options[$v][] = vsprintf( '', array ($i, $post[$v] == $i ? ' selected="selected"' : '') ); $cats = get_categories ('hide_empty=0&child_of='.get_option('event_category')); $options_calendar = array (); foreach ($cats as $cat) $options_calendar[] = sprintf('', $cat->term_id, in_array($cat->term_id, $post['v_calendar']) ? ' selected="selected"' : '', $cat->name); array_walk($options, create_function('&$a', '$a = implode (\'\', $a);')); if (trim($msg)) $msg = "

    {$msg}

    "; $dados = array( 'STYLE' => $style, 'SCRIPT' => $script, 'MSG' => $msg, 'INPUT_ID' => sprintf ('', $post['event_id'] ? $post['event_id'] : '0'), 'WRITE_EVENT' => __('Write Event'), 'WHAT' => __('What'), 'WHEN' => __('When'), 'TO' => __('to'), 'ALL_DAY' => __('All day'), 'REPEATS' => __('Repeats'), 'NO_REPEAT' => __('No repeat'), 'REPEAT_DAILY' => __('Daily'), 'REPEAT_EVERY' => __('Every'), 'DAILY_OPTIONS' => $options['repeat_daily_every'], 'DAYS' => __('days'), 'REPEAT_WEEKLY' => __('Weekly'), 'WEEKLY_OPTIONS' => $options['repeat_weekly_every'], 'WEEKS' => __('Weeks'), 'REPEAT_ON' => __('Repeat on'), 'SUNDAY' => __('S'), 'MONDAY' => __('M'), 'TUESDAY' => __('T'), 'WEDNESDAY' => __('W'), 'THURSDAY' => __('T'), 'FRIDAY' => __('F'), 'SATURDAY' => __('S'), 'REPEAT_MONTHLY' => __('Monthly'), 'MONTHLY_OPTIONS' => $options['repeat_monthly_every'], 'MONTHS' => __('Months'), 'REPEAT_BY' => __('Repeat by'), 'DAY_OF_THE_MONTH' => __('Day of the month'), 'DAY_OF_THE_WEEK' => __('Day of the week'), 'REPEAT_YEARLY' => __('Yearly'), 'YEARLY_OPTIONS' => $options['repeat_yearly_every'], 'YEARS' => __('Years'), 'RANGE' => __('Range'), 'ENDS' => __('Ends:'), 'NEVER' => __('Never'), 'UNTIL' => __('Until'), 'WHERE' => __('Where'), 'CALENDAR' => __('Calendar'), 'OPTIONS_CALENDAR' => implode ("\n", $options_calendar), 'DESCRIPTION' => __('Descrption'), 'THE_EDITOR' => $editor, 'TAGS' => __('Tags'), 'HOWTO_TAGS' => __('Separate tags with commas'), 'EXCERPT' => __('Excerpt'), 'AUTHOR' => __('Author'), 'DESTAK' => __('Hightlight this event'), 'ALLOW_PINGS' => __('Allow pings'), 'ALLOW_COMMENTS' => __('Allow comments'), 'SAVE' => __('Save'), ); $dados = $dados + $post; $return = Agenda::_formatTemplate("$dir/form.html",$dados); if ($print) print $return; return $return; } /** * Manipulate, create (save) and edit form * * @param array $request * @param bool $print * @return string */ public function manipulate($request = array(), $print = true) { if ($_REQUEST) $request = (array) $request + (array) $_REQUEST; $mensagem = ''; if ($request['all_day'] == 'all_day') $request['v_all_day'] = ' checked="checked"'; if ($request['submit']) { $request['event_id'] = Agenda::saver(); $mensagem = __('The event has been saved.'); } if ($request['edit_id']) { $request = Agenda::req($request['edit_id']); } return Agenda::form($request, $mensagem, $print); } /** * Generates a list of events for manipulate * */ public function manipulate_list () { $p = preg_match('@^\d+$@', $_REQUEST['p']) ? $_REQUEST['p'] : 1; $message = ''; if ($_GET['delete_id']) $message = vsprintf('

    %1$s %2$s

    ', array( __('Are you sure that you want to delete this event(s)?'), sprintf('%s', implode ('&delete_id[]=',$_GET['delete_id']), __('Yes')) )); if ($_GET['delete_id'] && $_GET['confirm']) { foreach ($_GET['delete_id'] as $item) wp_delete_post((int) $item); $message = vsprintf('

    %1$s

    ', array( __('The event(s) has been deleted sussefuly.'), )); } $dir = Agenda::$info['plugin_dir']; $args = array ( 'numberposts' => 10, 'offset' => 10*($p-1), 'category' => get_option('event_category'), ); $page_links = paginate_links( array( 'base' => add_query_arg( 'p', '%#%' ), 'format' => '', 'total' => ceil(count(get_posts(array('numberposts'=>-1,'category'=>get_option('event_category'))))/10), 'current' => $p, )); if ( $page_links ) $page_links = "
    $page_links
    "; $posts = get_posts($args); $rows = array(); if (!isset($_GET['delete_id'])) $_GET['delete_id'] = array(); foreach ($posts as $post) { $q = array_map(create_function('$a', 'return $a[0];'), get_post_custom($post->ID)); $vars = array( 'P' => $p, 'ID' => $post->ID, 'TITLE' => $post->post_title, 'DATE' => date('Y-m-d H:i', $q['_start']), 'CLASS_ACTIVE' => in_array ($post->ID, $_GET['delete_id']) ? 'class="active"' : '', ); $rows[] = Agenda::_formatTemplate("{$dir}/manipulate_list_rows.html", $vars); } $vars = array( 'P' => $p, 'NEW' => __('add new'), 'MANAGE_EVENTS' => __('Manage Events'), 'DATE' => __('Date'), 'TITLE' => __('Title'), 'ACTIONS' => __('Actions'), 'ROWS' => implode ("\n\n", $rows), 'MESSAGE' => $message, 'DELETE' => __('Delete Selected Events'), 'PAGE_LINKS' => $page_links, ); $return = Agenda::_formatTemplate("{$dir}/manipulate_list.html", $vars); print $return; } /** * Generates the request for a determinet id * * @param int $id * @return array */ function req($id) { $post = get_post($id); $request['event_id'] = $post->ID; $request['v_what'] = $post->post_title; $request['content'] = $post->post_content; $request['v_excerpt'] = $post->post_excerpt; $request['v_author'] = $post->post_author; $request['v_pings'] = $post->ping_status; $request['v_comments'] = $post->comment_status; $request['v_calendar'] = wp_get_post_categories ($post->ID); $post = get_post_custom($post->ID); $request['v_where'] = $post['_where'][0]; $request['v_destak'] = $post['_destak'][0]; $request['v_when_start_date'] = date('Y-m-d', $post['_start'][0]); $request['v_when_start_time'] = date('H:i', $post['_start'][0]); $request['v_when_end_date'] = date('Y-m-d', $post['_end'][0]); $request['v_when_end_time'] = date('H:i', $post['_end'][0]); $request['v_all_day'] = $post['_all_day'][0] ? ' checked="checked"' : ''; $request['repeat'] = $post['_repeat'][0]; $tags = get_tags(); $ttags = array (); foreach ($tags as $item) $ttags[] = $item->name; $request['v_tags'] = implode (',', $ttags); switch ($request['repeat']) { case 'daily': $request['repeat_daily'] = 'daily'; $request['repeat_daily_every'] = $post['_every'][0]; break; case 'weekly': $request['repeat_weekly'] = 'weekly'; $request['repeat_weekly_every'] = $post['_every'][0]; foreach (explode(',',$post['_every_on'][0]) as $v) $request['v_repeat_weekly_on_'.$v] = $v; break; case 'monthly': $request['repeat_monthly'] = 'monthly'; $request['repeat_monthly_every'] = $post['_every'][0]; $request['repeat_monthly_by'] = $post['_repeat_on'][0]; break; case 'yearly': $request['repeat_yearly'] = 'yearly'; $request['repeat_yearly_every'] = $post['_every'][0]; break; } $request['range'] = $post['_range'][0]; $request['v_range_ends_until'] = $post['_range_until'][0]; return $request; } /** * Calls the save function ussing the global $_REQUEST * */ function saver () { if ($_REQUEST['repeat']) { $_REQUEST['v_all_day'] = $_REQUEST['v_all_day'] == 'v_all_day'; $r=Agenda::saveEvent( (int) $_REQUEST['event_id'], $_REQUEST['v_what'], $_REQUEST['v_when_start_date'] . ' ' . $_REQUEST['v_when_start_time'], $_REQUEST['v_when_end_date'] . ' ' . $_REQUEST['v_when_end_time'], $_REQUEST['v_all_day'], $_REQUEST['v_where'], $_REQUEST['content'], $_REQUEST ); $_REQUEST = array(); return $r; } } /** * Makes a event * * @param string $what * @param string $from No formato YYYY-NN-DD HH:MM * @param string $to No formato YYYY-NN-DD HH:MM * @param string $where * @param string $desc * @param array $repeat Array gerado pelo post contendo o repeat do evento * * @return false|int Returns integer (ID of the post) if the post has been created */ public function saveEvent ($id = 0, $what, $from, $to, $all_day=false, $where, $desc, $repeat, $jump_rules = false) { global $event_errors; $event_errors = array(); if (!$jump_rules) { if ( !current_user_can( 'edit_posts' ) ) { $event_errors[] = __('You are not allowed to create posts or drafts on this blog.'); return new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this blog.' ) ); } # Se estiver editando, verificar se ele pode postar em cima de outro usuario if ( !current_user_can( 'edit_others_posts' ) ) { $event_errors[] = __('You are not allowed to post as this user.'); return new WP_Error( 'edit_others_posts', __( 'You are not allowed to post as this user.' ) ); } } $from = trim($from); $to = trim($to) ? trim($to) : trim($from); $m='@\d{4}-\d{2}-\d{2}( \d{2}:\d{2})?@'; if (!preg_match($m, $from) || !preg_match($m, $to)) { $event_errors[] = __('Worng value on to or from dates.'); return false; } $m='@\d{4}-\d{2}-\d{2} \d{2}:\d{2}@'; if (!preg_match($m, $from)) $from .= ' 00:00'; if (!preg_match($m, $to)) $to .= ' 00:00'; list($from_date, $from_time) = split(' ', $from); list($to_date, $to_time) = split(' ', $to); list($from_year, $from_month, $from_day) = split('-', $from_date); list($to_year, $to_month, $to_day) = split('-', $to_date); if ($all_day) { $from_time = '00:00'; $to_time = '00:00'; } list($from_hour, $from_minutes) = split(':', $from_time); list($to_hour, $to_minutes) = split(':', $to_time); $from_timestamp = mktime ($from_hour, $from_minutes, 0, $from_month, $from_day, $from_year); $to_timestamp = mktime ($to_hour, $to_minutes, 0, $to_month, $to_day, $to_year); if ($from_timestamp > $to_timestamp) { $event_errors[] = $from . '>' . $to . __(' From date is larger than To date.'); return false; } $post = array( 'post_title' => $what ? $what : __('(No title)'), 'post_status' => 'publish', 'post_content' => $desc, 'post_category' => array(get_option('event_category'), $repeat['v_calendar']), 'tags_input' => $repeat['v_tags'], 'post_excerpt' => $repeat['v_excerpt'], 'ping_status' => $repeat['v_pings'], 'comment_status' => $repeat['v_comments'], ); if ($id) { $post['ID'] = $id; wp_update_post($post); } else { $id = wp_insert_post($post); } if ($all_day) add_post_meta($id, '_all_day', '1', true) or update_post_meta($id, '_all_day', '1'); else delete_post_meta($id, '_all_day', '1'); add_post_meta($id, '_start', $from_timestamp, true) or update_post_meta($id, '_start', $from_timestamp); add_post_meta($id, '_end', $to_timestamp, true) or update_post_meta($id, '_end', $to_timestamp); add_post_meta($id, '_where', $where, true) or update_post_meta($id, '_where', $where); add_post_meta($id, '_destak', $repeat['v_destak'], true) or update_post_meta($id, '_destak', $repeat['v_destak']); if (!in_array($repeat['repeat'], array ('daily', 'weekly', 'monthly', 'yearly', 'other')) || !in_array($repeat['range'], array('never', 'until'))) { $repeat['repeat'] = 'no_repeat'; $repeat['range'] = 'never'; } else { if ($repeat['range'] == 'until' && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $repeat['v_range_ends_until'])) { $repeat['repeat'] = 'no_repeat'; $repeat['range'] = 'never'; } } if ($repeat['repeat'] == 'daily') { if (!preg_match('@^\d+$@', $repeat['repeat_daily_every'])) { $repeat['repeat'] = 'no_repeat'; $repeat['range'] = 'never'; } else { add_post_meta($id, '_repeat', 'daily', true) or update_post_meta($id, '_repeat', 'daily'); add_post_meta($id, '_every', $repeat['repeat_daily_every'], true) or update_post_meta($id, '_every', $repeat['repeat_daily_every']); } } if ($repeat['repeat'] == 'weekly') { if (!preg_match('@^\d+$@', $repeat['repeat_weekly_every'])) { $repeat['repeat'] = 'no_repeat'; $repeat['range'] = 'never'; } else { $repeats_on=array(); $tmp=array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'); foreach ($tmp as $tmpi) if ($repeat['v_repeat_weekly_on_' . $tmpi]) $repeats_on[] = $tmpi; add_post_meta($id, '_repeat', 'weekly', true) or update_post_meta($id, '_repeat', 'weekly'); add_post_meta($id, '_every', $repeat['repeat_weekly_every'], true) or update_post_meta($id, '_every', $repeat['repeat_weekly_every']); add_post_meta($id, '_every_on', implode(',', $repeats_on), true) or update_post_meta($id, '_every_on', implode(',', $repeats_on)); } } if ($repeat['repeat'] == 'monthly') { if (!preg_match('@^\d+$@', $repeat['repeat_monthly_every'])) { $repeat['repeat'] = 'no_repeat'; $repeat['range'] = 'never'; } else { add_post_meta($id, '_repeat', 'monthly', true) or update_post_meta($id, '_repeat', 'monthly'); add_post_meta($id, '_every', $repeat['repeat_monthly_every'], true) or update_post_meta($id, '_every', $repeat['repeat_monthly_every']); add_post_meta($id, '_repeat_on', $repeat['repeat_monthly_by'], true) or update_post_meta($id, '_repeat_on', $repeat['repeat_monthly_by']); } } if ($repeat['repeat'] == 'yearly') { if (!preg_match('@^\d+$@', $repeat['repeat_yearly_every'])) { $repeat['repeat'] = 'no_repeat'; $repeat['range'] = 'never'; } else { add_post_meta($id, '_repeat', 'yearly', true) or update_post_meta($id, '_repeat', 'yearly'); add_post_meta($id, '_every', $repeat['repeat_yearly_every'], true) or update_post_meta($id, '_every', $repeat['repeat_yearly_every']); } } if ($repeat['repeat'] == 'no_repeat') { add_post_meta($id, '_repeat', 'no_repeat', true) or update_post_meta($id, '_repeat', 'no_repeat'); } else { add_post_meta($id, '_range', $repeat['range'], true) or update_post_meta($id, '_range', $repeat['range']); add_post_meta($id, '_range_until', $repeat['range'] == 'until' ? $repeat['v_range_ends_until'] : '', true) or update_post_meta($id, '_range_until', $repeat['range'] == 'until' ? $repeat['v_range_ends_until'] : ''); } return $id; } function tratare (&$event) { global $event_order; if (empty($event_order)) $event_order = array (); if ($event['all_day']) { $event['when_start_time'] = '00:00'; $event['when_end_time'] = '24:00'; } list($year, $month, $day) = split('-', $event['when_start_date']); list($hour, $minute) = split(':', $event['when_start_time']); $start = mktime($hour, $minute, 0, $month, $day, $year); list($year, $month, $day) = split('-', $event['when_end_date']); list($hour, $minute) = split(':', $event['when_end_time']); $end = mktime($hour, $minute, 0, $month, $day, $year); $duration = $end-$start; $event['duration'] = $duration; if ($event['repeat'] == 'no_repeat') $event['ends_on'] = 'once'; elseif ($event['range'] == 'never') $event['ends_on'] = 'never'; else { list($year, $month, $day) = split('-', $event['range_ends_until']); $event['ends_on'] = mktime(0,1,0,$month,$day,$year); } list($hour, $minute) = split(':', $event['when_start_time']); list($year, $month, $day) = split('-', $event['when_start_date']); if ($event['repeat'] == 'monthly' && $event['repeat_monthly_by'] == 'week') { $r_d_week = date('w', $start); $l_month = mktime(0, 0, 0, $month, 1, $year); $ld_month = date('t', $l_month); for ($i=1,$w=1;$i<$ld_month;$i++) { $tmp=mktime($hour,$minute,0,$month,$i,$year); if ($i>1 && date('w',$tmp) == 0) $w++; if ($i==$day) {$r_w_weel = $w;break;} } } if ($event['repeat'] == 'weekly') { $w_days = array(); foreach (array ('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday') as $item) if (isset($event['repeat_weekly_on_'.$item])) $w_days[] = $item; $w_time = $start; $event_order[] = "{$start}|{$event['event_id']}"; } for ($i=0; $i < 100; $i++) { if ($event['ends_on'] == 'once') { $time = $start; } if ($event['repeat'] == 'daily') { $repeat_time = $i*($event['repeat_daily_every']-1); $time = mktime($hour, $minute, $duration*$i, $month, $day+$repeat_time, $year); } if ($event['repeat'] == 'yearly') { $time = mktime($hour, $minute, 0, $month, $day, $year+$i*$event['repeat_yearly_every']); if(!$time) break; } if ($event['repeat'] == 'monthly') { if ($event['repeat_monthly_by'] == 'month') { $time = mktime($hour, $minute, 0, $month+$i*$event['repeat_monthly_every'], $day, $year); } if ($event['repeat_monthly_by'] == 'week') { $r_month = $month + ($i*$event['repeat_monthly_every']); $t_month = mktime(0, 0, 0, $r_month, 1, $year); $d_month = date('t', $t_month); for ($j=1,$w=1;$j<$d_month;$j++) { $tmp=mktime($hour,$minute,0,$month+$i,$j,$year); if($j>1&&date('w',$tmp)==0)$w++; if ($w<$r_w_week) continue; if ($r_d_week == date('w', $tmp)) {$time = $tmp;break 1;} } } } if ($event['repeat'] == 'weekly') { for ($j=0,$w_time+=(24*60*60);$j<7;$j++,$w_time+=(24*60*60)){ if (in_array(strtolower(date('l', $w_time)), $w_days)) { $time=$w_time; break 1; } } } if (preg_match('@^\d+$@', $event['ends_on']) && $time > $event['ends_on']) break; $event_order[] = "{$time}|{$event['event_id']}"; if ($event['ends_on'] == 'once') break; } } function the_events ($only_destak=false) { global $event_order; if (gettype($event_order)!=='array') $event_order=array (); $args = array ( 'numberposts' => -1, 'category' => get_option('event_category'), ); $posts = get_posts($args); $return = array(); foreach ($posts as $post) { $tmp = Agenda::req($post->ID); if($only_destak && !$tmp['v_destak']) continue; foreach ($tmp as $k=>$v) { if (preg_match('@^v_@', $k)) { $tmp[preg_replace('@^v_@', '', $k)] = $v; unset ($tmp[$k]); } } if ($tmp['all_day']) { $tmp['all_day'] = true; unset($tmp['when_start_time'], $tmp['when_end_time']); } if ($tmp['repeat']=='no_repeat') { unset($tmp['range'], $tmp['range_ends_until']); } $return[] = $tmp; } array_filter($return, array('Agenda', 'tratare')); sort($event_order); return $return; } public function next_events ($next = 5,$only_destak=false) { global $event_order; if (gettype($event_order)!=='array') $event_order=array (); $events = Agenda::the_events($only_destak); $now = time(); $return = array(); foreach ($event_order as $item) { list($time,$id)=explode('|', $item); if ($now>$time) continue; $e=Agenda::req($id); $return[] = array('utime'=>$time,'date'=>date('d-m-Y H:i', $time),'id'=>$id,'event'=>$e); if ($next<=++$i) break; } return $return; } function events_on ($args) { global $event_order; $defaults = array( 'month' => date('m'), 'year' => date('Y'), ); $args = wp_parse_args($args, $defaults); extract($args); $month=(int) $month; $year=(int) $year; if (!is_int($month) || (!is_int($year) && $year!=false)) return; if (gettype($event_order)!=='array') $event_order=array (); $events = Agenda::the_events($only_destak); $return = array(); if ($month) { $start = mktime(0,0,0,$month, 1, $year); $end = mktime(0,0,0,$month+1, 0, $year); } else { $start = mktime(0,0,0,1, 1, $year); $end = mktime(0,0,0,1, 0, $year+1); } foreach ($event_order as $item) { list($time,$id)=explode('|', $item); $e=Agenda::req($id); if ($time<$start || $time>$end) continue; $return[] = array('utime'=>$time,'date'=>date('d-m-Y H:i', $time),'id'=>$id,'event'=>$e); } return $return; } } function agenda_list ($next=5, $only_destak=true, $show_date=true, $before='
  • ', $after='
  • ', $print=true) { $e = Agenda::next_events($next,$only_destak); $itens=array (); foreach ($e as $item) { $p = get_post($item['id']); $itens[] = sprintf ('%s%s%s%s%s%s', $before, $p->guid, $item['event']['v_what'], (!$only_destak ? ($item['event']['v_destak'] == '1' ? '' : '') : ''), $show_date ? $item['date'] . ' - ' : '', $item['event']['v_what'], (!$only_destak ? ($item['event']['v_destak'] == '1' ? '' : '') : ''), $after ); } $return = implode("\n", $itens); if ($print) print ($return); return $return; } function agenda_compromissos ($next=25, $title_tag='h3', $print=true) { $e = Agenda::next_events($next); $itens=array (); foreach ($e as $item) { $p = get_post($item['id']); $itens[date('d-m-Y', $item['utime'])][] = sprintf ('
  • %s
  • ', $p->guid, $item['event']['v_what'], $item['event']['v_what'] ); } $r=''; $i=0; foreach ($itens as $key => $value) { $i++; $even_odd='event_'.($i%2?'even':'odd'); $r.="
    \n\n<$title_tag>$key
    '; } if ($print) print ($r); return $r; } function agenda_events($args='') { $defaults = array( 'month' => date('m'), 'year' => date('Y'), 'title_tag' => 'h3', 'print' => '1' ); $args = wp_parse_args($args, $defaults); extract($args); $month=(int) $month; $year=(int) $year; $events = Agenda::events_on($args); $itens=array (); foreach ($events as $item) { $p = get_post($item['id']); $itens[date('d-m-Y', $item['utime'])][] = sprintf ('
  • %s
  • ', $p->guid, $item['event']['v_what'], $item['event']['v_what'] ); } $r=''; $i=0; foreach ($itens as $key => $value) { $even_odd='event_'.(++$i%2?'even':'odd'); $r.="
    \n\n<$title_tag>$key
    '; } if ($print) print ($r); return $r; } $ucmPluginFile = substr(strrchr(dirname(__FILE__),DIRECTORY_SEPARATOR),1).DIRECTORY_SEPARATOR.basename(__FILE__); register_activation_hook($ucmPluginFile, array('Agenda','install')); add_action('init', array ('Agenda', 'init'), 10);