Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите с листалкой
 
 автор: technic611   (06.04.2012 в 17:59)   письмо автору
 
 

<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\">&lt;&lt;&lt;</a>";

 
if($m>=11 )
{
$url="";

}else $url="<a href=\"test.php?m=$m_max&y=$y&o=$otstup_url&pr=$o\">&gt;&gt;&gt;</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?>">&lt;&lt;&lt;</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?>">&gt;&gt;&gt;</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 == || $j == 6
             echo 
"<td><font color=red>".$week[$i][$j]."</font></td>";
        else echo 
"<td>".$week[$i][$j]."</td>";
      }
      else echo 
"<td>&nbsp;</td>";
    }
    echo 
"</tr>";
  }   






?>

  Ответить  
 
 автор: confirm   (06.04.2012 в 18:13)   письмо автору
 
   для: technic611   (06.04.2012 в 17:59)
 

Это же неудобно для пользователя - каждое изменение вашего календаря, это запрос к серверу и перезагрузка страницы. Календари нужно делать на JavaScript.

  Ответить  
 
 автор: technic611   (06.04.2012 в 18:21)   письмо автору
 
   для: confirm   (06.04.2012 в 18:13)
 

это тестовое задние. сказали надо на php

  Ответить  
 
 автор: confirm   (06.04.2012 в 18:51)   письмо автору
 
   для: technic611   (06.04.2012 в 18:21)
 

Ясно. А о каких числах речь, о днях в месяце? Так у вас не правильно указаны они - первая косточка пальца одной руки, это январь - 31 день, далее ямка, это февраль (у вас 29, но это только для високосного года), затем опять косточка, это 31 день, потом ямка - 30 и т.д..

  Ответить  
 
 автор: technic611   (06.04.2012 в 20:08)   письмо автору
 
   для: 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!=$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\">&lt;&lt;&lt;</a>";

 
if(
$m>=11 )
{
$url="";

}else 
$url="<a href=\"test.php?m=$m_max&y=$y&o=$otstup_url&pr=$o\">&gt;&gt;&gt;</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?>">&lt;&lt;&lt;</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?>">&gt;&gt;&gt;</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 == || $j == 6
             echo 
"<td><font color=red>".$week[$i][$j]."</font></td>";
        else echo 
"<td>".$week[$i][$j]."</td>";
      }
      else echo 
"<td>&nbsp;</td>";
    }
    echo 
"</tr>";
  }   






?>



дефолтной точкой будет начало этого года. 31 января 2012 года.
есть какие-нибудь идеи как реализовать?

  Ответить  
 
 автор: confirm   (06.04.2012 в 20:32)   письмо автору
 
   для: technic611   (06.04.2012 в 20:08)
 

Ну если я вам скажу как бы я поступил, боюсь, что вы скажете, типа "это не мой уровень", или "что этого вы не понимаете". Советы обратиться к мануалу, тоже почему-то порождают обиды, так что...) Анализировать весь ваш код тоже не охота, могу только заметить, что у вас не проверяется високосный год, вроде бы как, а потому в феврале будут ошибки. Ну и совет - если это задание, то такое как $y=$_GET['y']; писать не стоит. Это не является фатальной ошибкой, но неизбежно породит предупреждение, так как изначально массив GET у вас будет пустой, а значит это будет говорить вашему работодателю/экзаменатору, что вы не все продумываете.

Насчет 2012 года - у вас сейчас стартовый 2000, работает? Ну значит изменяйте на 2012.

  Ответить  
 
 автор: technic611   (07.04.2012 в 00:04)   письмо автору
 
   для: confirm   (06.04.2012 в 20:32)
 

ничего я не скажу, я учусь, как вы это видите. я же написал, работает неккоректно.

  Ответить  
 
 автор: confirm   (07.04.2012 в 07:21)   письмо автору
 
   для: technic611   (07.04.2012 в 00:04)
 

Я не ради, чтобы уязвить вас написал такое, просто имеют опыт, когда пишешь, пишешь, а получается напрасно. Поэтому коротко - я знаю, что языки программирования имеют инструменты для работы с датой, и php не исключение. Вот это бы я и использовал.

А в чем выражается некорректность?

  Ответить  
 
 автор: technic611   (07.04.2012 в 10:18)   письмо автору
 
   для: confirm   (07.04.2012 в 07:21)
 

использовать функцию date () нельзя. я так понял нужно считать пустые ячейки текущего месяца и потом делать отступ в следующем месяце на это кол-во ячеек, некоторые месяцы работают верно, а некоторые не правильно заполняют таблицу

  Ответить  
 
 автор: confirm   (07.04.2012 в 10:27)   письмо автору
 
   для: technic611   (07.04.2012 в 10:18)
 

Это почему нельзя? Не считать пустые ячейки текущего месяца, а узнать день недели первого дня текущего месяца. Функция date() может вернуть все необходимое для календаря, а strtotime() позволит работать с одной get-переменной, чтобы листать календарь.
Я поэтому и говорил - так как бы я хотел сделать, это тайна покрытая мраком. )

  Ответить  
 
 автор: technic611   (07.04.2012 в 12:17)   письмо автору
 
   для: confirm   (07.04.2012 в 10:27)
 

по заданию date использовать нельзя

  Ответить  
 
 автор: technic611   (07.04.2012 в 13:13)   письмо автору
 
   для: technic611   (07.04.2012 в 12:17)
 

разобрался в чем проблема. теперь нужно понять как менять месяцы если поменять год

  Ответить  
 
 автор: confirm   (07.04.2012 в 14:48)   письмо автору
 
   для: technic611   (07.04.2012 в 12:17)
 

Ясно.
Вы же задаете изначально стартовую точку календаря (как можете указать и предел его), вы прописываете параметры в url кнопок. Вот и вставляйте их, день вперед/назад, с проверкой. Только число дней февраля нужно корректировать, а так как в нашем календаре високосный год, это каждый четвертый, значит удобнее в массиве для этого месяца указать 28 дней.
Ну а год еще проще - просто плюсуйте/минусуйте по 1 к текущему году, проверяя достижение краев календаря.

  Ответить  
 
 автор: technic611   (08.04.2012 в 15:29)   письмо автору
 
   для: confirm   (07.04.2012 в 14:48)
 

это пустой разговор. а как быть если листать год и тут же одновременно месяц?

  Ответить  
 
 автор: confirm   (08.04.2012 в 15:42)   письмо автору
 
   для: technic611   (08.04.2012 в 15:29)
 

А вы можете представить такую ситуацию? Вроде бы как по логике действий, пользователь смещается в календаре либо выбирая год, либо месяц.
Ваш календарь должен выполнять две однотипные операции - указывать скрипту что изменяется по требованию пользователя и в каком направлении. Если выбран год, значит в зависимости от выбранного направления либо добавлять к текущему году 1, либо отнимать, проверяя установленные вами пределы календаря.
Тоже самое для месяца, с той лишь разницей, что вы должны еще проверять, достигнут ли край года, и надо ли осуществить и переход на следующий год, с одновременной сменой месяца.
Ну и хранить на клиенте текущий год и месяц, если вам и сессии не разрешены по условию.

  Ответить  
 
 автор: technic611   (09.04.2012 в 15:13)   письмо автору
 
   для: confirm   (08.04.2012 в 15:42)
 

Кто-нибудь предложит какие-нибудь методы?

  Ответить  
 
 автор: confirm   (09.04.2012 в 17:52)   письмо автору
 
   для: 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;
Это будет возвращать индекс ячейки таблицы с которой и надо начинать вывод дней календаря.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования