PHP calendrier avec les événements récurrents à partir de bases de données MySQL
Mise à JOUR:
Ci-dessous est ma question d'origine. Voir ma réponse pour voir comment je l'ai résolu.
Je suis en train de remplir mon agenda avec les événements de base de données MySQL table 'churchcal_events'. Je pourrais avoir l'un des événements en temps pour les dates et les événements récurrents qui peuvent être définies pour Chaque lundi, Chaque jeudi, ou Tous les Mois sur un vendredi.
Des événements ponctuels sont pas un problème. Et événements hebdomadaires de travail (chaque semaine, tous les autres). Mais un chaque mois de l'événement montre que sur le premier mois, pas sur le mois suivant.
churchcal_events table - à l'exclusion des domaines qui ne sont pas importantes à cette question
+----+----------------+------------+-----------+------------+------------+
| id | name | recurring | frequency | recur_type | recur_day |
+----+----------------+------------+-----------+------------+------------+
| 1 | Test Weekly | 1 | 1 | W | Sunday |
| 2 | Test Bi-Weekly | 1 | 2 | W | Monday |
| 3 | Test Monthly | 1 | 1 | M | Friday |
+----+----------------+------------+-----------+------------+------------+
code php - à l'intérieur d'une boucle pour chaque jour du mois
//query all events
$get_events = db_query("SELECT * FROM {churchcal_events}
WHERE (MONTH(date) = :month AND YEAR(date) = :year AND DAY(date) = :day) OR
(recurring = :recur AND recur_day LIKE :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) {
//if recurring, see if event should be on this day
if($event->recurring == '1') {
$recur_day = $event->recur_day;
$recur_freq = $event->frequency;
$recur_type = $event->recur_type;
$recur_start = new DateTime(date('Y-m-d', strtotime($event->recur_start)));
$recur_end = new DateTime(date('Y-m-d', strtotime($event->recur_end)));
$recur_start->modify($recur_day);
$recur_interval = new DateInterval("P{$recur_freq}{$recur_type}");
$recur_period = new DatePeriod($recur_start, $recur_interval, $recur_end);
foreach($recur_period as $recur_date) {
if($recur_date->format('Ymd') == date('Ymd', strtotime($month . '/' . $list_day . '/' . $year))) {
$calendar .= calendar_event($event-id, $event->name, $event->starttime);
}
}
}
Comment puis-je faire ID '3' à partir de l'exemple churchcal_events tableau montrent le premier vendredi de chaque mois?
c'est le Drupal 7 db_query() de la fonction.
Avez-vous vérifié vos valeurs pour les variables comme recur_period? Aussi à Partir de PHP doc: Dates dans le m/d/y ou d-mes formats sont analysées en regardant le séparateur entre les différents composants: si le séparateur est un slash (/), puis l'Américain m/d/y est supposé; que, si le séparateur est un tiret (-) ou un point (.), puis Européennes d-mon format est pris en charge. Pour éviter l'ambiguïté, il est préférable d'utiliser le format ISO 8601 (AAAA-MM-JJ) date ou DateTime::createFromFormat() lorsque cela est possible.
Aussi, je voudrais vérifier la date et l'heure sur le serveur qui exécute PHP. Parfois, vous pouvez obtenir des résultats inattendus lorsque le serveur de temps est différent de ce que vous pensez que c'est...
Les dates sont correctes comme ça.
OriginalL'auteur nitsuj | 2013-04-01
Vous devez vous connecter pour publier un commentaire.
Au cas où quelqu'un voudrait faire quelque chose de similaire, je vais poster le code que j'ai écrit et testé dans les cinq dernières heures.
J'ai décidé de convertir mes deux tables en trois, le déplacement périodique des options pour la troisième tableau:
'churchcal_events' - il y a des champs supplémentaires pour les informations sur l'évènement que je n'ai pas inclus
'churchcal_assign' - itinéraires les événements appropriés calendriers (parce qu'il y aura des calendriers pour les différents services à travers le site web)
'churchcal_recur_events' - Voici les règles pour chaque événement de récurrence
Nouveau Code (PHP) - C'est dans un jour de boucle
Si vous n'êtes pas de la création de cette dans un module Drupal comme je suis, vous pouvez remplacer 'db_query()' avec votre propre base de données de fonction de requête comme par défaut de PHP 'mysql_query()';
OriginalL'auteur nitsuj