2010-10-03 13 views
0

Ceci est le script de calendrier que j'ai obtenu à partir d'un tutoriel en ligne. Il fonctionne très bien, mais je veux déplacer la colonne de dimanche à la fin (après la colonne du samedi):Calendrier PHP: déplacer la colonne du dimanche à la fin

<?php 
if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n"); 
if (!isset($_REQUEST["year"])) $_REQUEST["year"] = date("Y"); 

$month_current = $_REQUEST["month"]; 
$year_current = $_REQUEST["year"]; 

$prev_year = $year_current; 
$next_year = $year_current; 

$month_previous = $month_current-1; 
$month_next = $month_current+1; 

if ($month_previous == 0) 
{ 
$month_previous = 12; 
$prev_year = $year_current - 1; 
} 

if ($month_next == 13) 
{ 
$month_next = 1; 
$next_year = $year_current + 1; 
} 

$timestamp = mktime(0,0,0,$month_current,1,$year_current); 
$lastdate = date("t",$timestamp); 

$thismonth = getdate ($timestamp); 
$firstday = $thismonth['wday']; 
?> 

<?php 
for ($i=0; $i<($lastdate + $firstday); $i++) 
{ 

if(($i % 7) == 0) echo "<tr>\n"; 

if($i < $firstday) echo "<td></td>\n"; 

else echo "<td align='center' valign='middle' height='20px'>". ($i - $firstday + 1) . "</td>\n"; 

if(($i % 7) == 6) echo "</tr>\n"; 

} 
?> 

J'ai essayé de changer le code dans ceci:

<?php 
for ($i=0; $i<($lastdate + $firstday); $i++) 
{ 

if(($i % 7) == 1) echo "<tr>\n"; 

# if $i less than the first day (1), don't print the value of $i 
if($i < $firstday) echo "<td></td>\n"; 

# print the value of $i 
else echo "<td align='center' valign='middle' height='20px'>". ($i - $firstday + 1) . "</td>\n"; 

if(($i % 7) == 0) echo "</tr>\n"; 

} 
?> 

Il ne puis pas afficher correctement dans la colonne lorsque le premier jour commence à partir du dimanche. Par exemple: http://ec-ener.eu/dump/index.php?month=8&year=2010

Comment puis-je résoudre ce problème? Alternativement, comment puis-je changer le script original afin que je puisse passer dimanche à la fin des colonnes?

p.s. Je viens aussi découvert que le code d'origine semble avoir un problème de bits/bug, si vous vérifiez le code html - tr et td - il génère,

<tr> 
<td align='center' valign='middle' height='20px'>30</td> 
<td align='center' valign='middle' height='20px'>31</td> 


           </table> 
      </td> 
     </tr> 

il a la table de clôture dans le et il n'y a qu'un fermeture mais pas d'ouverture. Je crois que la boucle simple unique originale génère un html invalide! puis-je le réparer? Merci!

Répondre

2

Je pense que vous devez modifier la valeur de la variable FirstDay pour le 1er jour

$firstday = $thismonth['wday']; //from here 
//adding 
$firstday = ($firstday + 6) % 7; //shifting the 1st day 
+0

merci beaucoup. ça marche avec cette ligne + le script original! :-) – laukok

+0

lol je le ferai! en passant, en fait, la simple boucle simple d'origine est trompeuse - il génère un code HTML invalide! Vous saurez ce que je veux dire si vous lisez la question éditée que j'ai posté ci-dessus. Merci! – laukok

0

Il y a deux problèmes dans votre script modifié:

La boucle est à partir de i = 0 $, mais pas générer une balise <tr> jusqu'à $ i = 1. Ainsi, la première colonne ne figure dans aucune balise <tr>.

De même, if($i < $firstday) doit être vrai six fois pour générer six balises <td></td> vides pour déplacer la date vers la colonne de droite.

Pour résoudre ce problème, démarrez la boucle de 1, et quand le dimanche est le premier jour, définissez $firstday = 7

<?php 
if($firstday == 0) $firstday = 7; 
for ($i=1; $i<($lastdate + $firstday); $i++) 
{ 

    if(($i % 7) == 1) echo "<tr>\n"; 

    # if $i less than the first day (1), don't print the value of $i 
    if($i < $firstday) echo "<td></td>\n"; 

    # print the value of $i 
    else echo "<td align='center' valign='middle' height='20px'>". ($i - $firstday + 1) . "</td>\n"; 

    if(($i % 7) == 0) echo "</tr>\n"; 

} 
?> 
+0

merci beaucoup. J'aime cette solution car elle a plus de sens pour moi bcos je ne comprends pas très bien comment fonctionne le% (module de division)! en passant, la fin si devrait être ceci - if (($ i% 7) == 0) echo " \ n"; sinon, il affiche étrangement ... merci! – laukok

+0

Vous avez raison, je fermais la balise après avoir imprimé une seule colonne. Oops. (Je vais corriger cela dans mon code au cas où quelqu'un le lit à l'avenir) –

+0

pas de problème, en fait la simple boucle simple d'origine est trompeuse - elle génère un code HTML invalide! – laukok