Некоторые проблемы с основным сценарием PHP календаря - PullRequest
0 голосов
/ 19 марта 2012


У меня есть этот простой шаблон календаря PHP (начинается с понедельника, а не воскресенья, так как я итальянский)

<?php
$date = strtotime("2011-05-19");
$monthNames = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
$cMonth = date("n", $date);
$cYear = date("Y", $date);
?>

    <table border="1" cellpadding="4" cellspacing="0">
      <caption>
      <?php echo $monthNames[$cMonth-1].' '.$cYear; ?>
      </caption>
      <tr>
        <th>l</th>
        <th>m</th>
        <th>m</th>
        <th>g</th>
        <th>v</th>
        <th>s</th>
        <th>d</th>
      </tr>
      <?php 
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate($timestamp);
$startday = $thismonth['wday']-1;
for ($i=0; $i<($maxday+$startday); $i++) {
    if(($i % 7) == 0 ) { ?>
      <tr>
        <?php } ?>
        <?php   if($i < $startday) { ?>
        <td>&nbsp;</td>
        <?php } else { ?>
        <td align='center' valign='middle' height='20px'><?php echo ($i - $startday + 1); ?></td>
        <?php } ?>
        <?php   if(($i % 7) == 6 ) { ?>
      </tr>
      <?php } ?>
      <?php }
?>
    </table>

Несмотря на этот "код спагетти", он прост и ... почти работает
У меня только две проблемы (пожалуйста, измените значение $ date и посмотрите сами):

  1. если последний день месяца НЕ является последним днем ​​недели, в конце календаря отсутствуют некоторые ячейки таблицы
  2. некоторые месяцы не начинаются с 1 (т. Е. Попробуйте с $ date = strtotime ("2011-05-15");)

Любая помощь, пожалуйста? Большое спасибо заранее

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Лично, чтобы не изобретать велосипед, я бы использовал плагин для локализованного календаря, такой как jQuery UI Datepicker .Затем отобразить календарь на итальянском языке так же просто, как:

$("#calendarDiv").datepicker($.datepicker.regional["it"]);
$("#calendarDiv").datepicker("setDate", "19/05/2011");

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

Теперь, признав, что использование внешних плагинов не всегда является жизнеспособным вариантом, вы можете расширить PHP, чтобы сделать календарь таким образом (этот блок будет появляться после строки заголовка, которую выв настоящее время используется для названий недель):

$timestamp = mktime(0,0,0,$cMonth,0,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate($timestamp);
$startday = $thismonth['wday'];

for ($i = 0; $i <= ($maxday + $startday); $i++)
{
    if(($i % 7) == 0 )
        echo "<tr>";

    if($i < $startday)
        echo "<td>&nbsp;</td>";
    else
        echo "<td align='center' valign='middle' height='20px'>" . 
            ($i - $startday + 1) . "</td>";

    if(($i == ($maxday + $startday)) && (($i % 7) > 0))
    {
        $spareDays = (7 - ($i % 7)) - 1;
        for($i = 0; $i < $spareDays; $i++)
            echo "<td>&nbsp;</td>";
        echo "</tr>";
        break;
    }
    else if(($i % 7) == 6 )
        echo "</tr>";
}

Я сделал несколько корректировок в вашем примере, чтобы исправить начальный и конечный день, чтобы представление календаря выглядело так же, как в пользовательском интерфейсе jQuery.Datepicker, хотя в зависимости от того, как ваш экземпляр PHP локализован на вашем сервере, их, возможно, потребуется откорректировать обратно (см. Пример ответа dmikester1).Моя реализация довольно проста, но я хотел, чтобы она была семантически похожа на ваш оригинальный пример.

0 голосов
/ 19 марта 2012

Измените эту строку, удалив -1, похоже, это решает проблему # 2:

$startday = $thismonth['wday']-1;

ОК, исправление для # 1 не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...