【问题标题】:Previous Month, Next Month and Month ,Year are not working in Calendar PHP上个月,下个月和月份,年份在日历 PHP 中不起作用
【发布时间】:2018-08-15 07:37:41
【问题描述】:

我正在尝试在我的网站 (Wordpress) 上构建带有事件的自定义日历。我能够获取事件和所有内容,并且以下代码在 localhost 上适用于当前年份,但是,它不适用于实时站点。但是即使在本地主机上,月份、年份的选择也不起作用。请帮我解决这个问题:

PHP:

function draw_calendar($month,$year,$events = array()){

    /* draw table */
    $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

    /* table headings */
    $headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';

    /* days and weeks vars now ... */
    $running_day = date('w',mktime(0,0,0,$month,1,$year));
    $days_in_month = date('t',mktime(0,0,0,$month,1,$year));
    $days_in_this_week = 1;
    $day_counter = 0;
    $dates_array = array();

    /* row for week one */
    $calendar.= '<tr class="calendar-row">';

    /* print "blank" days until the first of the current week */
    for($x = 0; $x < $running_day; $x++):
        $calendar.= '<td class="calendar-day-np">&nbsp;</td>';
        $days_in_this_week++;
    endfor;

    /* keep going with days.... */
    for($list_day = 1; $list_day <= $days_in_month; $list_day++):
        $calendar.= '<td class="calendar-day"><div style="position:relative;height:100px;">';
            /* add in the day number */
            /* add in the day number */
                if($list_day < 10) {
                    $list_day = str_pad($list_day, 2, '0', STR_PAD_LEFT);
                }
            $calendar.= '<div class="day-number">'.$list_day.'</div>';


            $event_day = $year.'-'.$month.'-'.$list_day;
            if(isset($events[$event_day])) {
                foreach($events[$event_day] as $event) {
                    $calendar.= '<div class="event" style="background:yellow">'.'Couple-'.$event['title'].'</br>Wedding_id-'.$event['id'].'</br>Email-'.$event['email'].'</div>';
                }
            }
            else {
                $calendar.= str_repeat('<p>&nbsp;</p>',2);
            }
        $calendar.= '</div></td>';
        if($running_day == 6):
            $calendar.= '</tr>';
            if(($day_counter+1) != $days_in_month):
                $calendar.= '<tr class="calendar-row">';
            endif;
            $running_day = -1;
            $days_in_this_week = 0;
        endif;
        $days_in_this_week++; $running_day++; $day_counter++;
    endfor;

    /* finish the rest of the days in the week */
    if($days_in_this_week < 8):
        for($x = 1; $x <= (8 - $days_in_this_week); $x++):
            $calendar.= '<td class="calendar-day-np">&nbsp;</td>';
        endfor;
    endif;

    /* final row */
    $calendar.= '</tr>';


    /* end the table */
    $calendar.= '</table>';

    /** DEBUG **/
    $calendar = str_replace('</td>','</td>'."\n",$calendar);
    $calendar = str_replace('</tr>','</tr>'."\n",$calendar);

    /* all done, return result */
    return $calendar;
}

 /* date settings */
if(empty($_GET['month']) || empty($_GET['year'])) {
    $month = date('m');
    $year = date('Y');
}
else {

$month = (int) ($_GET['month'] ? $_GET['month'] : date('m'));
$year = (int)  ($_GET['year'] ? $_GET['year'] : date('Y'));}


/* select month control */
$select_month_control = '<select name="month" id="month">';
for($x = 1; $x <= 12; $x++) {
  $select_month_control.= '<option value="'.$x.'"'.($x != $month ? '' : ' selected="selected"').'>'.date('F',mktime(0,0,0,$x,1,$year)).'</option>';
}
$select_month_control.= '</select>';

/* select year control */
$year_range = 7;
$select_year_control = '<select name="year" id="year">';
for($x = ($year-floor($year_range/2)); $x <= ($year+floor($year_range/2)); $x++) {
  $select_year_control.= '<option value="'.$x.'"'.($x != $year ? '' : ' selected="selected"').'>'.$x.'</option>';
}
$select_year_control.= '</select>';

