Помогите с календарем на год.

dim-dem

Новичок
Помогите с календарем на год.

Помогите, плз. с календарем, который выводит все 12 месяцев с ссылкой на день.
 

dim-dem

Новичок
Вот есть пример скрипта от RomikChef:
Подскажите, плз., как сделать вывод всех 12-ти месяцев.

<?
function calendar() {
$mons=array("","январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");
list($m,$y)=explode("-",$_GET['date']);
$m=intval($m); $y=intval($y);
if ($m < 1 or $m > 13) $m=date("n");
if ($y < 1000 or $y > 3000) $y=date("Y");
$t=date("w",mktime (0,0,0,$m,1,$y));
if ($t==0)
$t=7;
$month=date("m",mktime (0,0,0,$m,1,$y));
$today=date("Y-m-d");
?>
<table border=1 cellspacing=1 cellpadding=0>
<tr>
<td colspan=7>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr>
<td align="left"><a href="?date=<? echo date("m-Y",mktime (0,0,0,$m-1,1,$y)) ?>">&laquo;&laquo;&laquo;</a></td>
<td align="center"><? echo $mons[$m]," ",$y ?></td>
<td align="right"><a href="?date=<? echo date("m-Y",mktime (0,0,0,$m+1,1,$y)) ?>">&raquo;&raquo;&raquo;</a></td>
</tr>
</table>
</td>
</tr>
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td>Сб</td><td>Вс</td></tr>
<tr>
<?
if ($t==0) echo "<tr>\n";
for ($w=0;$w<$t-1; $w++) echo " <td>&nbsp</td>\n";
while($m==date("n", mktime (0,0,0,$m,++$d,$y))) {
if ($w==0) echo "<tr>\n";
$link="$y-$month-$d";
if ($link==$today) $day="<b>$d</b>"; else $day=$d;
echo " <td><a href=script.php?date=$link>$day</td>\n";
if ($w++ == 6) {
echo "</tr>\n";
$w=0;
}
}
if ($w) {
for ($i=$w;$i<7;$i++) echo " <td>&nbsp</td>\n";
echo "</tr>\n";
}
?>
</table>
<?
}
calendar();
?>
 

XtremallyPurpur

Новичок
Вопрос вдогонку,

у меня рисуется календарь на 12 месяцев,
и для каждого дня необходимо подсветить, если информация в базе есть для этого дня.

Итого: 365 запросов к базе при отображении страницы. Как-то оптимизировать можно?
Работает в локальной сети и пользователей не много, но по-моему это неправильный подход.
Что порекомендуете?
 

Demiurg

Guest
можно. сделать 1 запрос на весь год, засунуть все в массив и при выводе брать информацию о нем.
 

HEm

Сетевой бобер
Автор оригинала: XtremallyPurpur
Вопрос вдогонку,

у меня рисуется календарь на 12 месяцев,
и для каждого дня необходимо подсветить, если информация в базе есть для этого дня.

Итого: 365 запросов к базе при отображении страницы. Как-то оптимизировать можно?
Работает в локальной сети и пользователей не много, но по-моему это неправильный подход.
Что порекомендуете?
365 запросов, ужас!
Это один запрос!
[sql]SELECT COUNT(info) FROM table WHERE YEAR(filldate)=2003 GROUP BY DAYOFYEAR(filldate)[/sql]
что-то в этом духе, забираешь все в массив и потом при выводе смотришь в массиве есть ли на конкр. день инфа и в каком количестве
А еще лучше такую фигню один раз в статику забить (кэширование) если это, например, новости, задним числом новости не вбивают обычно
 

XtremallyPurpur

Новичок
dim-dem
PHP:
  function calendar($month_id,$year){
    $monthnames = array("Январь",
                       "Февраль",
                       "Март",
                       "Апрель",
                       "Май",
                       "Июнь",
                       "Июль",
                       "Август",
                       "Сентябрь",
                       "Октябрь",
                       "Ноябрь",
                       "Декабрь");
    $monthdays[1]=31;
    $monthdays[2]=28;
    $monthdays[3]=31;
    $monthdays[4]=30;
    $monthdays[5]=31;
    $monthdays[6]=30;
    $monthdays[7]=31;
    $monthdays[8]=31;
    $monthdays[9]=30;
    $monthdays[10]=31;
    $monthdays[11]=30;
    $monthdays[12]=31;
    if ((($year%4==0)&&!($year%100==0))||($year%400==0)) $monthdays[2]++;
    $month = ($month_id<10)?"0".$month_id:$month_id;
    $calen = "\n\t<font color=black><b>".$monthnames[$month_id-1]."</b></font>\n<table border=1 cellspacing=0 bordercolor=#aaaacc class=tablecl>\n";
    $numofweek=0;
    for ($i=1;$i<=$monthdays[$month_id];$i++){
      $utime = mktime (0,0,0,$month_id,$i,$year);
      $getdate_arr = getdate($utime);
      $wday = $getdate_arr['wday'];
      $month_arr[$wday][$numofweek] = $i;
      if($wday==0)$numofweek++;
    }
    for ($i=1;$i<=6;$i++){
      $calen .= "\n\t<tr>\n\t\t<td></td>\n\t\t<td bgcolor=#cccccc>".dayofweek($i)."</td>\n";
      for ($k=0;$k<=5;$k++){
        if (!isset($month_arr[$i][$k])){
          $calen .= "\t\t<td></td>\n";
          continue;
        }
        $day = ($month_arr[$i][$k]<10)?"0".$month_arr[$i][$k]:$month_arr[$i][$k];
        $date = $year.$month.$day;
        $calen .= "\t\t<td><a href=mail/index.php?search&date=$date&sort=Date&to=down&".r().">$day </a></td>\n";
      }
      $calen .= "\t</tr>\n";
    }
    $i=0;
    $calen .= "\n\t<tr>\n\t\t<td></td>\n\t\t<td bgcolor=#cccccc>".dayofweek($i)."</td>\n";
      for ($k=0;$k<=5;$k++){
        if (!isset($month_arr[$i][$k])){
          $calen .= "\t\t<td></td>\n";
          continue;
        }
        $day = ($month_arr[$i][$k]<10)?"0".$month_arr[$i][$k]:$month_arr[$i][$k];
        $date =$year.$month.$day;
        $calen .= "\t\t<td bgcolor=#FFCC99><a href=mail/index.php?search&date=$date&sort=Date&to=down&".r().">$day </a></td>\n";
      }
      $calen .= "\t</tr>\n";

    $calen .= "</table>\n";
    return $calen;
  }
