На что указывает ссылка href в html-коде, который также использует php (календарь php)?

#php #html #web #calendar

#php #HTML #веб #Календарь

Вопрос:

я пытаюсь адаптировать html-код, который отображает календарь без событий, к коду, который отображает события в календаре. Я понимаю, что код создает массив $ weeks, который позже в коде используется для рисования таблицы. Календарь переключает месяцы назад и вперед, если нажать < или > на экране. Итак, я думаю, что массив $weeks восстанавливается после нажатия < или>, и код повторно рисует календарь. Где href в a-теге в коде указывает на одно нажатие < или > . Переходит ли код на строку $prev ($next) при нажатии < (>)? Код взят со следующего веб-сайта https://codingwithsara.com/how-to-code-calendar-in-php/#Video . Я также опубликовал код ниже.

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

Спасибо.

Argyn

 <?php
// Set your timezone
date_default_timezone_set('Asia/Tokyo');

// Get prev amp; next month
if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
} else {
    // This month
    $ym = date('Y-m');
}

// Check format
$timestamp = strtotime($ym . '-01');
if ($timestamp === false) {
    $ym = date('Y-m');
    $timestamp = strtotime($ym . '-01');
}

// Today
$today = date('Y-m-j', time());

// For H3 title
$html_title = date('Y / m', $timestamp);

// Create prev amp; next month link     mktime(hour,minute,second,month,day,year)
$prev = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)-1, 1, date('Y', $timestamp)));
$next = date('Y-m', mktime(0, 0, 0, date('m', $timestamp) 1, 1, date('Y', $timestamp)));
// You can also use strtotime!
// $prev = date('Y-m', strtotime('-1 month', $timestamp));
// $next = date('Y-m', strtotime(' 1 month', $timestamp));

// Number of days in the month
$day_count = date('t', $timestamp);
 
// 0:Sun 1:Mon 2:Tue ...
$str = date('w', mktime(0, 0, 0, date('m', $timestamp), 1, date('Y', $timestamp)));
//$str = date('w', $timestamp);


// Create Calendar!!
$weeks = array();
$week = '';

// Add empty cell
$week .= str_repeat('<td></td>', $str);

for ( $day = 1; $day <= $day_count; $day  , $str  ) {
     
    $date = $ym . '-' . $day;
     
    if ($today == $date) {
        $week .= '<td class="today">' . $day;
    } else {
        $week .= '<td>' . $day;
    }
    $week .= '</td>';
     
    // End of the week OR End of the month
    if ($str % 7 == 6 || $day == $day_count) {

        if ($day == $day_count) {
            // Add empty cell
            $week .= str_repeat('<td></td>', 6 - ($str % 7));
        }

        $weeks[] = '<tr>' . $week . '</tr>';

        // Prepare for new week
        $week = '';
    }

}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>PHP Calendar</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css?family=Noto Sans" rel="stylesheet">
    <style>
        .container {
            font-family: 'Noto Sans', sans-serif;
            margin-top: 80px;
        }
        h3 {
            margin-bottom: 30px;
        }
        th {
            height: 30px;
            text-align: center;
        }
        td {
            height: 100px;
        }
        .today {
            background: orange;
        }
        th:nth-of-type(1), td:nth-of-type(1) {
            color: red;
        }
        th:nth-of-type(7), td:nth-of-type(7) {
            color: blue;
        }
    </style>
</head>
<body>
    <div class="container">
        <h3><a href="?ym=<?php echo $prev; ?>">amp;<</a> <?php echo $html_title; ?> <a href="?ym=<?php echo $next; ?>">amp;></a></h3>
        <table class="table table-bordered">
            <tr>
                <th>S</th>
                <th>M</th>
                <th>T</th>
                <th>W</th>
                <th>T</th>
                <th>F</th>
                <th>S</th>
            </tr>
            <?php
                foreach ($weeks as $week) {
                    echo $week;
                }
            ?>
        </table>
    </div>
</body>
</html>
  

Комментарии:

1. Не уверен, что я понимаю, в чем заключается ваш вопрос. Если вы просто хотите знать, на что указывают ссылки в <h3> ссылке, вы можете посмотреть на атрибут href: они указывают на текущую страницу со ym значением параметра запроса $prev , равным или $next . Это то, что проверяет ваш код в строке 6, чтобы определить, какой месяц отображать.

2. итак, prev (который <) указывает на эту строку в коде $prev = date(‘Y-m’, mktime(0, 0, 0, date(‘m’, $timestamp) -1, 1, date(‘Y’, $timestamp))); Что такое»параметр запроса ym» — я искал использование a-tag в html и не нашел, что означает вопросительный знак перед именем. Я вижу в коде php переменную $ym, но не могу подключить ее к ?ym. Если у вас есть ссылка, как работают эти параметры запроса, это было бы полезно.

3. Параметры запроса — это параметры, передаваемые на веб-страницу через URL. Например: http://example.com/test.php?something=thisamp;somethingElse=that . ? Отделяет URL-адрес от параметров, amp; отделяет один параметр от другого. В PHP эти параметры запроса можно прочитать с помощью $_GET . В этом примере $_GET['something'] будет «это» и $_GET['somethingElse'] будет «то». В вашем скрипте $prev указан предыдущий месяц (например, «2020-10»), поэтому < ссылка загружает текущий URL, ?ym=2020-10 и ваш скрипт проверяет это в строке 6.

4. спасибо, Рикденхаан, работаю над вашим комментарием

Ответ №1:

Первый:

 if (isset($_GET['ym'])) {
    $ym = $_GET['ym'];
} else {
    // This month
    $ym = date('Y-m');
}    
$prev = date('Y-m', mktime(0, 0, 0, date('m', $timestamp)-1, 1, date('Y', $timestamp)));
    $next = date('Y-m', mktime(0, 0, 0, date('m', $timestamp) 1, 1, date('Y', $timestamp)));
  

Вы создаете дату Ym, но ожидаете формат Ym.

Во-вторых: вы создаете действительно сложный способ вычисления для ваших месячных расчетов. Вы должны посмотреть на класс datetime, класс dateinterval и класс dateperiod

Вы можете создать простой обзор:

     <?php
if(isset($_GET['ym'])){
    $start  = DateTime::createFromFormat('Y-m-d',$date.'-1');
    }else{
    $start  = new DateTime();
     $start->setDate($start->format('Y'),$start->format('m'),1);
    }
    $start->setTime(00, 00);
    $end = clone $start;
    $end->setDate($end->format('Y'),$end->format('m'),$end->format('t'))->setTime(23, 59);
    $prev = clone $start;
$prev->modify("-1 month");
$next = clone $end;
$next->modify(" 1 day");
    $interval = DateInterval::createFromDateString('1 day');
    
    $period     = new DatePeriod($start,$interval,$end);
?>
  

Тогда вы можете использовать:

 <a href="?ym=<?php echo $prev->format('Y-m');?>">amp;<</a>
//AND
 <a href="?ym=<?php echo $next->format('Y-m');?>">amp;></a>
  

И для цикла:

     <?php
foreach($period as $day){
    echo $day->format('Y-m-d');
    }
?>
  

Пример кода