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

Форум PHP

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

 

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

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

тема: Календарик. Выделяем даты.
 
 автор: LINKIN   (27.06.2005 в 17:54)   письмо автору
 
 

Код календаря:
<?php 

    $daysinmonth
=date("t");  //Число дней в месяце 

    
$weeks=$daysinmonth/7//Число недель в месяце 

    
$weeks=round($weeks,0);  //Округляем полученый результат 

    
$dayofweek=date("w"); // День недели 0 - воскресение, 6 - суббота 

    
$dayofmonth=date("j"); // День месяца  без нуля 

    
$dayofmonthlz=date("d"); // День месяца с ведущим нулем 

    
$monthlz=date("n"); // Номер месяца без нуля 

    
$monthdays=date("t"); // Колличество дней в месяце 

    
$daysarray=array("Понефторник","Пн","Вт","Ср","Чт","Пт","Сб","Вс");//Массив дней недели 

    
$month = array("1"=>"Январь",
"2"=>"Февраль","3"=>"Март","4"=>"Апрель",
"5"=>"Май""6"=>"Июнь""7"=>"Июль",
"8"=>"Август","9"=>"Сентябрь",
"10"=>"Октябрь","11"=>"Ноябрь",
"12"=>"Декабрь");// Массив месяцев 

    
$months=array("мартабрь","января",
"февраля","марта","апреля","мая","июня",
"июля","августа","сентября","октября",
"ноября","декабря");//Массив месяцев 

    
$numberfirstday date("w",mktime(0,0,0,date("m"),1,date("Y"))); // Вычисляем каким будет первый день месяца по счету в неделе. 

    
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
    <html> 
        <head> 
            <title>Календарь</title> 
            <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> 
        </head> 
    <body> 
    <? 


       
echo "<table width=\"200\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">\n\t<tr>\n"

       
// Для начала выводим дни недели 
            
for ($i 1$i <= 7$i++) { 
                if(
$i>5){ 
                    echo 
"\t\t<td><font color=\"#E4723A\">".$daysarray[$i]."</font></td>\n"
                }else{ 
                    echo 
"\t\t<td>".$daysarray[$i]."</td>\n"
                } 
               } 
           echo 
"\t</tr>\n\t<tr>\n"

        
// Выводим пустые дни предыдущего месяца. 
            
$j 1
            while (
$j $numberfirstday) { 
               echo 
"\t\t<td> </td>\n"
               
$j++; 
              } 



        
//Теперь выводим ВСЕ дни месяца. 

         
for ($i 1$i <= $monthdays$i++) { 

          if(
$i==$dayofmonth){ 
    
#      echo "\t\t<td><a href=\"news/".date("Y")."/".date("m")."/".$i."/\"><b>".$i."</b></a></td>\n"; 
           
echo "\t\t<td bgcolor=\"#FF8040\" align=\"center\"><b>".$i."</b></td>\n"// подсвечиваем сегоднящний день 
           
}else{ 
   
#       echo "\t\t<td><a href=\"news/".date("Y")."/".date("m")."/".$i."/\">".$i."</a></td>\n"; 
           
echo "\t\t<td align=\"center\">".$i."</td>\n"
           } 

            
//Новая неделя 
               
if (round($j/7)-$j/7==0){ 
                 echo 
"\t</tr>\n\t<tr>\n"
            } 

            
$j++; 
          } 
         echo 
"\t</tr>\n</table>\n"

?> 
    

Задача: Определенным цветом и bgcolor*ом определять заданые даты. Например 07.08, или 12.12 и т. п. .
Как это сделать ? Шо, и вместо чего заменить/вставить ?...

   
 
 автор: cheops   (27.06.2005 в 21:07)   письмо автору
 
   для: LINKIN   (27.06.2005 в 17:54)
 

Дополните условия в код подсвечивающий текущую дату
<?php
if($i==$dayofmonth)
?>

Например, условие
<?php
if($i == $dayofmonth || $i == 12)
?>

будет помимо текущей даты подсвечивать ещё и 12 число.

   
 
 автор: LINKIN   (27.06.2005 в 22:33)   письмо автору
 
   для: cheops   (27.06.2005 в 21:07)
 

