|
|
|
|
<html>
<head>
<title>Календарь</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
</head>
<?
$month=array("январь","февраль","март","апрель","май","июнь",
"июль","август","сентябрь","октябрь","ноябрь","декабрь");
|
если поменять какое-нибудь число на 31 все сбивается
$dayofmonth=array(30,29,30,30,30,31,31,30,30,31,30,31);
$y=$_GET['y'];
$m=$_GET['m'];
$o=$_GET['o'];
$pr=$_GET['pr'];
if (!isset($y)) $y=2000;
if (!isset($m)) $m=0;
if($o==0)
{
$otstup_url=35-$dayofmonth[$m];
$otstup=-1;
}
$y_min=$y-1;
$y_max=$y+1;
$m_min=$m-1;
$m_max=$m+1;
$day_count=1;
$num=0;
if($m!=0 & $o!=0)
{
$otstup=6-$o;
$otstup_url=35-($dayofmonth[$m]+$otstup+1);
} else
{
$otstup=-1;
}
if($m_min<0)
{
$m_min=0;
$url2="";
}else $url2="<a href=\"test.php?m=$m_min&y=$y&o=$pr&pr=$o\"><<<</a>";
if($m>=11 )
{
$url="";
}else $url="<a href=\"test.php?m=$m_max&y=$y&o=$otstup_url&pr=$o\">>>></a>";
for($i=0; $i<7; $i++)
{
if ($i>$otstup){
$week[$num][$i] = $day_count;
$day_count++;
}else $week[$num][$i]=0;
}
while(true)
{
$num++;
for($i = 0; $i < 7; $i++)
{
$week[$num][$i] = $day_count;
$day_count++;
// Если достигли конца месяца - выходим
// из цикла
if($day_count > $dayofmonth[$m]) break;
}
// Если достигли конца месяца - выходим
// из цикла
if($day_count > $dayofmonth[$m]) break;
}
?>
<table border=1 cellspacing=0 cellpadding=2>
<tr>
<td colspan=7>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr>
<td align="left"><a href="<? echo "test.php?y=$y_min&m=$m&o=$o&pr=$pr" ?>"><<<</a></td>
<td align="center"><? echo $y ?></td>
<td align="right"><a href="<? echo "test.php?y=$y_max&m=$m&o=$o&pr=$pr" ?>">>>></a></td>
</tr>
<tr>
<td align="left"><? echo "$url2"; ?></td>
<td align="center"><? echo $month[$m] ?></td>
<td align="right"><? echo "$url"; ?></td>
</tr>
</table>
</td>
</tr>
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td>Сб</td><td>Вс</td><tr>
<?
for($i = 0; $i < count($week); $i++)
{
echo "<tr>";
for($j = 0; $j < 7; $j++)
{
if(!empty($week[$i][$j]))
{
// Если имеем дело с субботой и воскресенья
// подсвечиваем их
if($j == 5 || $j == 6)
echo "<td><font color=red>".$week[$i][$j]."</font></td>";
else echo "<td>".$week[$i][$j]."</td>";
}
else echo "<td> </td>";
}
echo "</tr>";
}
?>
|
| |
|
|
|
|
|
|
|
для: technic611
(06.04.2012 в 17:59)
| | Это же неудобно для пользователя - каждое изменение вашего календаря, это запрос к серверу и перезагрузка страницы. Календари нужно делать на JavaScript. | |
|
|
|
|
|
|
|
для: confirm
(06.04.2012 в 18:13)
| | это тестовое задние. сказали надо на php | |
|
|
|
|
|
|
|
для: technic611
(06.04.2012 в 18:21)
| | Ясно. А о каких числах речь, о днях в месяце? Так у вас не правильно указаны они - первая косточка пальца одной руки, это январь - 31 день, далее ямка, это февраль (у вас 29, но это только для високосного года), затем опять косточка, это 31 день, потом ямка - 30 и т.д.. | |
|
|
|
|
|
|
|
для: confirm
(06.04.2012 в 18:51)
| | да, я сначала делал произвольно, потом оказалось, что нужно все точно. переделал
<?
$month=array("январь","февраль","март","апрель","май","июнь",
"июль","август","сентябрь","октябрь","ноябрь","декабрь");
$dayofmonth=array(31,29,31,30,31,30,31,31,30,31,30,31);
$y=$_GET['y'];
$m=$_GET['m'];
$o=$_GET['o'];
$pr=$_GET['pr'];
if (!isset($y)) $y=2000;
if (!isset($m)) $m=0;
if($o==0)
{
$otstup_url=35-$dayofmonth[$m];
$otstup=-1;
}
$y_min=$y-1;
$y_max=$y+1;
$m_min=$m-1;
$m_max=$m+1;
$day_count=1;
$num=0;
if($m!=0 & $o!=0)
{
$otstup=6-$o;
$otstup_url=35-($dayofmonth[$m]+$otstup+1);
} else
{
$otstup=5;
}
if($m_min<0)
{
$m_min=0;
$url2="";
}else $url2="<a href=\"test.php?m=$m_min&y=$y&o=$pr&pr=$o\"><<<</a>";
if($m>=11 )
{
$url="";
}else $url="<a href=\"test.php?m=$m_max&y=$y&o=$otstup_url&pr=$o\">>>></a>";
for($i=0; $i<7; $i++)
{
if ($i>$otstup){
$week[$num][$i] = $day_count;
$day_count++;
}else $week[$num][$i]=0;
}
while(true)
{
$num++;
for($i = 0; $i < 7; $i++)
{
$week[$num][$i] = $day_count;
$day_count++;
// Если достигли конца месяца - выходим
// из цикла
if($day_count > $dayofmonth[$m]) break;
}
// Если достигли конца месяца - выходим
// из цикла
if($day_count > $dayofmonth[$m]) break;
}
?>
<table border=1 cellspacing=0 cellpadding=2>
<tr>
<td colspan=7>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr>
<td align="left"><a href="<? echo "test.php?y=$y_min&m=$m&o=$o&pr=$pr" ?>"><<<</a></td>
<td align="center"><? echo $y ?></td>
<td align="right"><a href="<? echo "test.php?y=$y_max&m=$m&o=$o&pr=$pr" ?>">>>></a></td>
</tr>
<tr>
<td align="left"><? echo "$url2"; ?></td>
<td align="center"><? echo $month[$m] ?></td>
<td align="right"><? echo "$url"; ?></td>
</tr>
</table>
</td>
</tr>
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td><td>Сб</td><td>Вс</td><tr>
<?
for($i = 0; $i < count($week); $i++)
{
echo "<tr>";
for($j = 0; $j < 7; $j++)
{
if(!empty($week[$i][$j]))
{
// Если имеем дело с субботой и воскресенья
// подсвечиваем их
if($j == 5 || $j == 6)
echo "<td><font color=red>".$week[$i][$j]."</font></td>";
else echo "<td>".$week[$i][$j]."</td>";
}
else echo "<td> </td>";
}
echo "</tr>";
}
?>
|
дефолтной точкой будет начало этого года. 31 января 2012 года.
есть какие-нибудь идеи как реализовать? | |
|
|
|
|
|
|
|
для: technic611
(06.04.2012 в 20:08)
| | Ну если я вам скажу как бы я поступил, боюсь, что вы скажете, типа "это не мой уровень", или "что этого вы не понимаете". Советы обратиться к мануалу, тоже почему-то порождают обиды, так что...) Анализировать весь ваш код тоже не охота, могу только заметить, что у вас не проверяется високосный год, вроде бы как, а потому в феврале будут ошибки. Ну и совет - если это задание, то такое как $y=$_GET['y']; писать не стоит. Это не является фатальной ошибкой, но неизбежно породит предупреждение, так как изначально массив GET у вас будет пустой, а значит это будет говорить вашему работодателю/экзаменатору, что вы не все продумываете.
Насчет 2012 года - у вас сейчас стартовый 2000, работает? Ну значит изменяйте на 2012. | |
|
|
|
|
|
|
|
для: confirm
(06.04.2012 в 20:32)
| | ничего я не скажу, я учусь, как вы это видите. я же написал, работает неккоректно. | |
|
|
|
|
|
|
|
для: technic611
(07.04.2012 в 00:04)
| | Я не ради, чтобы уязвить вас написал такое, просто имеют опыт, когда пишешь, пишешь, а получается напрасно. Поэтому коротко - я знаю, что языки программирования имеют инструменты для работы с датой, и php не исключение. Вот это бы я и использовал.
А в чем выражается некорректность? | |
|
|
|
|
|
|
|
для: confirm
(07.04.2012 в 07:21)
| | использовать функцию date () нельзя. я так понял нужно считать пустые ячейки текущего месяца и потом делать отступ в следующем месяце на это кол-во ячеек, некоторые месяцы работают верно, а некоторые не правильно заполняют таблицу | |
|
|
|
|
|
|
|
для: technic611
(07.04.2012 в 10:18)
| | Это почему нельзя? Не считать пустые ячейки текущего месяца, а узнать день недели первого дня текущего месяца. Функция date() может вернуть все необходимое для календаря, а strtotime() позволит работать с одной get-переменной, чтобы листать календарь.
Я поэтому и говорил - так как бы я хотел сделать, это тайна покрытая мраком. ) | |
|
|
|
|
|
|
|
для: confirm
(07.04.2012 в 10:27)
| | по заданию date использовать нельзя | |
|
|
|
|
|
|
|
для: technic611
(07.04.2012 в 12:17)
| | разобрался в чем проблема. теперь нужно понять как менять месяцы если поменять год | |
|
|
|
|
|
|
|
для: technic611
(07.04.2012 в 12:17)
| | Ясно.
Вы же задаете изначально стартовую точку календаря (как можете указать и предел его), вы прописываете параметры в url кнопок. Вот и вставляйте их, день вперед/назад, с проверкой. Только число дней февраля нужно корректировать, а так как в нашем календаре високосный год, это каждый четвертый, значит удобнее в массиве для этого месяца указать 28 дней.
Ну а год еще проще - просто плюсуйте/минусуйте по 1 к текущему году, проверяя достижение краев календаря. | |
|
|
|
|
|
|
|
для: confirm
(07.04.2012 в 14:48)
| | это пустой разговор. а как быть если листать год и тут же одновременно месяц? | |
|
|
|
|
|
|
|
для: technic611
(08.04.2012 в 15:29)
| | А вы можете представить такую ситуацию? Вроде бы как по логике действий, пользователь смещается в календаре либо выбирая год, либо месяц.
Ваш календарь должен выполнять две однотипные операции - указывать скрипту что изменяется по требованию пользователя и в каком направлении. Если выбран год, значит в зависимости от выбранного направления либо добавлять к текущему году 1, либо отнимать, проверяя установленные вами пределы календаря.
Тоже самое для месяца, с той лишь разницей, что вы должны еще проверять, достигнут ли край года, и надо ли осуществить и переход на следующий год, с одновременной сменой месяца.
Ну и хранить на клиенте текущий год и месяц, если вам и сессии не разрешены по условию. | |
|
|
|
|
|
|
|
для: confirm
(08.04.2012 в 15:42)
| | Кто-нибудь предложит какие-нибудь методы? | |
|
|
|
|
|
|
|
для: technic611
(09.04.2012 в 15:13)
| | Методы чего?
Если о том как при смене года менять и месяц, то зачем?
Что еще вам надо?
Вот я, к примеру, так и не увидел до сих пор, где же вы проверяете високосный год. Либо вы делаете это каким-то своим запутанным методом понятным только вам (хотя для этого достаточно разделить год по модулю 4), либо вообще ничего не делаете, а значит неминуема ошибка. У вас до сих пор февраль в массиве определен 29 днями, словно ваш календарь рассчитан только на 2012, или исключительно на високосные года. Тоже самое и с днем недели, откуда берется этот $week, что вы там считаете...
А ведь, если вам не разрешено пользоваться функциями работы с датой, что является полным идиотизмом (но это так, к слову), то значит вы должны получать день недели первого дня каждого месяца, начиная с известной опорной точки. Ваш календарь с 2012 года, а первым днем января этого года является воскресенье. Учитывая то, что работаем с массивами, то этот день будет иметь индекс: $firstday = 6;. Узнаем сколько дней в неделе занимают первая неделя этого месяца: 7-6=1. Количество этих дней нужно вычитать из общего числа дней, равных как число лет (от стартового года календаря) помноженное на 365, плюс по одному дню для каждого входящего високосного года в это число лет. Естественно, что если число лет равно 1, то нужно брать сумму только дней от января по месяц предыдущий текущему, тоже самое учитывать и для последнего года.
А далее получать день недели:
$week_day = (($days % 28)-(7-$firstday))%7;
Это будет возвращать индекс ячейки таблицы с которой и надо начинать вывод дней календаря. | |
|
|
|
|