Bonjour à tous,
Je sais que sur ce superbe site il y a un tuto sur un calendier mais j'ai quand meme tenu à faire le mien par l'intermediaire de 2 classes php que voici .Le but faire un calendier qui affiche le debut et la fin du mois precedent..puis le stocke dans un tableau php.
Le hic c'est quand je le reaffiche par une boucle dans une table html
Si le premier jour est un dimanche j'ai une erreur "undefine offset".
SI quelqu'un a une idee .....Merci d'avance à tous

<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 * Description of tabcalendV3
 *
 * @author jean-michel
 */
  require_once 'autoload.php';
class TabcalendV4 {
    public $jour;
    public $mois;
    public $annee;
    public $tab=array();

    public function __construct($jour,$mois,$annee){
        $this->jour=$jour;
        $this->mois=$mois;
        $this->annee=$annee;

          $tabcalend_retour=array();
          $tabnumjourdelasemaine = array("0","1","2","3","4","5","6");//tab des num des jous de la semaine
       $mois_precedent = JoursMois::moisPrecedent($mois);//num du mois precedent
       $nbre_jour_moisprecedent= JoursMois::joursnbrmoisprec($mois_precedent,$annee);//nbre de jour du mois precedent
       $mois_suivant = JoursMois::moisSuivant($mois);//mois suivant
       $tab_tab_annee = JoursMois::verifAnnee($mois_precedent, $mois_suivant, $mois, $annee);//verif annee sous forme de tableaux resultat
       $nbre_jour_dans_lemois=JoursMois::joursnbrmois($mois,$annee);
       $num_jour_semaine=(int)date("w",mktime(0,0,0,$mois,$jour,$annee));
      $jour_mois_passe=($nbre_jour_moisprecedent-($num_jour_semaine-1));//pour les jours du mois passee
      $jour_mois_suivant=1;
       for($i=0;$i<43;$i++){
           if ($i<$num_jour_semaine) {
           $tabcalend_retour$i]=date("d-m-y",mktime(0,0,0,$mois_precedent,$jour_mois_passe,$tab_tab_annee[0]));
           $jour_mois_passe++;
       }
        else if( $jour==1){
               $i=$num_jour_semaine;
               $tabcalend_retour$i]=date("d-m-y",mktime(0,0,0,$mois,$jour,$annee));
               $jour++;
           }
       else if($jour<=$nbre_jour_dans_lemois && $jour>=2){
               $tabcalend_retour$i]=date("d-m-y",mktime(0,0,0,$mois,$jour,$annee));
               $jour++;
           }
       else if($i>$nbre_jour_dans_lemois){
           $tabcalend_retour$i]=date("d-m-y", mktime(0,0,0,$mois_suivant,$jour_mois_suivant,$tab_tab_annee[1]));
           $jour_mois_suivant++;
       }
       }//fin du for
         $this->tab=$tabcalend_retour;
    }//fin construc
    public function getJour() {
        return $this->jour;
    }
    public function setJour($jour) {
        $this->jour = $jour;
    }
    public function getMois() {
        return $this->mois;
    }
    public function setMois($mois) {
        $this->mois = $mois;
    }
    public function getAnnee() {
        return $this->annee;
    }
    public function setAnnee($annee) {
        $this->annee = $annee;
    }
    public function getTab() {
        return $this->tab;
    }
    public function setTab($tab) {
        $this->tab = $tab;
    }

}//fin de la classe
$objet= new TabcalendV4(1,5,2011);
echo "<pre>";
print_r($objet);
echo "</pre>";
$tableau=$objet->getTab();
function extraireJour($string_date){
         $array = explode("-",$string_date);
         return $array[0];
}
echo "<table style='border:1px solid green;border-collapse:collapse;width:500px;text-align:center'>";
echo "<caption>".JoursMois::retourne_mois_francais($objet->getMois())."::".$objet->getAnnee()."</caption>";
echo "<tr><th>di</th><th>lu</th><th>mar</th><th>mer</th><th>jeu</th><th>ven</th><th>sam</th></tr>";
$y=0;
$itera=0;
do{
        echo"\n<tr>";
     for($j=0;$j<7;$j++){
         echo "\n<td style='border:1px solid green;'>".extraireJour($tableau$y])."</td>\n";
         $y++;
     }
        echo "</tr>\n";
        $itera++;
 }while($itera<6);
 echo "<br />";
 echo "</table>";
$nbre_jour_dans_lemois
?>

2emme classe