а подробнее, пожалуйста, как подсветить 08.08 красным цветом ? Кодом, plz.

   
 
 автор: P@Sol   (28.06.2005 в 08:57)   письмо автору
 
   для: LINKIN   (27.06.2005 в 22:33)
 

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

   
 
 автор: LINKIN   (28.06.2005 в 15:31)   письмо автору
 
   для: P@Sol   (28.06.2005 в 08:57)
 

ты шо шутишь ?? Какой-то блокнотик в БД ? ;))

   
 
 автор: P@Sol   (28.06.2005 в 15:47)   письмо автору
 
   для: LINKIN   (28.06.2005 в 15:31)
 

мое дело предложить, твое дело воспользоваться советом или нет....

   
 
 автор: glsv (Дизайнер)   (29.06.2005 в 04:51)   письмо автору
 
   для: LINKIN   (27.06.2005 в 22:33)
 

А откуда подсвечиваемые даты брать вы уже решили? Ведь можно подсвечивать праздники. В этом случае, можно хранить их в массиве (как и предложил P@Sol).
Если вам не нравится хранение в массиве, то храните в базе данных.

Или вам нужно подсвечивать какую-то одну дату, но каждый день разную. Тогда эту дату можно через параметр в строке запроса передавать.

   
 
 автор: LINKIN   (29.06.2005 в 18:41)   письмо автору
 
   для: glsv (Дизайнер)   (29.06.2005 в 04:51)
 

как на счет:
else if ($monthlz == 8 && $i == 7)  // 07.08
echo "\t\t<td align=\"center\"><font color=\"#800000\">".$i."</font></td>\n";
// ....
else{ 
           echo "\t\t<td align=\"center\">".$i."</td>\n"; 
           }

вместо:

else{ 
           echo "\t\t<td align=\"center\">".$i."</td>\n"; 
           }

.или как-то так:
else if (($monthlz == '8') && ($i == 7))

не работает только.

   
 
 автор: P@Sol   (26.07.2005 в 10:00)   письмо автору
 
   для: LINKIN   (27.06.2005 в 17:54)
 

вот столкнулся с тойже проблемой...даты храню в файле...вывод календаря:
<?
   
<table align=center border=0 width=700 cellspacing=1 cellpadding=1 style=\"font-size: $ac_font_size pt; color: $ac_font_color; \">
    <tr>
     <td colspan=7 style='border:1px #B0B0B0 solid'><div class=zag>
$ac_mon $ac_year</div></td> //июль 2005
    </tr>
    <tr>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Пн</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Вт</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Ср</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Чт</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Пт</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Cб</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>Вс</div></td>"
;
//вывод содержимого
for ($i=0;$i<$ac_now*7;$i++) //$ac_now - кол-во недель
        
