Page 1 sur 1

un peu d'aide sur un calendrier

Posté : 19 nov. 2008, 11:48
par jobart
Bonjour à tous
j'ai récupéré le calendrier de Anne Pacalet

je voudrai comprendre comment passer les semaines du samedi au samedi
si qqun pourrait m'expliquer :oops:
<?php
function Calendrier($month,$year,$links) {

  $MonthNames = array(1 => "Janvier","Fevrier","Mars","Avril","Mai","Juin",
               "Juillet","Aout","Septembre","Octobre","Novembre","Decembre");
  $monthname = $MonthNames[$month+0];

  // on ouvre la table
  echo '<table class="cal" cellspacing="1">';

  // Première ligne = mois et année ou link[0]
  $title = array_key_exists(0, $links) ? $links[0] : $monthname.' '.$year;
  echo '<tr><td colspan="7" class="cal_titre">'.$title.'</td>'."</tr>\n";

  // Seconde lignes = initiales des jours de la semaine
  $DayNames = array("L","M","M","J","V","S","D");
  echo '<tr>'; foreach ($DayNames as $d) echo '<th>'.$d.'</th>'; echo "</tr>\n";

  // On regarde si aujourd'hui est dans ce mois pour mettre un style particulier
  if ($year == date('Y') && $month == date('m'))
    $today = date('d');
  else
    $today = 0;

  $time = mktime(0,0,0,$month,1,$year); // timestamp du 1er du mois demandé
  $days_in_month = date('t',$time);     // nombre de jours dans le mois
  $firstday = date('w',$time);          // jour de la semaine du 1er du mois
  if ($firstday == 0) $firstday = 7;    // attention, en php, dimanche = 0

  $daycode = 1; // ($daycode % 7) va nous indiquer le jour de la semaine.
                // on commence par le lundi, c'est-à-dire 1.

  // on ouvre une première ligne pour le calendrier proprement dit :
  echo '<tr>';

  // on met des cases blanches jusqu'à la veille du 1er du mois :
  for ( ; $daycode<$firstday; $daycode++) echo '<td>&nbsp;</td>';

  // boucle sur tous les jours du mois :
  for ($numday = 1; $numday <= $days_in_month; $numday++, $daycode++) {
    // si on en est au lundi (sauf le 1er), 
    // on ferme la ligne précédente et on en ouvre une nouvelle 
    if ($daycode%7 == 1 && $numday != 1) echo "</tr>\n".'<tr>';
    // on ouvre la case (avec un style particulier s'il s'agit d'aujourd'hui)
    echo ($numday == $today ? '<td class="today">' : '<td>');
    // on affiche le numéro du jour ou le contenu donné par l'utilisateur
    echo (array_key_exists($numday, $links) ? $links[$numday] : $numday);
    // on ferme la case
    echo '</td>';
    }

  // on met des cases blanches pour completer la dernière semaine si besoin :
  for ( ; $daycode%7 != 1; $daycode++) echo '<td>&nbsp;</td>';

  // on ferme la dernière ligne, et la table.
  echo '</tr>'; echo "</table>\n\n";
  }
?>

Posté : 19 nov. 2008, 12:17
par yaug
Bonjour.

Après quelques modifs, je pense avoir obtenu ce qu'il te faut :

voici le code :
<?php
function Calendrier($month,$year,$links) {

  $MonthNames = array(1 => "Janvier","Fevrier","Mars","Avril","Mai","Juin",
               "Juillet","Aout","Septembre","Octobre","Novembre","Decembre");
  $monthname = $MonthNames[$month+0];

  // on ouvre la table
  echo '<table class="cal" cellspacing="1">';

  // Première ligne = mois et année ou link[0]
  $title = array_key_exists(0, $links) ? $links[0] : $monthname.' '.$year;
  echo '<tr><td colspan="7" class="cal_titre">'.$title.'</td>'."</tr>\n";

  // Seconde lignes = initiales des jours de la semaine
  $DayNames = array("S","D","L","M","M","J","V");
  echo '<tr>'; foreach ($DayNames as $d) echo '<th>'.$d.'</th>'; echo "</tr>\n";

  // On regarde si aujourd'hui est dans ce mois pour mettre un style particulier
  if ($year == date('Y') && $month == date('m'))
    $today = date('d');
  else
    $today = 0;

  $time = mktime(0,0,0,$month,1,$year); // timestamp du 1er du mois demandé
  $days_in_month = date('t',$time);     // nombre de jours dans le mois
  $firstday = date('w',$time);          // jour de la semaine du 1er du mois
  if ($firstday == 0) $firstday = 7;    // attention, en php, dimanche = 0

  $daycode = 6; // ($daycode % 7) va nous indiquer le jour de la semaine.
                // on commence par le lundi, c'est-à-dire 1.

  // on ouvre une première ligne pour le calendrier proprement dit :
  echo '<tr>';

  // on met des cases blanches jusqu'à la veille du 1er du mois :
  for ( ; $daycode != $firstday ; $daycode++){
	if($daycode > 6) $daycode = 0 ;
    echo '<td>&nbsp;</td>';
  }

  // boucle sur tous les jours du mois :
  for ($numday = 1; $numday <= $days_in_month; $numday++, $daycode++) {
    // si on en est au lundi (sauf le 1er), 
    // on ferme la ligne précédente et on en ouvre une nouvelle 
    if ($daycode%7 == 6 && $numday != 1) echo "</tr>\n".'<tr>';
    // on ouvre la case (avec un style particulier s'il s'agit d'aujourd'hui)
    echo ($numday == $today ? '<td class="today">' : '<td>');
    // on affiche le numéro du jour ou le contenu donné par l'utilisateur
    echo (array_key_exists($numday, $links) ? $links[$numday] : $numday);
    // on ferme la case
    echo '</td>';
    }

  // on met des cases blanches pour completer la dernière semaine si besoin :
  for ( ; $daycode%7 != 1; $daycode++) echo '<td>&nbsp;</td>';

  // on ferme la dernière ligne, et la table.
  echo '</tr>'; echo "</table>\n\n";
  } 