В цикле запускаешь, типа:
PHP:
while(12<$i++){
  print calendar($i,2004);
}
 

HEm

Сетевой бобер
интересно, а вот это
PHP:
$monthdays[1]=31; 
    $monthdays[2]=28; 
    $monthdays[3]=31; 
    $monthdays[4]=30; 
    $monthdays[5]=31; 
    $monthdays[6]=30; 
    $monthdays[7]=31; 
    $monthdays[8]=31; 
    $monthdays[9]=30; 
    $monthdays[10]=31; 
    $monthdays[11]=30; 
    $monthdays[12]=31;
нельзя было оформить также как и
PHP:
 $monthnames = array(
? ;)
 

XtremallyPurpur

Новичок
еще к нему функция нужна вот такая:

PHP:
  function dayofweek($day){
     switch ($day){
       case 0:
         return "Пон";
       case 1:
         return "Вт";
       case 2:
         return "Ср";
       case 3:
         return "Чт";
       case 4:
         return "Пят";
       case 5:
         return "Сб";
       case 6:
         return "Вск";
       default:
         die("Strange error.");
     }
  }
 

Demiurg

Guest
XtremallyPurpur
это тоже в массив можно засунуть.
 

LAMborginy

Guest
Вот мой вариант:
PHP:
<?php

if (!isset($year)) {
	$year = date("Y");
}

if (!isset($month)) {
	$month = date("m");
}


$calendar = Array();

$day = 1;
$d = 1;
$tsp = mktime("0","0","0",$month,$day,$year);
$inf = getdate($tsp);
if ($inf["wday"] == 0) {$inf["wday"] = 7;}

$x = 1;
$y = 1;
while ($d < $inf["wday"]) {
	$calendar[$x][$y] = "&nbsp;";
	$y++;
	$d++;
}

while (checkdate($month,$day,$year)) {
	$tsp = mktime("0","0","0",$month,$day,$year);
	$inf = getdate($tsp);
	if ($inf["wday"] == 0) {$inf["wday"] = 7;}
	$calendar[$x][$y] = $day;
	$y++;
	if ($inf["wday"] == 7) {$x++; $y = 1;}
	$day++;
}

if ($inf["wday"] < 7) {
	for ($inf["wday"]; $inf["wday"] < 7; $inf["wday"]++) {
		$calendar[$x][$y] = "&nbsp;";
		$y++;
	}
}

?>


<?php

echo "<TABLE border=1 cellspacing=0 cellpadding=3>";
for ($x = 1; $x <= sizeof($calendar); $x++) {
	echo "<TR>";
	for ($y = 1; $y <= sizeof($calendar[$x]); $y++) {
		echo "<TD align=\"right\">".$calendar[$x][$y]."</TD>";
	}
	echo "</TR>";
}
echo "</TABLE><BR>";


echo "<TABLE border=1 cellspacing=0 cellpadding=3>";
for ($y = 1; $y <= 7; $y++) {
	echo "<TR>";
	for ($x = 1; $x <= sizeof($calendar); $x++) {
		echo "<TD align=\"right\">".$calendar[$x][$y]."</TD>";
	}
	echo "</TR>";
}
echo "</TABLE>";

?>


<?php
$dates = Array(
	'1' => 'Январь',
	'2' => 'Февраль',
	'3' => 'Март',
	'4' => 'Апрель',
	'5' => 'Май',
	'6' => 'Июнь',
	'7' => 'Июль',
	'8' => 'Август',
	'9' => 'Сентябрь',
	'10' => 'Октябрь',
	'11' => 'Ноябрь',
	'12' => 'Декабрь'
);

$y = "2002";

echo "<FORM name=\"calendar\">";

echo "<SELECT OPTION name=\"month\" OnChange=\"calendar.submit()\">\n";
while (list($k,$v) = each($dates)) {
	if ($k == $month) {
		echo "<OPTION value=\"".$k."\" selected>".$v."</OPTION>\n";
	} else {
		echo "<OPTION value=\"".$k."\">".$v."</OPTION>\n";
	}
}
echo "</SELECT>\n";

echo "<SELECT OPTION name=\"year\" OnChange=\"calendar.submit()\">\n";
for ($y; $y <= date("Y"); $y++) {
	if ($y == $year) {
		echo "<OPTION value=\"".$y."\" selected>".$y."</OPTION>\n";
	} else {
		echo "<OPTION value=\"".$y."\">".$y."</OPTION>\n";
	}
}
echo "</SELECT>\n";

echo "</FORM>";

?>
 
Сверху