Блог PHP, нужно сделать красивый раздел для архивов - PullRequest
2 голосов
/ 30 июня 2009

Так! По сути, у меня есть база данных с множеством постов в блоге, все они отсортированы по метке времени UNIX, и мне нужен способ заставить этот код выплевывать заголовки, когда это уместно, так, чтобы он выводил что-то вроде этого:

2008

Ноябрь

Название 1 - Дата идет здесь
Название 2 - Дата идет сюда

Декабрь

Название 3 - Дата здесь

2009

Январь

Заголовок 4 - Дата идет здесь

1019 * прочее *

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

[код]

<?php   
   if ($db = new PDO('sqlite:./db/blog.sqlite3')) {
         $stmt = $db->prepare("SELECT * FROM news ORDER BY date DESC");
         if ($stmt->execute()) {
               while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
                     $current_year = date("Y", $row[1]);
                     $current_month = date("m", $row[1]);
                     if ($current_year > $last_year) {
                           echo "<h1>" . $current_year . "</h1>";
                           $last_year = $current_year;
                     }
                     echo "<tr>";
                     echo "<td align='left'><a href='view_post.php?post_id=". $row[1] ."'>" . $row['0'] . " - " . date("Y-m-d, H:i:s", $row[1]) . "</a></td>";
                     echo "</tr>";
               }
         }
   } else {
         die($sqliteerror);
   }
?>

[/ код]

Ответы [ 3 ]

2 голосов
/ 30 июня 2009

С метками времени Unix вы можете сделать что-то вроде (очевидно, псевдокод)

prev_month = null
prev_year = null
foreach results as r
    new_month = date('F', r[timestamp]);
    new_year = date('Y', r[timestamp]);
    if(prev_month != new_month)
        //display month
    /if

    if(prev_year != new_year)
        //display year
    /if

    // display other info

    prev_month = new_month
    prev_year = new_year
/foreach
0 голосов
/ 30 июня 2009
<?php   
   if ($db = new PDO('sqlite:./db/blog.sqlite3')) {
         $stmt = $db->prepare("SELECT * FROM news ORDER BY date DESC");
         if ($stmt->execute()) {
               while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
                     $current_year = date("Y", $row[1]);
                     $current_month = date("n", $row[1]);   # n instead of m
                     if ($current_year > $last_year) {
                           echo "<h1>" . $current_year . "</h1>";
                           echo "<h2>" . $current_month . "</h2>";
                           $last_year = $current_year;
                           $last_month = $current_month;
                     }
                     elseif ($current_month > $last_month) {
                           echo "<h2>" . $current_month . "</h2>";
                           $last_month = $current_month;
                     }
                     echo "<tr>";
                     echo "<td align='left'><a href='view_post.php?post_id=". $row[1] ."'>" . $row['0'] . " - " . date("Y-m-d, H:i:s", $row[1]) . "</a></td>";
                     echo "</tr>";
               }
         }
   } else {
         die($sqliteerror);
   }
?>

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

0 голосов
/ 30 июня 2009

Я бы хотел сделать это в два этапа, отделяя выборку базы данных от логики display / html, например:

<?php
//snip

//make big array of archive
$archive = array();
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    $year = date("Y", $row[1]);
    $month = date("m", $row[1]);

    if (!isset($archive[$year])) {
        $archive[$year] = array();
    }

    if (!isset($archive[$year][$month])) {
        $archive[$year][$month] = array();
    }

    $archive[$year][$month][] = $row;
}
//snip

//loop over array and display items 
?>

<?php foreach ($achive as $year => $months): ?>
    <h1><?php echo $year; ?></h1>

    <?php foreach ($months as $month => $posts): ?>
         <h2><?php echo $month; ?></h2>
         <ul>
         <?php foreach ($posts as $post): ?>
             <li><?php echo $post[0]; ?> etc...</li>
         <?php endforeach; ?>
         </ul>
    <?php endforeach; ?>
<?php endforeach; ?>

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

...