Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Календарь, Реализация 
:(
    Опции темы
CyClon
Дата 3.6.2007, 19:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Захотелось написать календарь на PHP, задача не из самых простых, ибо нужно еще и хороший код.

В общем, давайте обмениваться идеями с реализацией самого простого календарика на PHP (т.е. без HTML, важен только PHP-код).

Вот что я наварганил:

Код
<?php

$time = time(); // $time = mktime(0, 0, 0, 2, 3, 2030);

$days = (date('w', $time) > 0) ? 7 - date('w', $time) + date('j', $time) % 7 : date('j', $time) % 7;
$print = ($days != 7) ? ($days < 7) ? date('t', $time - 2419200) - $days : date('t', $time - 2419200) - $days % 7 : 1;

echo date('d/m/Y  H:i:s', $time) . PHP_EOL . PHP_EOL;
echo 'ПН ВТ СР ЧТ ПТ СБ ВС' . PHP_EOL;

for ($week = 1; $week <= 6; $week++) {
    for ($day = 1; $day <= 7; $day++) {
        printf('%02d ', $print);
        if (($week == 1 && $print == date('t', $time - 2419200)) || ($week > 4 && $print == date('t', $time))) {
            $print = 0;
        }
        $print++;
    }
    if ($week > 3 && ($print < 15 || $print == date('t', $time) + 1)) {
        break;
    }
    echo PHP_EOL;
}

?>


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

Добавлено через 1 минуту и 9 секунд
Результат работы моего скрипта:

Код
03/06/2007  20:41:38

ПН ВТ СР ЧТ ПТ СБ ВС
28 29 30 31 01 02 03 
04 05 06 07 08 09 10 
11 12 13 14 15 16 17 
18 19 20 21 22 23 24 
25 26 27 28 29 30 01 



--------------------
user posted image
PM   Вверх
xolod
Дата 3.6.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.5.2005
Где: Когда: Что:

Репутация: 4
Всего: 13



Функция:
Код

function buildCalendar($year, $month) {
 $weekDay = JDDayOfWeek(GregorianToJD($month, 1, $year), 0);
 if ($weekDay == 0) $weekDay = 7;
 $newDay = -($weekDay - 2);
 $calendar = array();
 for ($y = 0; $y < 6; $y++) {
   $row = array();
   $testEmpty = false;
   for ($x = 0; $x < 7; $x++, $newDay++) {
     if (checkdate($month, $newDay, $year)) {
       $row[] = $newDay;
       $testEmpty = true;
     } else {
       $row[] = '';
     }
   }
   if (!$testEmpty) break;
   $calendar[] = $row;
 }
 return $calendar;
}


Вывод, на текущий месяц-год (вы как хотите, а мне удобней html):
Код

$dateNow = getdate();
$calendarNow = buildCalendar($dateNow['year'], $dateNow['mon'] - 1);
echo('<table><thead><tr><td>пн</td><td>вт</td><td>ср</td><td>чт</td><td>пт</td><td>сб</td><td>вс</td></tr></thead><tbody>');
foreach($calendarNow as $rowNow) {echo('<tr>'); foreach($rowNow as $index => $day) {echo($day ? '<td align="center">'.$day.'</td>' : '<td>&nbsp;</td>');} echo('</tr>');}
echo('</tbody></table>');
break;


Из нашей старой книги. В свое время ломал голову куда дольше. Хотя в целом задача очень простая.
PM MAIL   Вверх
CyClon
Дата 3.6.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Неплохая реализация, только не выводятся числа предыдущего месяца, не очень красиво вместо них видеть квадраты пустые smile


--------------------
user posted image
PM   Вверх
mikla
Дата 4.6.2007, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 3.12.2006
Где: Витебск

Репутация: нет
Всего: нет



немного криво, но тож вариант )
Код

<?

