Tutoriel calendrier: soucis d'affichage des events

Par ARAGORN, il y a 11 ans


Bonsoir le forum,

Voilà, je viens de suivre le tutoriel pour faire le calendrier ( ici).
J'en suis arrivée à la 41 ème minute environ et je rencontre des difficultés:

Lorsque j'ai un event, je clique sur le mois mais il n'y a pas la balise <li> qui s'affiche le jour où est enregistré l'event.

J'ai juste modifié dans phpmyadmin, le type du champ date en le passant en DATETIME. Es-ce que cela change quelque chose ou pas ?

Voici le code que j'obtiens:

<?php $end = end ($jours) ;
                                  foreach ($jours as $d=>$w){
                                      $time = strtotime($année-$m-$d);?>

                            <?php if ($d ==1 && $w != 1){ ?>
                            <td colspan="<?php echo $w-1; ?>"></td>
                            <?php } ?>
                                <td>
                                    <div class="day"><?php echo $d; ?></div>

                                    <ul class="events">
                                        <?php

                                        if (isset($event$time])){
                                             ?>
                                                <li><?php echo $e; ?></li> 
                                           <?php 
                                        } ?>
                                    </ul>
                                </td>

J'ai remplacé la variable $year par $année, ce sont les seuls modifications que j'ai effectué et je ne comprends pas :(
Pouvez- vous m'aider svp ? :)

25 réponses

ARAGORN, il y a 11 ans

Cela ne me retourne rien, j'ai donc fait un print_r de la variable $events$time] et j'obtiens cette erreur:

Undefined offset: 49979485 in C:\wamp\www\graph\vue\planning\index.php on line 75

Carouge10, il y a 11 ans

Bonjour,

Un conseil très important. "Il ne faut jamais mettre d'accent dans le nom d'une variable".

Xen0risDEV, il y a 11 ans

Bonjour

<?php $end = end($days); foreach($days as $d=>$w): ?>
                           <?php $time = strtotime("$year-$m-$d"); ?>
                           <?php if($d == 1 && $w != 1): ?>
                                <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>
ARAGORN, il y a 11 ans

Bonjour,

Même en enlevant l'accent à la variable, l'event ne s'affiche pas :(

Xen0risDEV, il y a 11 ans

Pourriez-vous me donnée le code complet de votre index.php que je jette un coup d'oeil ?

PS: Tentez le code index.php identique à celui du tutoriel, je me suis amusée à le faire dans la soiré :

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Calendrier</title>
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
        <script type="text/javascript">
            jQuery(function($){
               $('.month').hide();
               $('.month:first').show();
               $('.months a:first').addClass('active');
               var current = 1;
               $('.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; 
               });
            });
        </script>
    </head>
    <body>
        <?php
        require('config.php'); 
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $events = $date->getEvents($year);
        $dates = $date->getAll($year);
        ?>
        <div class="periods">
            <div class="year"><?php echo $year; ?></div>
            <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>
            <div class="clear"></div>
            <?php $dates = current($dates); ?>
            <?php foreach ($dates as $m=>$days): ?>
               <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 && $w != 1): ?>
                                <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>
        <pre><?php print_r($events); ?></pre>
    </body>
</html>
ARAGORN, il y a 11 ans

J'ai suivit aussi le code du tuto en l'adaptant dans la methode MVC:

Le controller:

include_once '/../../class/planning.php';
    include_once '/../../class/membre.php';

    $planning = new Planning();
    $annee = date('Y');
    $event = $planning->get_events($annee);
    $dates = $planning->getAll($annee);

    include_once '/../../vue/planning/index.php';

Et la vue:

<div class="periods">
    <div class="année">
        <?php echo $annee; ?>
    </div>
    <div class="months">
        <ul>
             <?php foreach ($planning->mois as $id=>$m){ ?>

                 <li><a href="#" id="lienMois<?php echo $id+1; ?>"><?php echo utf8_encode(substr(utf8_decode($m),0,3)); ?></a></li>
                 <?php }
             ?>
        </ul> 
    </div>

    <?php $dates = current($dates); 
            foreach ($dates as $m=>$jours){ ?>
            <div class="month" id="month<?php echo $m; ?>">
                <table>
                    <thead>
                        <tr>
                            <?php foreach ($planning->jours as $d){ ?>
                            <th>
                               <?php echo substr($d,0,3) ; ?>
                            </th>    
                           <?php } ?>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <?php $end = end ($jours) ;
                                  foreach ($jours as $d=>$w){
                                      $time = strtotime($annee-$m-$d);?>

                            <?php if ($d ==1 && $w != 1){ ?>
                            <td colspan="<?php echo $w-1; ?>"></td>
                            <?php } ?>
                                <td>
                                    <div class="day"><?php echo $d; ?></div>

                                    <ul class="events">
                                        <?php

                                        if (isset($event$time])){
                                            foreach ($event$time] as $e){
                                             ?>
                                                <li><?php echo $e; ?></li> 
                                           <?php 
                                        }
                                        }?>
                                    </ul>
                                </td> 

                                <?php 
                                if ($w == 7){ ?>
                        </tr>
                        <tr>
                                <?php }
                             } 
                             if ($end != 7){ ?>
                                 <td colspan="<?php echo 7-$end; ?>"></td>
                             <?php }
                             ?>
                        </tr>
                    </tbody>
                </table>
            </div>
            <?php }
    ?>