{
        if (
$i%7==0) {echo "</tr>\n<tr>";}

        if (
$i%7==|| $i%7==6$style="hol";
        else if (
$i-$ac_1_dow+== $ac_j_dom$style="now"//$ac_1_dow - первый день недели месяца
//$ac_j_dom - текущий день недели
        
else $style="all";

        echo 
"<td id='".$style."tb'><div class=d id='".$style."tt'>";

        if ((
$i<$ac_1_dow-1)||($i>$ac_nod+$ac_1_dow-2)) {echo "&nbsp;";} //$ac_nod -число дней в мес.
        
else
        {
                echo 
$i-$ac_1_dow+2;
                if (
$i%7!=&& $i%7!=6)
                {
                        
$n+=1;// кол-во раб. дней
                        
if ($i-$ac_1_dow+$ac_j_dom$b+=1;//$ac_j_dom - день месяца
                
}
        }

        echo 
"</div></td>";
        }
echo 
"
    </tr>
   </table>

Причем праздничные дни надо учесть и при подсчете раб. дней

   
 
 автор: Loki   (26.07.2005 в 10:34)   письмо автору
 
   для: P@Sol   (26.07.2005 в 10:00)
 

Я бы, наверное, поступил следующим образом:

//создаем массив праздничных дней
$prazdnik[1]=array(1,2,7,13) //праздники для января
...
$prazdnik[12]=array() //праздники для декабря
...
if ($i%7!=5 && $i%7!=6) 
                { 
                       if (!in_array ($prazdnik[$ac_mon], $i)) $n+=1;// если не прадничный, то кол-во раб. дней +1. Где $i - если я правильно понял, дата.
...

   
 
 автор: P@Sol   (26.07.2005 в 12:34)   письмо автору
 
   для: Loki   (26.07.2005 в 10:34)
 

спасибо за идею..вот что получилось
<?
   
<table align=center border=0 width=700 cellspacing=1 cellpadding=1 style=\"font-size: $ac_font_size pt; color: $ac_font_color; \">
    <tr>
     <td colspan=7 style='border:1px #B0B0B0 solid'><div class=zag>
$ac_mon $ac_year</div></td>
    </tr>
    <tr>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#207;&#237;</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#194;&#242;</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#209;&#240;</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#215;&#242;</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#207;&#242;</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#209;&#225;</div></td>
     <td width=100 bgcolor=#DADADA class=head><div class=dn>&#194;&#241;</div></td>"
;

$d holyday(date("n"));             //есть праздники?

//выводим
for ($i=0;$i<$ac_now*7;$i++)
        {
        if (
$i%7==0) {echo "</tr>\n<tr>";}

        if (
$i%7==|| $i%7==6$style="hol";
        else if (
in_array($i-$ac_1_dow+2,$d)) $style="hol";
        else if (
$i-$ac_1_dow+== $ac_j_dom$style="now";
        else 
$style="all";

        echo 
"<td id='".$style."tb'><div class=d id='".$style."tt'>";

        if ((
$i<$ac_1_dow-1)||($i>$ac_nod+$ac_1_dow-2)) {echo "&nbsp;";}
        else
        {
                echo 
$i-$ac_1_dow+2;
                if (
$i%7!=&& $i%7!=&& !in_array($i-$ac_1_dow+2,$d))
                {
                        
$n+=1;
                        if (
$i-$ac_1_dow+$ac_j_dom$b+=1;
                }
        }

        echo 
"</div></td>";
        }
echo 
"
    </tr>
   </table>

сама функция:
<?
function holyday($month_c)   //есть праздники?
{
        
settype($month_c,"integer");

        
$arr file("date.mpd");
        
// &#194; &#246;&#232;&#234;&#235;&#229; &#239;&#240;&#238;&#232;&#231;&#226;&#238;&#228;&#232;&#236; &#240;&#224;&#231;&#225;&#238;&#240; &#234;&#224;&#230;&#228;&#238;&#233; &#241;&#242;&#240;&#238;&#234;&#232;
        
$l=0;
        foreach(
$arr as $line)
        {
                
// &#208;&#224;&#231;&#225;&#232;&#226;&#224;&#229;&#236; &#241;&#242;&#240;&#238;&#234;&#243; &#239;&#238; &#231;&#224;&#239;&#255;&#242;&#238;&#233;
                
$number explode(".",$line);
                if (
$number[1] == $month_c)
                {
                        
$d[$l] = $number[0];
                        
$l++;
                }
        }
        return 
$d;
}

   
 
 автор: P@Sol   (26.07.2005 в 13:16)   письмо автору
 
   для: P@Sol   (26.07.2005 в 12:34)
 

есть такая штука...если в выходной праздник, то понедельник выходной...стоит ли создавать отдельную функцию для расчета этих переносов или более рационально дописывать эти даты?

   
 
 автор: P@Sol   (26.07.2005 в 13:21)   письмо автору
 
   для: P@Sol   (26.07.2005 в 13:16)
 

Сделал такие изменения:
<?
// Файл с праздниками хранит следующее
// 12.6.a
// 13.6.2005


                
if ($number[2] == $year_c || $number[2] == "a"//дата с этим годом? или для всех?
                
{
                        if (
$number[1] == $month_c)
                        {
                                
$d[$l] = $number[0];
                                
$l++;
                        }
                }

   
 
 автор: P@Sol   (26.07.2005 в 13:30)   письмо автору
 
   для: P@Sol   (26.07.2005 в 12:34)
 

если в файле с датами нет даты на текущий месяц, то появляется ошибка

//выводим 
for ($i=0;$i<$ac_now*7;$i++) 
        { 
        if ($i%7==0) {echo "</tr>\n<tr>";} 

        if ($i%7==5 || $i%7==6) $style="hol"; 
        else if (in_array($i-$ac_1_dow+2,$d)) $style="hol";  //тут


чтобы ее избежать, я сделал следующее:

$d = holyday(date("n"));             //есть праздники?
if (!isset($d)) $d=array(32);

но это по-моему не очень правильно, хотя работает:)

   
 
 автор: [CHOL]Scorpion   (26.07.2005 в 12:16)   письмо автору
 
   для: LINKIN   (27.06.2005 в 17:54)
 

Вот полностью готовый календарь. Суть, навигация базы новостей:
Умеет выделять даты в которые есть новости, умеет выделять текущую дату. Генерит список лет в зависимости от даты первой и последней новости. Ещё умеет выделять в выпадающих менюшках просматриваемый месяц и год.

<?php

$clndrDB 
"new";
function 
get_news_dates($sqlprefix,$clndrDB){
         
$sql    "SELECT date FROM ".$sqlprefix.$clndrDB;
         @
$result mysql_query($sql);
         @
$numrow mysql_num_rows($result);

         
$dateArr[0] = "bug defence"// difine one array element for in_array() function had no errors
         
$j 1;
         for (
$i=0$i<$numrow$i++){
              
$data    mysql_fetch_array($result);
              
$date    getdate($data[date]);              
              if (
count($dateArr) ==  || !in_array($date[mday].".".$date[mon].".".$date[year],$dateArr)){
                  
$dateArr[$j] = $date[mday].".".$date[mon].".".$date[year];                  
                  
$j++;
              }
         }
         
         return 
$dateArr;
}

function 
generate_calendar($sqlprefix,$date,$p,$mod,$clndrDB){

if (IsSet(
$date) && !Empty($date)){
    
$date explode(".",$date);
    
$date[day]   = $date[0];
    
$date[month] = $date[1];
    
$date[year]  = $date[2];              
}
$today getdate(time());
if (!IsSet(
$date['year']) || Empty($date['year'])){
    
$date['year'] = $today[year];
}
if (!IsSet(
$date['month']) || Empty($date['month'])){
    
$date['month'] = $today[mon];
}
if (!IsSet(
$date['day']) || Empty($date['day'])){
    
$date['day'] = $today[mday];
}

$timestamp mktime(0,0,0,$date['month'],1,$date['year']);
$first_day getdate($timestamp);
$days['start'] = $first_day[wday];

if (
$days['start'] == 0){ $days['start'] = 7; }

if (
$date['month'] == 2){
    if ((
$date['year'] % 4) == 0){
         
$days['stop'] = 29;
    }
    else{
         
$days['stop'] = 28;
    }
}
else{
    if (
checkdate($date['month'],31,$date['year']) === True){
         
$days['stop'] = 31;
    }
    else{
         
$days['stop'] = 30;
    }
}

$j 1;
$days['temp'] = 1;
$days['index'] = $days['start'];

$dateArr get_news_dates($sqlprefix,$clndrDB);

while (
$days['temp'] <= $days['stop']){
       echo (
"<tr bgcolor=\"#EAEAEA\">");

       while (
$j <= 7){
              if (
$days['temp'] != $date[day]){
                  if (!
in_array($days['temp'].".".$date['month'].".".$date['year'],$dateArr)){
                      echo (
"<td class=\"calendar\">");
                  }
                  else{
                      echo (
"<td bgcolor=\"#D9E6E4\" class=\"calendarNews\">");
                  }
              }
              else{
                  if (
$days['index'] == $j){
                      echo (
"<td bgcolor=\"#FFFFFF\" class=\"calendarNow\"><strong>");
                  }
                  else{
                      echo (
"<td class=\"calendar\">");
                  }
              }

              if (
$days['index'] == $j && $days['temp'] <= $days['stop']){                  
                  if (
$days['temp'] != $date[day] && in_array($days['temp'].".".$date['month'].".".$date['year'],$dateArr)){
                      echo (
"<a href=\"index.php?p=".$p."&mod=".$mod."&date=".$days['temp'].".".$date['month'].".".$date['year']."\" class=\"mnu2\">");
                  }
                  echo 
$days['temp'];                  
                  if (
$days['temp'] != $date[day] && in_array($days['temp'].".".$date['month'].".".$date['year'],$dateArr)){
                      echo (
"</a>");
                  }
                  if (
$days['temp'] != $date[day]){
                      echo (
"</strong>");
                  }
                  
$days['temp']++;
                  
$days['index']++;
              }
              echo (
"</td>");
              
$j++;
       }

       echo (
"</tr>");
       
$j 1;
       
$days['index'] = 1;
}

}

function 
generate_month_list($date){

if (IsSet(
$date) && !Empty($date)){
    
$date explode(".",$date);
    
$date[day]   = $date[0];
    
$date[month] = $date[1];
    
$date[year]  = $date[2];              
}
$today getdate(time());
if (!IsSet(
$date['year']) || Empty($date['year'])){
    
$date['year'] = $today[year];
}
if (!IsSet(
$date['month']) || Empty($date['month'])){
    
$date['month'] = $today[mon];
}
if (!IsSet(
$date['day']) || Empty($date['day'])){
    
$date['day'] = $today[mday];
}

$monthArr = array("none","Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Окрябрь","Ноябрь","Декабрь");

for (
$i=1$i<count($monthArr); $i++){
     echo (
"<option value=\"".$i."\"");
     if (
$date[month] == $i){
         echo (
" selected");
     }
     echo (
">".$monthArr[$i]."</option>");
}

}


function 
actual_years($sqlprefix,$clndrDB,$date){
         
         
//get start year
         
$sql    "SELECT date FROM ".$sqlprefix.$clndrDB." ORDER BY date ASC LIMIT 1";
         
$result mysql_query($sql);
         
$data   mysql_fetch_row($result);
         
$data[0] = getdate($data[0]);
         
$yearArr['stop'] = $data[0][year];
         
         
$strt_limit $numrow 1;
         
$sql    "SELECT date FROM ".$sqlprefix.$clndrDB." ORDER BY date DESC LIMIT 1";
         
$result mysql_query($sql);
         
$data   mysql_fetch_row($result);
         
$data[0] = getdate($data[0]);
         
$yearArr['start'] = $data[0][year];     

         if (IsSet(
$date) && !Empty($date)){
             
$date explode(".",$date);
             
$date[day]   = $date[0];
             
$date[month] = $date[1];
             
$date[year]  = $date[2];              
         }
         
$today getdate(time());
         if (!IsSet(
$date['year']) || Empty($date['year'])){
             
$date['year'] = $today[year];
         }
         if (!IsSet(
$date['month']) || Empty($date['month'])){
             
$date['month'] = $today[mon];
         }
         if (!IsSet(
$date['day']) || Empty($date['day'])){
              
$date['day'] = $today[mday];
         }
         
        for (
$yearArr['start']; $yearArr['start']>=$yearArr['stop']; $yearArr['start']--){             
             echo (
"<option value=\"".$yearArr['start']."\"");
             if (
$yearArr['start'] == $date[year]){
                 echo (
" selected");
             }
             echo (
">".$yearArr['start']."</option>");
        }
}


?>


<form name="clndr" method="post" action="index.php?p=<? echo $p?>&mod=<? echo $mod?>">
<script>
        function select_date() {
                   document.clndr.date.value='1.'+document.clndr.m.value+'.'+document.clndr.y.value;
                 document.clndr.submit();
        }
</script>
<table width="100%" border="0" cellpadding="1" cellspacing="1" bgcolor="#CCCCCC">
              <tr> 
                <td bgcolor="#FFFFFF">
      <table width="100%" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#FFFFFF">
        <tr bgcolor="#CCCCCC"> 
          <td height="31" colspan="7" align="center" background="image/calendar/top.gif" class="calendarTop">
            <input type="hidden" name="date">
            <select name="m" class="calendar">
             <? generate_month_list($date); ?> 
            </select>
            <select name="y" class="calendar">
            <? actual_years($sqlprefix,$clndrDB,$date); ?>
            </select>
            <img src="image/calendar/go.gif" alt="перейти" width="65" height="20" hspace="2" border="0" align="absmiddle" onClick="select_date();">
          </td>
        </tr>
        <!-- DAYS ACRONIMS -->
        <tr bgcolor="#E0E0D1"> 
          <td class="calendar">Пн</td>
          <td class="calendar">Вт</td>
          <td class="calendar">Ср</td>
          <td class="calendar">Чт</td>
          <td class="calendar">Пт</td>
          <td class="calendar">Сб</td>
          <td class="calendarHoly"><strong>Вс</strong></td>
        </tr>
        <!-- DAYS ACRONIMS END -->


        <? generate_calendar($sqlprefix,$date,$p,$mod,$clndrDB); ?>


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


// на написание ушло 20 минут, на отладку 2 часа

   
Rambler's Top100
вверх

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