function drawCalendar ( $mm , $yy )
{
    $days = array("","Пн","Вт","Ср","Чт","Пт","Сб","Вс");    
    $nDays = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
    $nDays[2] = ($yy%4==0) ? 29 : 28;    
    $a = intval ((14-$mm) / 12);
    $y = intval ($yy - $a);
    $m = intval ($mm + 12*$a - 2);
    $dayNumber = (7000 + (1 + intval($y) + intval($y/4) - intval($y/100) + intval($y/400) + intval((31*$m)/12 ))) % 7;
    $cDoWeek = ($dayNumber!=0) ? $dayNumber : 7;        
?>
    
    <table border="1" align = "center">
    <tr>
    
<?
    for ($i=1;$i<=7;$i++)
    {
        if (($i>=1)&&($i<=5)) echo "<td id = \"weekdays\" > {$days[$i]} </td> "; else echo "<td id = \"holydays\" > {$days[$i]} </td> ";
        
    }
?> 
    </tr><tr> 
<?    
    for ($i=1; $i<$cDoWeek; $i++) echo "<td id = \"empty\">&nbsp</td>";    
?>

<?    
    $i=1;    
    while ($i<=$nDays[$mm])
    {        
        $id = (($cDoWeek<=5)&&($cDoWeek>=1)) ? 'weekdays' : 'holydays'; // определяем стиль ячейки.        
        echo "<td id = \"{$id}\"><a href = '#' >{$i} </a></td>"; 
        $cDoWeek++;
        $i++;
        if ($cDoWeek>7)    
        {    
            $cDoWeek=1; 
            echo "</tr><tr>"; 
        }
    }
    
    while ($cDoWeek<=7) 
    {
        echo "<td id = \"empty\">&nbsp</td>";    
        $cDoWeek++;
    }    
    echo "</tr></table>";
}
drawCalendar(2, 2007);
?>



--------------------
PM MAIL ICQ Skype   Вверх
pento
Дата 4.6.2007, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.1.2007
Где: Россия

Репутация: нет
Всего: 4



В книге Котерова PHP5 в  подлиннике описана процедура создания календаря
PM MAIL   Вверх
CyClon
Дата 4.6.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Знаем мы эти процедуры %))) Нужен самый короткий, быстрый и красивый код smile


--------------------
user posted image
PM   Вверх
CyClon
Дата 4.6.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4



Немного переделал, теперь это функция и она универсальна smile)) Т.е. можно выводить несколько календарей.

Код
<?php

function buildCalendar($year, $month)
{
    $time = mktime(0, 0, 0, $month, 1, $year);
    $days = (date('w', $time) > 0) ? 7 - date('w', $time) + date('j', $time) % 7 : date('j', $time) % 7;
    $print = ($days != 7) ? ($days < 7) ? date('t', $time - 2419200) - $days : date('t', $time - 2419200) - $days % 7 : 1;

    for ($week = 0; $week < 6; $week++) {
        for ($day = 0; $day < 7; $day++) {
            $calendar[$week][] = $print;
            if (($week == 0 && $print == date('t', $time - 2419200)) || ($week > 0 && $print == date('t', $time))) {
                $print = 0;
            }
            $print++;
        }
        if ($week > 2 && ($print < 14 || $print == date('t', $time) + 1)) {
            break;
        }
    }

    return $calendar;
}

$calendar = buildCalendar(2007, 6);

echo '<pre>' . PHP_EOL;
echo 'ПН ВТ СР ЧТ ПТ СБ ВС' . PHP_EOL;

foreach ($calendar as $week) {
    foreach ($week as $day) {
        printf('%02d ', $day);
    }
    echo PHP_EOL;
}

?>


Это сообщение отредактировал(а) CyClon - 4.6.2007, 13:06


--------------------
user posted image
PM   Вверх
aktuba
Дата 5.6.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: нет
Всего: 38



CyClon, а можно сделать с подсветкой? Т.е., например, дни прошлого и следующего месяца серым, текущего месяца, например, синим, а праздники, которые можно указать в базе или в текстовом файле - красным?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.