Weblog v PHP – archivní stránky

10. prosince 2002

Již víte, jak zobrazit články na úvodní stránce. Nebude tedy žádný problém vytvořit podle stejné šablony i všechny archivní stránky jako stránky statické. Ostatně, sami se můžete přesvědčit ve vzorové implementaci popisovaného weblogu.

Generování archivních stránek funguje na stejném principu jako zobrazování článků na úvodní stránce weblogu, což bylo vysvětleno v předchozím článku. V šabloně (page.php) znovu nahradíme značky $nazev$ příslušnými informacemi. Funkce pro generování archivních stránek máme v souboru archive.php. V rámci těchto funkcí jsou pak několikrát použity funkce Article(), First_Day() a Archive_Links() také popsané v předchozím článku.

Archivní stránkou se rozumí stránka, na které najdete všechny články vydané v tom kterém týdnu. V jediném parametru funkce Create_Archive() je předán datum prvního dne v týdnu, pro který chceme vytvořit archivní stránku. Tento parametr využijeme především v případech, kdy bude autor upravovat nebo mazat nějaký starší článek. V takovém případě se pochopitelně musí aktualizovat i příslušná archivní stránka. Ve většině případů však budeme vytvářet archivní stránku pro aktuální týden. Proměnná $today obsahuje aktuální datum jako počet sekund od 1. 1. 1970. V proměnné $page se nachází šablona.

Protože nemá smysl vytvářet archivní stránku pro týden, který ještě nezačal, musíme přidat krátkou podmínku. Následně z data prvního a posledního dne v týdnu vytvoříme nadpis a vybereme články vydané v daném týdnu. Nesmíme zapomenout na podmínku publish_date <= $today, protože v archivu se nesmí objevit článek, který ještě nebyl vydán. Pokud se podařilo vybrat nějaké články, můžeme se pomocí funkce Article(), popsané v předchozím článku, pustit do jejich zpracování. Následně nahradíme značky v šabloně příslušnými informacemi. Jako titulek stránky použijeme datum od – do, články máme v proměnné $article a funkce Archive_Links() vrací odkazy na archivní stránky. Výslednou stránku zapíšeme do souboru Y_m_d_Y_m_d.html (např. 2002_10_21_2002_10_27.html). K ošetření chyb, které by mohly nastat při vytváření souboru, je použita funkce Weblog_Error() popsaná v prvním článku o Weblogu v PHP.

// vytvori archivni stranku pro dany tyden
function Create_Archive($archive_date_from) {
  global $page, $today;
  
  // je datum predany v parametru mensi nez datum prvniho dne v aktualnim tydnu?
  if($archive_date_from <= First_Day()) {
    $archive_date_to = $archive_date_from + 600000;  // datum posledniho dne v tydnu
    $from_to = Date(„j. n. Y“, $archive_date_from) . Date(“ – j. n. Y“, $archive_date_to); // od – do
    $article = ‚<h2 class=“archive“>‘ . $from_to . ‚</h2>‘;  // nadpis od – do
  
    // vybere clanky vydane v danem tydnu
    $query = MySQL_Query(„SELECT article.id AS article_id, title, message, author, publish_date, archive_date, name, email FROM article, author WHERE author = author.id AND publish_date >= $archive_date_from AND publish_date <= $archive_date_to AND publish_date <= $today ORDER BY publish_date DESC“) or Weblog_Error(2);
    if(MySQL_Num_Rows($query)!=0) {
      while($result = MySQL_Fetch_Array($query)) $article .= Article($result); // pomoci funkce Article() se zpracuji vybrane clanky
    
      // vsechny znacky ze souboru page.php se nahradi prislusnymi informacemi
      $output = Str_Replace(‚$WEBLOG_TITLE$‘, ‚Archiv – ‚ . $from_to, $page);
      $output = Str_Replace(‚$WEBLOG_ARTICLES$‘, $article, $output);
      $output = Str_Replace(‚$WEBLOG_ARCHIVE$‘, Archive_Links(), $output);
      
      // vytvori archivni stranku
      $fp = @FOpen(‚../‘ . Date(„Y_m_d“, $archive_date_from) . Date(„_Y_m_d“, $archive_date_to) . ‚.html‘, ‚w‘) or Weblog_Error(3);
      FWrite($fp, $output);
      FClose($fp);
    }
  }
}
$today = Time();
require „../page.php“;