/* "next month" control */
$next_month_link = '<a href="?month='.($month != 12 ? $month + 1 : 1).'&year='.($month != 12 ? $year : $year + 1).'" class="control" style="color:black;background:white;">Next Month &gt;&gt;</a>';

/* "previous month" control */
$previous_month_link = '<a href="?month='.($month != 1 ? $month - 1 : 12).'&year='.($month != 1 ? $year : $year - 1).'" class="control" style="color:black;background:white;">&lt;&lt;  Previous Month</a>';


/* bringing the controls together */
$controls = '<form method="get">'.$select_month_control.$select_year_control.'&nbsp;<input type="submit" name="submit" value="Go" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$previous_month_link.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$next_month_link.' </form>';

/* get all events for the given month */
global $wpdb;
$table_name = $wpdb->prefix . 'contract';
$table_name1 = $wpdb->prefix . 'wedding';
$month = str_pad($month,2,"0", STR_PAD_LEFT);
    $events = array();
$results = $wpdb->get_results( "SELECT c.cname AS title,c.id AS id,c.email as email, DATE_FORMAT(w.wdate,'%Y-%m-%d') AS event_date FROM $table_name c,$table_name1 w WHERE w.wdate LIKE '$year-$month%' and w.id=c.wedding_id",ARRAY_A);
 foreach ( $results as $row ) {
 $events[$row['event_date']][] = $row;
}

HTML:

<div id="primary" class=" col-xs-12 col-md-8" >
    <div id="calendar_div" style="padding:20px">
        <?php 
echo '<h2 style="float:left; padding-right:30px;color:black;background:white;">'.date('F',mktime(0,0,0,$month,1,$year)).' '.$year.'</h2>';
echo '<div style="float:left;">'.$controls.'</div>';
echo '<div style="clear:both;"></div>';
echo draw_calendar($month,$year,$events);
echo '<br /><br />';?>
    </div>
  </div>

【问题讨论】:

  • 你在date('w',mktime(0,0,0,$month,1,$year));上检查过你的结果吗
  • 是的,日历正在提供当前月份的输入,并且在前端可见。因此,它显示的是当年当前月份的天数。

标签: php sql wordpress calendar


【解决方案1】:

由于我自己找到了解决方案,因此我想发布一个答案,可能会对处于这种情况的其他人有所帮助。但是,我在 WordPress 中使用了自定义会话,这可能不是最好的或推荐的方式,但该网站是内部的,不需要超过少数员工的使用,我决定采用这条路线。

问题是 Wordpress 不允许在 URL 中使用年份,这干扰了我的整体工作:

代码如下: PHP:

function draw_calendar($calmonth,$calyear,$events = array()){


    /* draw table */
    $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

    /* table headings */
    $headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';

    /* days and weeks vars now ... */
    $running_day = date('w',mktime(0,0,0,$calmonth,1,$calyear));
    $days_in_month = date('t',mktime(0,0,0,$calmonth,1,$calyear));
    $days_in_this_week = 1;
    $day_counter = 0;
    $dates_array = array();

    /* row for week one */
    $calendar.= '<tr class="calendar-row">';

    /* print "blank" days until the first of the current week */
    for($x = 0; $x < $running_day; $x++):
        $calendar.= '<td class="calendar-day-np">&nbsp;</td>';
        $days_in_this_week++;
    endfor;

    /* keep going with days.... */
    for($list_day = 1; $list_day <= $days_in_month; $list_day++):
        $calendar.= '<td class="calendar-day"><div style="position:relative;height:100px;">';
            /* add in the day number */
            /* add in the day number */
                if($list_day < 10) {
                    $list_day = str_pad($list_day, 2, '0', STR_PAD_LEFT);
                }
            $calendar.= '<div class="day-number">'.$list_day.'</div>';


            $event_day = $calyear.'-'.$calmonth.'-'.$list_day;
            if(isset($events[$event_day])) {
                foreach($events[$event_day] as $event) {
                    $calendar.= '<div class="event" style="background:yellow">'.'Couple-'.$event['title'].'</br>Wedding_id-'.$event['id'].'</br>Email-'.$event['email'].'</div>';
                }
            }
            else {
                $calendar.= str_repeat('<p>&nbsp;</p>',2);
            }
        $calendar.= '</div></td>';
        if($running_day == 6):
            $calendar.= '</tr>';
            if(($day_counter+1) != $days_in_month):
                $calendar.= '<tr class="calendar-row">';
            endif;
            $running_day = -1;
            $days_in_this_week = 0;
        endif;
        $days_in_this_week++; $running_day++; $day_counter++;
    endfor;

    /* finish the rest of the days in the week */
    if($days_in_this_week < 8):
        for($x = 1; $x <= (8 - $days_in_this_week); $x++):
            $calendar.= '<td class="calendar-day-np">&nbsp;</td>';
        endfor;
    endif;

    /* final row */
    $calendar.= '</tr>';


    /* end the table */
    $calendar.= '</table>';

    /** DEBUG **/
    $calendar = str_replace('</td>','</td>'."\n",$calendar);
    $calendar = str_replace('</tr>','</tr>'."\n",$calendar);

    /* all done, return result */
    return $calendar;

}