</div>
<?php 

echo $event$time];

Et la classe:

class Planning {

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

    public static function getAll ($annee){

        $r = array();

        $date = new DateTime($annee.'-01-01');

        while ($date->format('Y') <= $annee){

            $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;
    }

    public static function get_events($year){
        include_once 'sql.php';
        $query = $bdd->prepare('SELECT * FROM planning WHERE YEAR(date) = :annee');
        $query->execute(array(
            'annee' => $year,
        ));
        $event = array();

        while ($evenement = $query->fetch(PDO::FETCH_OBJ)){
            $event[strtotime($evenement->date)]$evenement->id] = $evenement->client;
        }

        return $event;
    }
}
Xen0risDEV, il y a 11 ans
$query->execute(array(
            'annee' => $year,
        ));

par

$query->execute(array('annee' => $year));
ARAGORN, il y a 11 ans

ça revient à la même chose, c'est juste que ma syntaxe est plus lisible ^^
et cela ne change rien :/

Xen0risDEV, il y a 11 ans

Ah mince alors... d'où cela peux t'il venir ^^, je vais chercher de fonte en combe le code et vous en redire des nouvel :)

<?php
public static function get_events($database, $year){
    $bdd = $database;
    $query = $bdd->prepare('SELECT * FROM planning WHERE YEAR(date) = :annee');
    $query->execute(array(
       'annee' => $year,
    ));

    $event = array();

    while ($evenement = $query->fetch(PDO::FETCH_OBJ)){
        $event[strtotime($evenement->date)]$evenement->id] = $evenement->client;
    }

    return $event;
}

Le controller :

include_once '/../../class/planning.php';
include_once '/../../class/membre.php';
//DATABASE
include_once '/../../class/db.php';
$planning = new Planning();
$annee = date('Y');
$event = $planning->get_events($db, $annee);
$dates = $planning->getAll($annee);

include_once '/../../vue/planning/index.php';
ARAGORN, il y a 11 ans

Cela ne va rien changer puisque les requêtes sortant de la base sont bonnes, lorsque je fait un print_r de la variable $event$time], ça me retourne une erreur que j'ai mise au dessus

Undefined offset: 49979485 in C:\wamp\www\graph\vue\planning\index.php on line 75

Pour moi la variable contient bien quelque chose, sinon il y aurait l'erreur undenefied variable $event$time] :(
Donc je comprends pas trop ^^

Xen0risDEV, il y a 11 ans

JE pense que ses la fonction date(); qui bug, car la je vous avoue ne pas comprendre non plus ^^

Xen0risDEV, il y a 11 ans

L'erreur proviens de toute évidence du DateTime();
Regarde ici, et de mon côté je vais tenter de vous recréer ceci en modèle MVC.

ARAGORN, il y a 11 ans

Bon j'ai fait un peu de debug,

La variable event est bien remplit dans mon controller mais pas event$time] enfin si vu qu'elle me retourne l'erreur que j'ai cité tout à l'heure, sauf que les chiffres qui surviennent après le numéro changent tout le temps. Cela correspond à quoi ? Au timestamp que l'on a crée ?

ARAGORN, il y a 11 ans

Bonsoir,

Je ne comprends pas trop comment manier votre template, pouvez-vous m'éclairer un peu, surtout sur la partie de quel fichiers je dois modifier ^^

Xen0risDEV, il y a 11 ans

Le fichier qui ce trouve dans core/config.php vous devez le modifier, dans le dossier template/layouts vous y trouver un fichier "default.php", ses la où vous changer le stylisme de votre propre calendrier :)

Je vais vous faire une petite vidéo d'explication ça serra plus compréhensible !

ARAGORN, il y a 11 ans

Dac merci beaucoup, puis je vous le piquer ? Comment je peux l'adapter en modèle MVC ?

Xen0risDEV, il y a 11 ans

Oui :)

ARAGORN, il y a 11 ans

Merci beaucoup :)
Pour l'adapter en mode MVC, je peux faire comment ?

Xen0risDEV, il y a 11 ans

Actuellement il utilise un système de template, donc vous pouvez si vous le souhaitez en faire un système de multipage :
index.php :

if(isset($_GET'page'] && preg_match('/^[a-z0-9]+$/i', $_GET'page'])) {
    $page_name = strtolower($_GET'page']);
    if(file_exists('template/pages'.$page_name.'.php')) {
        $tpl->output($page_name);
    } else {
       $tpl->output('404');
    }
} else {
    $tpl->output('index');
}
Xen0risDEV, il y a 11 ans

Voila la Vidéo

ARAGORN, il y a 11 ans

Bonjour,

Je réponds un peu tardivement mais franchement je vous remercie beaucoup pour votre aide, la vidéo m'a permit d'un peu mieu comprendre et je suis arrivé à mes fin sur ce calendrier après pas mal m'être tiré les cheveux ^^

merci pour le temps que vous m'avez accorder pour résoudre mon soucis en tout cas :)

Bonne continuation ;)

Xen0risDEV, il y a 11 ans

S'été avec plaisir :)

Bonne continuation à vous.

Cordialement Jessy L.

elodie876, il y a 11 ans

Bonjour, le lien de ForZ3ro ne fonctionne plus pour voir la video.

Xen0risDEV, il y a 11 ans

Bonjour Elodie, effectivement gros soucis.. Je vais voir ce que je peux faire.

Cordialement.