Bonjour tout le monde,

J'ai suivi le superbe tuto concernant la création d'un calendrier en PHP. Tout fonctionne à merveille.
Cependant, j'aimerais lui apporter une petite modification.

En effet, je compte utiliser ce calendrier comme système d'affichage pour indiquer les réservations concernant un bien immobilier.
Tout ça relié à un panel admin pour pouvoir Ajouter/Modifier/Supprimer une plage de réservation. BREF.

En fait, pour le moment, le calendrier affiche une puce lorsqu'il y a un événement sur le jour concerné et au survol de la case, on voit sur la droite le nom de l'événement etc..

Je voudrais, à la place d'afficher une puce, colorer la case s'il y a un événement.

Par exemple :

Si aucune réservation le 01/01/2014 => Coloration normal (Donc blanche)
Si réservation le 02/01/2014 => On colorie la case du calendrier en rouge (pas une simple puce rouge, mais vraiment la case complète)

Si quelqu'un à une piste ou une solution à me proposer, je suis preneur :)

Merci d'avance !

7 réponses


Pedon
Réponse acceptée

Bonjour,
Si tu as bien C/C le code du tutoriel, normalement tu auras un <td> et juste en dessous deux div, un qui a la class relative et l'autre day

<td <?php if(isset($events$time])): ?> class="evenement" <?php endif; ?>>
         <div class="relative">
            <div class="day"><?php echo $d; ?></div>

Là il vérifie si le timestamp de l'event a bien une valeur, si oui il lui attribue la class "evenement". (Je ne sais pas si c'est bien ça l'explication :p)

.evenement {background-color : red;}

La prochaine fois poste ton code, car beaucoup n'ont pas le code source^^.

Amneziik59
Auteur
Réponse acceptée

Problème résolu, j'ai juste ajouté deux lignes dans le CSS.

Je vais les mettre au cas où quelqu'un cherche à faire la même chose :

table td.evenement{ border:2px solid black; width:80px; height:80px; background: #FF1C11;}
table td.evenement .day{ color: white;}
table td.evenement .day:hover{ color: #8C8C8C;}

Voici donc les 3 lignes à mettre dans le CSS pour effectuer la modification du design lorsqu'un événement est trouvé.

Et voici le code HTML correspondant :

<td<?php if(isset($events$time])): ?> class="evenement"<?php endif; ?>>
    <div class="relative">
        <div class="day"><?php echo $d; ?></div>

Merci encore pour ton aide !

Oui bien sur !

Voilà le code concernant la partie jQuery du tuto :

jQuery(function($){
            var date = new Date();
            var current = date.getMonth()+1;
            $('.month').hide();
            $('#month'+current).show();
            $('.months a#linkMonth'+current).addClass('active');
            $('.months a').click(function(){
                var month = $(this).attr('id').replace('linkMonth','');
                if(month !== current){
                    $('#month'+current).slideUp();
                    $('#month'+month).slideDown();
                    $('.months a').removeClass('active'); 
                    $('.months a#linkMonth'+month).addClass('active'); 
                    current = month;
                }
                return false; 
            });
        });

Voici le code concernant la classe Date :

<?php
class Date{

    var $days = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche');
    var $months = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    function getEvents($year){
        global $DB;
        $req = $DB->query('SELECT id, dispo, statut,date FROM calendrier WHERE YEAR(date)='.$year.' AND dispo = 1');
        $r = array();
        while($d = $req->fetch(PDO::FETCH_OBJ)){
            $r[strtotime($d->date)]$d->id] = $d->statut;
        }
        return $r;
    }

    function getAll($year){
        $r = array();
        $date = new DateTime($year.'-01-01');
        while($date->format('Y') <= $year){
            //Ce que je veux => $r[ANNEE][MOIS][JOUR] = JOUR DE LA SEMAINE
            $y = $date->format('Y');
            $m = $date->format('n');
            $d = $date->format('j');
            $w = str_replace('0', '7', $date->format('w'));
            $r$y]$m]$d] = $w;
            $date->add(new DateInterval('P1D'));
        }
        return $r;
    }

}

Voici le code CSS :

