php 日历重复_PHP日历,包含来自MySQL数据库的重复事件

如果有人想做类似的事情,我会发布我在过去五个小时内编写和测试的代码.

我决定将我的两个表转换为三个,将所有重复选项移动到第三个表:

‘churchcal_events’ – 我还没有包含此事件信息的其他字段

+----+-----------+------------+------------+------------+-----------+

| id | name | date | starttime | endtime | recurring |

+----+-----------+------------+------------+------------+-----------+

| 1 | Event 1 | 2013-04-01 | 10:30:00 | 12:00:00 | 0 |

| 2 | Event 2 | | 14:00:00 | 15:00:00 | 1 |

| 3 | Event 3 | | 09:00:00 | | 1 |

| 4 | Event 4 | | 19:00:00 | 21:00:00 | 1 |

+----+-----------+------------+------------+------------+-----------+

‘churchcal_assign’ – 将事件路由到适当的日历(因为整个网站的不同部门都会有日历)

+----------+-------------+

| event_id | calendar_id |

+----------+-------------+

| 1 | 1 |

| 2 | 1 |

| 3 | 1 |

| 4 | 1 |

+----------+-------------+

‘churchcal_recur_events’ – 以下是每个事件重复发生的规则

+----------+-----------+------------+----------------+------------+-------------+-----------+

| event_id | frequency | recur_type | recur_day_num | recur_day | recur_start | recur_end |

+----------+-----------+------------+----------------+------------+-------------+-----------+

| 2 | 1 | Week | NULL | Sunday | NULL | NULL |

| 3 | 2 | Week | NULL | Wednesday | 2013-04-01 | NULL |

| 4 | 2 | Month | third | Friday | 2013-04-01 | NULL |

+----------+-----------+------------+----------------+------------+-------------+-----------+

新代码(PHP) – 这是一天的循环

//query all events

$get_events = db_query("SELECT * FROM {churchcal_events ce, churchcal_recur_events cre}

WHERE (MONTH(ce.date) = :month AND YEAR(ce.date) = :year AND DAY(ce.date) = :day) OR

(ce.id = cre.event_id AND ce.recurring = :recur AND cre.recur_day = :calendar_day)

ORDER BY starttime",

array(

':month' => $month,

':year' => $year,

':day' => $list_day,

':recur' => '1',

':calendar_day' => date('l', strtotime($month . '/' . $list_day . '/' . $year)),

));

foreach($get_events as $event) {

//see if events belong to this calendar

$calendar_assign = db_query("SELECT * FROM {churchcal_assign} WHERE event_id = :event_id AND calendar_id = :cal_id",

array(

':event_id' => $event->id,

':cal_id' => $cal_id,

));

if($calendar_assign->rowCount() > 0) {

//one-time events

if(($event->recurring != '1') && ($single_event_id != $event->id)) {

$calendar .= calendar_event($event->id, $event->name, $event->starttime);

$single_event_id = $event->id;

//$calendar .= $single_event_id;

}

//monthly recurring events

if(($event->recur_type == 'Month') && ($event->recurring == '1')

//day is on or before end date

&& (($event->recur_end >= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_end == '0000-00-00') || ($event->recur_end == NULL))

//day is on or after start date

&& (($event->recur_start <= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_start == '0000-00-00') || ($event->recur_start == NULL))

//day is equal to date of recurrence, i.e. first friday, third monday, etc

&& ($year . date('m', strtotime($year . '/' . $month . '/' . $list_day)) . $list_day == date('Ymj', strtotime($event->recur_day_num . ' ' . $event->recur_day . ' of ' . date('F', strtotime($month . '/' . $list_day . '/' . $year)) . ' ' . $year)))

//day is in agreement with month frequency, i.e. every month, every other, etc. from start date

&& ($month % $event->frequency == date('m', strtotime($event->recur_start)) % $event->frequency)) {

$calendar .= calendar_event($event->id, $event->name, $event->starttime);

}

//weekly recurring events

if(($event->recur_type == 'Week') && ($event->recurring == '1')

//day is on or before end date

&& (($event->recur_end >= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_end == '0000-00-00') || ($event->recur_end == NULL))

//day is on or after start date

&& (($event->recur_start <= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_start == '0000-00-00') || ($event->recur_start == NULL))

//day is in agreement with week frequency, i.e. every week, every other, etc. from start date

&& (date('W', strtotime($month . '/' . $list_day . '/' . $year)) % $event->frequency == date('W', strtotime($event->recur_start)) % $event->frequency)) {

$calendar .= calendar_event($event->id, $event->name, $event->starttime);

}

}

}

如果您不是像我一样在Drupal模块中创建它,您可以将’db_query()’替换为您自己的数据库查询函数,如PHP的默认’mysql_query()’;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值