//octobre
$calendrier1 = calendrier(10, 2008, array("http://test.com"));
echo "<b>octobre</b> : " .$calendrier ." <br />";

//novembre
$calendrier1 = calendrier(11, 2008, array("http://test.com"));
echo "<b>novembre</b> : " .$calendrier ." <br />";

//décembre
$calendrier1 = calendrier(12, 2008, array("http://test.com"));
echo "<b>décembre</b> : " .$calendrier ." <br />";
?> 
Et le résultat pour les 3 mois voulu se trouve ICI

Posté : 19 nov. 2008, 13:12
par jobart
je te remercie^^
estce qu'on arriverait à faire cela avec ce code?

Code : Tout sélectionner

Novembre 2008 S D L M M J V S 01 02 03 04 05 06 07 08 08 09 10 11 12 13 14 15 15 16 17 18 19 20 21 22 22 23 24 25 26 27 28 29 29 30 01 02 03 04 05 06

Posté : 19 nov. 2008, 13:14
par yaug
je n'ai fait que reprendre un peu le code que tu donnais.
Sinon oui cela doit etre possible.

Comment?
Assez simple.
Pour le moment les éléments qui ne sont pas dans le mois sont remplacé par des <td> vide.
A toi d'y mettre les éléments du mois précédents.

J'ai presque envie de te mâcher le travail, mais point le temps :D

Posté : 19 nov. 2008, 16:56
par jobart
ben je rame :oops:
si j'ai bien compris
faut jouer avec la semaine avant, pendant et la semaine après
pour afficher du samedi au samedi?

Posté : 19 nov. 2008, 17:03
par yaug
heu non.
Du samedi au samedi j'ai déjà fait.
C'est ce que j'ai mis tout à l'heure.

Pour mettre les mois avant et apres (ce que tu as demandé ensuite), il faut que tu ailles sur les boucles de remplissage par des td blanc et que au lieu de remplir des <td></td> tu y mettes les jours du mois d'avant ou les jours du mois d'après. :wink:

Posté : 19 nov. 2008, 17:21
par jobart
heu :-k c'est pas du samedi au vendredi ce que tu m'as fait ? :oops:

Posté : 19 nov. 2008, 17:37
par yaug
bah..
Qui ferait un calendrier du samedi au samedi? :shock:
Ca forcerait a répéter les samedi non ?

S D L M M J V S
1 2 3 4 5 6 7 8
8 9

Franchement... je ne vois pas l'intérêt :D

Posté : 19 nov. 2008, 17:40
par jobart
ben justement c'est pour les cervo lant :wink: comme moi que je veux mettre le samedi à la fin aussi :oops:

Posté : 19 nov. 2008, 18:20
par Calimero
Franchement... je ne vois pas l'intérêt :D
Je pense à de la location immobilière ;-)... Je me trompe ?

Re: un peu d'aide sur un calendrier

Posté : 12 nov. 2009, 17:35
par jobart
un petit up pour m'aider à comprendre comment faire du samedi au samedi et remplir les cases vides avec la fin du mois précédent et suivant.
je n'y arrive toujours pas :oops:

Re: un peu d'aide sur un calendrier

Posté : 13 nov. 2009, 11:21
par FuZZyLine
Salut,
un petit up pour m'aider à comprendre comment faire du samedi au samedi et remplir les cases vides
avec la fin du mois précédent et suivant. je n'y arrive toujours pas :oops:
Joli up lol

Plus qu'un beau code... Je vais tenter de t'expliquer la marche à suivre:

Tu enregistres au format TimestampUnix ta premiere donnée trouvée -donc le samedi-, tu lui
ajoutes une semaine (en secondes) et tu obtiens ainsi sa date. Te suffit de rapatrier le jour
du mois et l'affaire est faite.

Le principe est de jouer entre le mktime(...) et date(...). Puisque tu connais déja le jour tu
as juste à créer le "TD" et à chaque passage sur "ce TD" tu récupères la donnée correspondante
qui aura été traitée.

Ce qui peut s'écrire ainsi:
<?php
 // Pour exemple le Sam 14 Nov 2009
 //
 $month = 11;
 $day   = 14;
 $year  = 2009;

 $iTS  = mktime(date("H"), date("i"), date("s")+604800, $month, $day, $year);

 echo "<table ...>\n";

 // Début de ta boucle
 //
 echo "   <tr>\n";
 .
 .
 // Dernier champ de ton tableau
 //
 echo "       <td>\n";

 // Récupération du jour du mois
 //
 echo date("d", $iTS)."\n";
 echo "       </td>\n";
 echo "    </tr>\n";

 // End boucle

 .
 .
 .
?>
En espérant que l'explication t'aura été utile. @+, bon code ;)

PS1: Si j'étais toi je décomposerais au plus petit élément commun... mais ca c'est affaire de gout ;)
PS2: Je ne mentionne pas, biensur, le fait que le dernier Samedi peut-être sur le mois ou/et l'année suivante...

Re: un peu d'aide sur un calendrier

Posté : 13 nov. 2009, 12:16
par sylvaing26
Salut,
j'ai recemment posté un code similaire a ce que tu souhaites réaliser dans les contributions de PHP France
Il y a quelques trucsz à modifier à ta sauce mais il y a une sacré base de travail et fonctionnel
vos-contributions/calendrier-reservations-t250029.html