<?php
    class JoursMois{

             static function joursnbrmois($mois,$an){
                                $nbrejoursmois = 0;
                               if($mois==2){ 
                                               $annee = $an;

                                                          if($annee%4 == 0){$nbrejoursmois = 29;}
                                                       else{$nbrejoursmois = 28;};

                                            }
                    else{         

                  $nbre_jours_mois=array('1'=>'31','3'=>'31','4'=>'30','5'=>'31','6'=>'30','7'=>'31','8'=>'31','9'=>'30','10'=>'31','11'=>'30','12'=>'31');
                  $nbrejoursmois = $nbre_jours_mois$mois];
                        }

                         return $nbrejoursmois;
        } 

                 static function joursnbrmoisprec($mois,$an){
                                $nbrejoursmois = 0;

                               if($mois==2){ 
                                               $annee = $an;

                                                          if($annee%4 == 0){$nbrejoursmois = 29;}
                                                       else{$nbrejoursmois = 28;}

                                            }

                    else{         

                  $nbre_jours_mois=array('1'=>'31','3'=>'31','4'=>'30','5'=>'31','6'=>'30','7'=>'31','8'=>'31','9'=>'30','10'=>'31','11'=>'30','12'=>'31');
                  $nbrejoursmois = $nbre_jours_mois$mois];
                        }

                         return $nbrejoursmois;
        } 
               /*/ static function moisSuivant($mois,$annee){

                                  $resultat=array(); 
                                  $mois_suiv;
                                  $annee_suiv;
                                   if($mois==12){ $mois_suiv=1;$annee_suiv= $annee+1; }
                                else{
                                    $mois_suiv= $mois+1;
                                    $annee_suiv= $annee+1;
                                    }
                             $resultat[0]=$mois_suiv;
                             $resultat[1]=$annee_suiv;

                         return $resultat;
                 }*/
             static function moisSuivant($mois){
                 $retour;
                 if($mois==12){
                     $retour=1;
                 }else{
                     $retour=$mois+1;
                 }
                 return $retour;
             }
             static function moisPrecedent($mois){

                      $retour;

                     if($mois==1){
                         $retour=12;

                     }else{
                         $retour=$mois-1;
                     }

                     return $retour;

             } //fin de la methode

          static function verifAnnee($moisprecedent,$moissuivant,$moiscourant,$annee){
                       $tab_annee;
              if($moisprecedent==12 && $moissuivant==2 || $moissuivant==02 && $moiscourant==1 || $moiscourant==01){
                       $tab_annee[0]=($annee -1);
                       $tab_annee[1]=$annee;
              }else{
                  $tab_annee[0]=$annee;
                  $tab_annee[1]=$annee;
              }
              return $tab_annee;
          }//fin de la methode
    static function retourne_mois_francais($num){
            $retour;
        $mois_annee = array("1"=>"Janvier","2"=>"Février","3"=> "Mars","4"=>"Avril","5"=>"Mai","6"=>"Juin","7"=>"Juillet",
            "8"=>"Août","9"=>"Septembre","10"=>"Octobre","11"=>"Novembre","12"=>"Décembre");
        $retour=$mois_annee$num];
        return $retour;
    }
    }//fin de la classe

     // print_r (JoursMois::verifAnnee(11,2,1,2011));
?>

Merci à tous ceux qui auront la gentillesse de me repondre

7 réponses


moustachu31
Auteur
Réponse acceptée

Un grand merci.....................

Trop de code :(
Tu as regarder le tutoriel sur le calendrier ? http://www.grafikart.fr/tutoriels/php/calendrier-php-157

J'ai créé un fichier JoursMois.php dans lequel j'ai copié ton code, de même pour la classe TabcalendV4, excepté que j'ai remplacé ton require_once 'autoload.php'; par

function __autoload($class_name) {
    include $class_name . '.php';
}

Je n'ai aucune erreur qui apparait. J'ai essayé avec le 1er août 2010 (également un dimanche) et pas de problème d'offset.
Je ne vois pas vraiment d'où cela peut venir, sachant que je n'ai presque rien modifié, et que j'ai juste copié/collé ton code, sans même modifier l'indentation... J'ai essayé sous PHP 5.3.6 et 5.2.17, pas d'erreurs :(

Merci d'avoir pris le temps de regarder.... avec un autre serveur je n'ai pas le nom de l'erreur:undefined offset:31.
Mais j'ai toujours après le 31 une case vide dans ma table html...............
Normalement je parcours le tableau php avec 2 boucles pour afficher la table html,donc je ne vois pas pourquoi il me poserais un probleme si le premier jour de la semaine est un dimanche................
Si quelq'un veut bien m'aider dans ma réflexion...car moi je ne comprends pas ou est le probleme
Comme l'a fait Thomasweber que je remercie d'avoir regardé mon code,Pour charger la 2 classe il suffit d'enlever le require-once de TabcalendV4 et de le remplacer par

function __autoload($class_name) {
                                                               include $class_name . '.php';
                                                                        }

Merci à toutes les ames charitables d'avance.....

Tout d'abord, tu m'excuseras mais j'avais bien le problème d'offset, mais j'avais temporairement masquer l'affichage de mes erreurs pour les mettre en log. Et je viens de voir l'erreur en réactivant l'affichage, erreur qui se confirme en regardant mes logs.
Cette erreur découle du problème de la case vide après le 31.
Pour t'aider dans ta réflexion, je te conseille de regarder de plus près les conditions présentes dans ta boucle

for($i=0;$i<43;$i++){

N'hésite pas également à afficher les variables $jour et $i dans chaque condition pour voir comment évoluent leurs valeurs.

Un immense merci à ThomasWeber qui a eu la gentillesse de se pencher sur le problème...
Merci beaucoup
Pour le resoudre j'ai changé le contenu de certaines variables dans ma boucle comme me l'a suggéré ThomasWeber
Au fait une question à thomasweber comme fit on pour rediriger les erreurs vers les logs php.ini???
ou try{}catch{}

Ravi d'avoir pu t'aider. Pour la gestion des erreurs, tu peux utiliser try{}catch{} et ton propre système de fichier pour personnaliser tes logs. Sinon, dans le php.ini, recherche la partie consacrée aux erreurs (Error handling and logging) puis décommente (en enlevant l'éventuel ; présent en début de ligne) et indique On à la configuration log_errors. Tu trouveras au même endroit l'ensemble des réglages possibles pour les erreurs. N'hésite pas à jeter un oeil et à tester... Il te faudra redémarrer le serveur pour que les modifications apportées au php.ini prennent effet.
Si tout est ok pour toi, n'oublie pas de valider une des réponses pour que le sujet soit noté comme résolu :)