Bonsoir,
Je suis débutante en php et j'ai essayé d'intégrer le calendrier php de grafikart
L'idée est de remplir le calendrier de sorte que je puisse afficher les évènements pour lesquels les dates sont déjà occupées par des sessions de formation
J'ai pas pu comprendre la raison pour laquelle les dates déjà occupées les évènements ne s'affichent pas !
Veuillez me donner un coup de main car je cherche ça fait 3 jours en vain et merci de votre aide
je vous laisse avec le code:
Je commence par le code de la classe d'ou je remplis le calendrier:

<?php

require_once('database.php');
require('Session.php');//la classe ou existe les getters et setters  

class Sessions {
var $link ;
var $days = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche');
var $months = array('Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Decembre');
public function __construct ()
{
$this->link= open_connection('localhost','root','root') or die (mysql_error());
}
//fonction pour recupere les evenements pour notre calendrier dynamique
function getEvents($year){
//cette requete m'affiche les dates qui coincide avec des evenements , ma table sessions contient les dates deb et fin des sessions et avec //lesquelles je compare la date $year donnée en paramètre
$result =query_database("SELECT dated,datef, idformation, idstatutformation FROM sessions WHERE dated IN(SELECT dated
from sessions where idstatutformation<> 4 AND dated='$year' ) OR datef IN(SELECT datef from sessions where idstatutformation<> 4 AND datef='$year') "
 ,"DBformations",$this->link)or die(mysql_error());

$r = array();
while($d = fetch_results($result)){
             $r[strtotime($d->dated)][strtotime($d->datef)]$d->idstatutformation] = $d->idformation;
        }
        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;
    }
}
?>

le code de la page php ou j'affiche le calendrier : "calendrier.php "

<?php

            $date = new Sessions();
            $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; ?>

Pourriez-vous m'aider s'il vous plaît j'ai vraiment besoin de l'aide
et merci d'avance.

10 réponses


jo-jo-123
Réponse acceptée

Mais $year comme son nom l'indique c'est l'année donc ça peut pas être une date (sous la forme Jour / Mois / Année)

$year = date('Y');

retourne 2014

Tu peux déjà faire un print_r($events) pour voir s'il n'y a pas de problème dans ta classe.

Ton code de calendrier.php est assez long. Pourrais tu nous dire quelle partie ne marche pas comme tu le souhaites ?

wisline
Auteur

Merci jo-jo-123 pour consacrer votre temps afin de donner de l'aide
effectivement j'ai fait un <li><?php print_r($events);?></li> dans la partie ou je souhaite afficher des évènements la page m'a affiché:
Array()
Apparement je dois modifier ma requête car elle ne recupere rien ??

Pour la page calendrier.php , la partie qui ne marche pas c'est la partie :

<ul class="events">
       <?php if(isset($events$time])): foreach($events$time] as $e): ?>
       <li><?php echo $e; ?></li>
       <?php endforeach; endif; ?>
       </ul>

Je ne trouve pas la liste <li></li> des événements stockés sur ma BDD qui coincident avec une date quelconque du calendrier
qu'est-ce que vous me suggérez comme piste de travail ?
je suis fichu je bloque la dessus ...

Si tu as des événements enregistré dans la base de données, ta requête n'est pas correcte car le print_r devrait retourner quelque chose !

Ta requêtes SQL dois juste récupérer toutes les sessions de l'année avec idstatutformation n'est pas égale à 4 ?

wisline
Auteur

Je souhaite récupérer les événements de ma table sessions ou la date $year entrée en paramètre de la fonction getEvents($year) soit comprise entre la date début et la date de fin afin d'afficher le (ou les)evenement(s) entre les <li></li> c'est à dire si cette date est déjà occupée par un évènement , pour les idstatutformation <> 4 je veux récupérer les formations non annulées (achevées , en cours , .. etc)l'essentielle que la session ne doit pas etres annulee c-à-d <> 4
D'après ce que j'ai compris "if(isset($events$time]))" c'est la condition pour voir s'il existent des dates égales à $year dans la table si oui les <li></li> se remplissent du résultat de $events
Je pense que le fonctionnement est logique mais comment y procéder
merci de m'éclaircir les choses :)

D'après ce que j'ai compris "if(isset($events$time]))" c'est la condition pour voir s'il existent des dates égales à $year dans la table si oui les <li></li> se remplissent du résultat de $events

Oui c'est ca :)

... entre la date début et la date de fin ...

Elles sont inscrites ou ces dates ? dans la même table que les événements ?

wisline
Auteur

oui ma table session est de la forme
idsession (Primary Key)
idstatutformation (Foreign key ) de la table statutformations qui contient les statuts (achevee, annulee, en cours , ...)
dated (date début session)
datef (date fin session)
donc $year c'est la date de chaque jour , donc pour chaque jour je vérifie si sa date est déjà occupée par mes sessions dans la table session ou non
donc quand j'ajoute if(isset($events$time] je n'obtient rien dans les <li></li> " les evenements "
je ne sais pas si cette condition et la condition opportune pour mon cas ou que je dois en faire une autre ??
qu'est-ce que vous pensez ?

wisline
Auteur

mais ouiiii vous avez raison
alors comment peut-on faire pour récupérer la date entière ?
j'ai fais des essais sans résultat favorable !

wisline
Auteur

Merci beaucoup pour la remarque le problème est résolu voici le nouveau code :
la classe session:

<?php

require_once('database.php');
require('Session.php'); 
require_once('Participants.php');
require_once('Formations.php');

class Sessions {
var $link ;
var $days = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche');
var $months = array('Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Decembre');
public function __construct ()
{
$this->link= open_connection('localhost','root','root') or die ("Probleme de connexion !");
}
function getEvents($year){
 $result =query_database("SELECT * FROM sessions WHERE idstatutformation <> 4 AND '$year' BETWEEN dated AND datef","gformation",$this->link)or die(mysql_error());

$r = array();
while($d = fetch_results($result))
{
$sess = new Session();
$sess->setIdFormation($d'idformation']); 
$sess->setDated($d'dated']); 
$sess->setDatef($d'datef']); 
$r] = $sess;
}
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;
    }
?>

le code correct de la partie qui ne marchait pas des evenements:

<?php 
$an = "$year-$m-$d";
$events = $date->getEvents($an); ?>
<?php 
for($i=0;$i<count($events);$i++){
?>
<li>
<?php echo $events$i]->getIdFormation();?>
</li>
<?php } ?>

Voilà c'est résolu merci beaucoup jo-jo-123 :)

de rien :)