/*Getting the Date */

if (empty($_GET['calmonth']) ||empty($_GET['calyear']) ){
   $calmonth = date('m');
    $calyear = date('Y');}

    else {
    $_SESSION['calmonth'] = $_GET['calmonth'];
    $_SESSION['calyear'] = $_GET['calyear'];
    $calmonth = $_SESSION['calmonth'];
     $calyear = $_SESSION['calyear'];}


/* select month control */
$select_month_control = '<select name="calmonth" id="calmonth">';
for($x = 1; $x <= 12; $x++) {
  $select_month_control.= '<option value="'.$x.'"'.($x != $calmonth ? '' : ' selected="selected"').'>'.date('F',mktime(0,0,0,$x,1,$calyear)).'</option>';
}
$select_month_control.= '</select>';

/* select year control */
$year_range = 7;
$select_year_control = '<select name="calyear" id="calyear">';
for($x = ($calyear-floor($year_range/2)); $x <= ($calyear+floor($year_range/2)); $x++) {
  $select_year_control.= '<option value="'.$x.'"'.($x != $calyear ? '' : ' selected="selected"').'>'.$x.'</option>';
}
$select_year_control.= '</select>';



 /* "next month" control */
$next_month_link = '<a href="?calmonth='.($calmonth != 12 ? $calmonth + 1 : 1).'&calyear='.($calmonth != 12 ? $calyear : $calyear + 1).'" class="control" style="color:black;background:white;">Next Month &gt;&gt;</a>';

/* "previous month" control */
$previous_month_link = '<a href="?calmonth='.($calmonth != 1 ? $calmonth - 1 : 12).'&calyear='.($calmonth != 1 ? $calyear : $calyear - 1).'" class="control" style="color:black;background:white;">&lt;&lt;  Previous Month</a>';  

/* bringing the controls together */
$controls = '<form method="get">'.$select_month_control.$select_year_control.'&nbsp;<input type="submit" name="submit" value="Go" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$previous_month_link.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.$next_month_link.' </form>';

/* get all events for the given month */
global $wpdb;
$table_name = $wpdb->prefix . 'contract';
$table_name1 = $wpdb->prefix . 'wedding';
$calmonth = str_pad($calmonth,2,"0", STR_PAD_LEFT);
    $events = array();
$results = $wpdb->get_results( "SELECT c.cname AS title,c.id AS id,c.email as email, DATE_FORMAT(w.wdate,'%Y-%m-%d') AS event_date FROM $table_name c,$table_name1 w WHERE w.wdate LIKE '$calyear-$calmonth%' and w.id=c.wedding_id",ARRAY_A);
 foreach ( $results as $row ) {
 $events[$row['event_date']][] = $row;
}

HTML:

 <div id="primary" class=" col-xs-12 col-md-8" >
    <div id="calendar_div" style="padding:20px">
        <?php 
echo '<h2 style="float:left; padding-right:30px;color:black;background:white;">'.date('F',mktime(0,0,0,$calmonth,1,$calyear)).' '.$calyear.'</h2>';
echo '<div style="float:left;">'.$controls.'</div>';
echo '<div style="clear:both;"></div>';
echo draw_calendar($calmonth,$calyear,$events);

echo '<br /><br />';?>
    </div>
  </div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多