/*[fmt]0020-000A-3*/
body{ background:#EEEEEE; letter-spacing:1px; font-family:Helvetica; padding:10px;}
.year{ color:#D90000; font-size:85px;}
.relative{ position:relative;}
.months{}
.month{ margin-top:12px;}
.months ul{ list-style:none; margin:0px; padding:0px;}
.months ul li a{ float:left; margin:-1px; padding:0px 15px 0px 0px; color:#888888; text-decoration:none; font-size:35px; font-weight:bold; text-transform:uppercase;}
.months ul li a:hover, .months ul li a.active{ color:#D90000;}
table{ border-collapse:collapse;}
table td{ border:1px solid #A3A3A3; width:80px; height:80px;}
table td.today{ border:2px solid #2349DB; width:80px; height:80px;}
table td.padding{ border:none;}
table td:hover{ background:#DFDFDF; cursor:pointer;}
table th{ font-weight:normal; color:#A8A8A8;}
table td .day{ position:absolute; color:#8C8C8C; bottom:-40px; right:5px; font-weight:bold; font-size:24pt;}
table td .events{ position:relative; width:79px; height:0px; margin:-39px 0px 0px; padding:0px;}
table td .events li{ width:10px; height:10px; float:left; background:#2349DB; /*+border-radius:10px;*/ -moz-border-radius:10px; -webkit-border-radius:10px; -khtml-border-radius:10px; border-radius:10px 10px 10px 10px; margin-left:6px; overflow:hidden; text-indent:-3000px;}
table td:hover .events{ position:absolute; left:582px; top:66px; width:442px; list-style:none; margin:0px; padding:11px 0px 0px;}
table td:hover .events li{ height:40px; line-height:40px; font-weight:bold; border-bottom:1px solid #D6D6D6; padding-left:41px; text-indent:0; background:none; width:500px;}
table td:hover .events li:first-child{ border-top:1px solid #D6D6D6;}
table td .daytitle{ display:none;}
table td:hover .daytitle{ position:absolute; left:582px; top:21px; width:442px; list-style:none; margin:0px 0px 0px 16px; padding:0px; color:#D90000; font-size:30px; display:block; font-weight:bold;}
.clear{ clear:both;}

Et enfin, voici le code concernant la partie "html" si je puis dire :

<?php
            require('../includes/config2.php');
            require('../includes/date2.php');
            $date = new Date();
            $year = date('Y');
            $events = $date->getEvents($year);
            $dates = $date->getAll($year);   
        ?>
        <div class="periods">
            <!-- ######################### BLOC ANNÉE ############################ -->
            <div class="year"><?php echo $year; ?></div>
            <!-- ######################### FIN BLOC ANNÉE ######################## -->

            <!-- ######################### BLOC MOIS ############################# -->
            <div class="months">
                <ul>
                    <?php foreach($date->months as $id=>$m): ?>
                    <li><a href="" id="linkMonth<?php echo $id+1; ?>"><?php echo utf8_encode(substr(utf8_decode($m),0,3)); ?></a></li>
                    <?php endforeach; ?>
                </ul>
            </div>
            <!-- ######################### FIN BLOC MOIS ######################### -->

            <div class="clear"></div>
            <?php $dates = current($dates); ?>
            <?php foreach ($dates as $m=>$days): ?>

                <!-- ######################### BLOC TABLEAU ####################### -->
                <div class="month relative" id="month<?php echo $m; ?>">
                <table>
                    <thead>
                        <tr>
                            <?php foreach ($date->days as $d): ?>
                                <th><?php echo substr($d,0,3); ?></th>
                            <?php endforeach; ?>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                        <?php $end = end($days); foreach($days as $d=>$w): ?>
                        <?php $time = strtotime("$year-$m-$d"); ?>
                            <?php if($d == 1 AND $w-1 > 0): ?>
                                <td colspan="<?php echo $w-1; ?>" class="padding"></td>
                            <?php endif; ?>
                            <td<?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                                <div class="relative">
                                    <div class="day"><?php echo $d; ?></div>
                                </div>
                                <div class="daytitle">
                                    <?php echo $date->days$w-1]; ?> <?php echo $d; ?> <?php echo $date->months$m-1]; ?>
                                </div>
                                <ul class="events">
                                    <?php if(isset($events$time])): foreach($events$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                    <?php endforeach; endif; ?>
                                </ul>
                            </td>
                        <?php if($w == 7): ?>
                            </tr><tr>
                        <?php endif; ?>
                        <?php endforeach; ?>
                        <?php if($end != 7): ?>
                            <td colspan="<?php echo 7-$end; ?>" class="padding"></td>            
                        <?php endif; ?>
                        </tr>
                    </tbody>
                </table>
                </div>
            <?php endforeach; ?>
        </div>
        <div class="clear"></div>

Bonjour Pedon,

Merci pour ta réponse.

Si je ne me trompe pas de ligne,
En suivant le tuto, j'ai déjà ça :

<td<?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>

Bien que le fait d'encadrer la date du jour n'est pas si importante en soi, est-il possible de combiner les deux conditions ?

Avec un elsif, mais seul la première class attribué sera gardé je crois.

Re-Bonjour,

Ta condition fonctionne bien, les cases où il y a un événements sont bien colorées, en revanche, un petit détail me chagrine.

Le background est bien appliqué mais la couleur du jour (29 par exemple) reste couleur grisatre.. c'est assez gênant :s

Bonjour,
Si tu parles bien sûr du chiffre de l'event, si tu veux changer sa couleur c'est

<div class="day"><?php echo $d; ?></div>

à la ligne 50 a toi de mettre une condition pour lui attribuer une class que tu modifieras dans le CSS.