Funkce Create_Archive() má jeden drobný nedostatek, výsledná archivní stránka totiž obsahuje odkazy jen na starší archivní stránky. Jakmile vzniknou nové archivní stránky, odkazy na ně budou ve starších stránkách chybět. Drobnou úpravou funkce Create_Archive() můžeme tento problém snadno vyřešit. Vytvoříme funkci Create_Complete_Archive(), která naráz vygeneruje všechny archivní stránky. Z tabulky article vybereme unikátní archivní data (archive_date), která však nesmí být větší než datum prvního dne v aktuálním týdnu, a pro každé datum vytvoříme archivní stránku.

// vytvori kompletni archiv
function Create_Complete_Archive() {
  global $page, $today;
  
  $first_day_of_week = First_Day();  // datum prvniho dne v aktualnim tydnu
  $query = @MySQL_Query(„SELECT DISTINCT archive_date FROM article WHERE archive_date <= $first_day_of_week ORDER BY archive_date“) or Weblog_Error(2);  // vybere unikatni data a seradi vzestupne
  while($result = MySQL_Fetch_Array($query)) {
    $archive_date_from = $result[‚archive_date‘];  // datum prvniho dne v tydnu
    $archive_date_to = $result[‚archive_date‘]+600000; // datum posledniho dne v tydnu
    $from_to = Date(„j. n. Y“, $archive_date_from) . Date(“ – j. n. Y“, $archive_date_to);  // od – do
    
    $article = ‚<h2 class=“archive“>‘ . $from_to . ‚</h2>‘; // nadpis od – do
    // vybere clanky vydane v danem tydnu
    $query2 = MySQL_Query(„SELECT article.id AS article_id, title, message, author, publish_date, archive_date, name, email FROM article, author WHERE author = author.id AND publish_date >= $archive_date_from AND publish_date <= $archive_date_to AND publish_date <= $today ORDER BY publish_date DESC“) or Weblog_Error(2);
    while($result2 = MySQL_Fetch_Array($query2)) $article .= Article($result2);  // pomoci funkce Article() se zpracuji vybrane clanky
    // vsechny znacky ze souboru page.php se nahradi prislusnymi informacemi
    $output = Str_Replace(‚$WEBLOG_TITLE$‘, ‚Archiv – ‚ . $from_to, $page);
    $output = Str_Replace(‚$WEBLOG_ARTICLES$‘, $article, $output);
    $output = Str_Replace(‚$WEBLOG_ARCHIVE$‘, Archive_Links(), $output);
    
    // vytvori archivni stranku
    $fp = @FOpen(‚../‘ . Date(„Y_m_d“, $archive_date_from) . Date(„_Y_m_d“, $archive_date_to) . ‚.html‘, ‚w‘) or Weblog_Error(3);
    FWrite($fp, $output);
    FClose($fp);
  }
}

makearchive.php

Na závěr zbývá vyřešit otázku, jakým způsobem naložit s funkcemi Create_Archive() a Create_Complete_Archive(). Pokud vám nevadí větší zatížení serveru a delší čas potřebný na provedení skriptu, můžete při veškerých změnách (přidání, smazání, úprava článku) použít funkci Create_Complete_Archive(). V opačném případě použijte funkci Create_Archive(), která vygeneruje archivní stránku jen pro daný týden, vytvořte soubor makearchive.php a spouštějte ho pravidelně každý týden či den.

// zabrani cashovani
Header(„Pragma: No-cache“);
Header(„Cache-Control: No-cache, Must-revalidate“);
Header(„Expires: „.GMDate(„D, d M Y H:i:s“).“ GMT“);
require „../db.php“;  // pripoji k databazi
require „../function.php“;  // nacte soubor s dulezitymi funkcemi
require „archive.php“;  // nacte soubor s funkcemi pro vytvareni archivu
Create_Index(„static“);  // vytvori uvodni stranku index.html
Create_Complete_Archive(); // vytvori kompletni archiv
MySQL_Close();

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Další článek penize.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *