Weblog v PHP – databázové tabulky a úvodní stránka

4. prosince 2002

Po nutném úvodu v podobě předchozího článku si povíme, jak vypadají databázové tabulky a jakým způsobem vygenerovat úvodní stránku weblogu, včetně odkazů na jednotlivé archivní stránky.

Tabulka article

Tabulka article je první z celkem dvou databázových tabulek, které budeme používat. Osahuje informace o všech vydaných článcích a vytvořit ji můžeme pomocí tohoto SQL dotazu:

CREATE TABLE article (
  id int NOT NULL auto_increment,
  title varchar(150),
  message text,
  publish_date int,
  author int,
  archive_date int,
  PRIMARY KEY (id)
);

  • id – unikátní označení každého článku (primární klíč)
  • title – nadpis článku
  • message – text článku, zprávy
  • publish_date – datum vydání jako počet sekund od 1.1. 1970
  • author – autor článku (obsahuje primární klíč z tabulky author)
  • archive_date – datum prvního dne v týdnu, ve kterém byl článek vydán; opět jako počet sekund od 1.1. 1970 (použije se při vytváření archivu)

Tabulka author

Tabulka author obsahuje informace o autorech píšících do weblogu. Vytvoří ji následující SQL dotaz:

CREATE TABLE author (
  id int NOT NULL auto_increment,
  login varchar(10),
  password varchar(50),
  name varchar(30),
  email varchar(30),
  user_type char(1),
  PRIMARY KEY (id)
);

  • id – unikátní označení každého autora (primární klíč)
  • login – uživatelské jméno
  • password – heslo zašifrované funkcí MD5()
  • name – jméno autora
  • email – email autora
  • user_type – druh autora (A = administrátor, U = autor), administrátor má práva ke všem článkům, autor pouze k vlastním článkům

Úvodní stránka weblogu

Aktuální články můžeme zobrazovat buď na dynamicky generované stránce (index.php) nebo na pravidelně generované statické stránce (index.html). Metodu dynamického generování úvodní stránky zřejmě nepoužijete příliš často, mnohem lepší je využít pravidelně generovanou statickou stránku index.html, která zatíží server mnohem méně. Začněme však se zobrazením článků na dynamicky generované stránce. Hned na začátku souboru index.php zabráníme kešování, připojíme se k databázi a načteme soubor function.php, obsahující všechny potřebné funkce. Načteme také šablonu page.php, která byla popsána v minulém článku.

// 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 „page.php“; // sablona
echo Create_Index(„dynamic“); // zobrazi uvodni stranku
MySQL_Close();

Funkce Create_Index($type) definovaná v souboru function.php slouží k zobrazení úvodní stránky weblogu. Použijeme ji však i pro vygenerování statické stránky index.html. Právě pomocí parametru $type rozlišíme, zda se články zobrazí na dynamicky generované stránce ($type = "dynamic"), nebo se vygeneruje statická stránka index.html ($type = "static").

Z databáze vybereme nejprve 20 nejnovějších článků, jejichž datum vydání není větší než aktuální datum, které vrací funkce Time(). Při spojování tabulek article a author využíváme toho, že položka id v tabulce author je primárním klíčem, zatímco položka author v tabulce article klíčem cizím. Následně pomocí funkce MySQL_Result(), kde první parametr označuje výsledek, druhý číslo záznamu a třetí název položky, přičemž záznamy jsou číslovány od nuly, zjistíme data vydání prvního a posledního článku a použijeme je k vytvoření nadpisu informujícího o tom, z jakého období je oněch 20 článků. Poté pomocí funkce MySQL_Data_Seek() přesuneme ukazatel výsledku na začátek, vybrané články zpracujeme funkcí Article() a uložíme je do proměnné $article.

Šablonu (page.php) máme načtenou, takže stačí značky $nazev$ nahradit příslušnými informacemi. Značku $WEBLOG_TITLE$ nahradíme nadpisem Weblog, značku $WEBLOG_ARTICLES$ dvaceti aktuálními články ($article) a $WEBLOG_ARCHIVE$ odkazy na archivní stránky (Archive_Links()). Funkce Article() a Archive_Links() budou popsány za malý okamžik. Na závěr se na základě parametru $type buď vygeneruje statická stránka index.html, nebo je celá stránka použita pro dynamicky generovanou stránku. K ošetření chyb, které by mohly nastat při vytváření souboru index.html, je použita funkce Weblog_Error() popsaná v minulém článku.

// vytvori uvodni stranku
function Create_Index($type) {
  global $page;
  $today = Time(); // aktualni cas
  
  // vybere 20 nejnovejsich clanku
  $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 <= $today ORDER BY publish_date DESC LIMIT 0,20“) or Weblog_Error(2);
  if(MySQL_Num_Rows($query)!=0) {
    $count_article = MySQL_Num_Rows($query);  // pocet vybranych clanku
    
    // vybrane clanky jsou z obdobi OD – DO
    $date_from = MySQL_Result($query, 0, „publish_date“);  // od
    $date_to = MySQL_Result($query, $count_article-1, „publish_date“);  // do
    $from_to = Date(„j. n. Y“, $date_from) . Date(“ – j. n. Y“, $date_to);  // od – do
    $article = ‚<h2 class=“archive“>‘ . $from_to . ‚</h2>‘; // nadpis od – do
  
    $move = MySQL_Data_Seek($query, 0);  // presuneme se znovu na zacatek
    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$‘, ‚Weblog‘, $page);
    $output = Str_Replace(‚$WEBLOG_ARTICLES$‘, $article, $output);
    $output = Str_Replace(‚$WEBLOG_ARCHIVE$‘, Archive_Links(), $output);
    
    // na zaklade parametru $type se bud vygeneruje staticka stranka index.html,
    // nebo je cela stranka pouzita pro dynamicky generovanou stranku
    if($type==“static“) {
      $fp = @FOpen(‚../index.html‘, ‚w‘) or Weblog_Error(3);
      FWrite($fp, $output);
      FClose($fp);
    } elseif($type==“dynamic“) {
      return $output;
    }
  }
}

Před chvílí jsem se zmínil o funkci Article(). Tato funkce je definovaná společně s několika dalšími funkcemi v souboru function.php a slouží ke zpracování článků vybraných z databáze. Funkce Article() se nepoužije jen při generování úvodní stránky, ale i při výpisu článků v administrační části či při generování archivních stránek. V prvním parametru je předán výsledek SQL dotazu, kterým vybíráme dané články. Druhý parametr určuje, zda bude k článku přidán i tzv. trvalý odkaz. Každý článek umístíme do zvláštního bloku. Pomocí elementu <a> vytvoříme záložku, která umožní snadný přechod na daný článek, v atributu name je použito unikátní označení článku. Následně přidáme nadpis a text článku, informace o autorovi a datum vydání. Možná nové jsou pro vás znaky j a n použité ve funkci Date() k vytvoření data vydání. Označují den resp. měsíc, ale bez počátečních nul.

V další části přidáme trvalý odkaz (permalink), který směřuje do příslušné archivní stránky a po jehož odkliknutí se dostaneme přímo na daný článek či záložku, o které jsem se zmínil v předchozím odstavci. Trvalý odkaz má tvar Y_m_d_Y_m_d.html#unikatni_oznaceni_prispevku (např. 2002_10_21_2002_10_27.html#17). Datum prvního dne v daném týdnu máme v databázi, datum posledního dne vytvoříme přičtením 600 000 sekund (cca 6 dní a 23 hodin). Další podrobnosti o archivních stránkách budou v článku zabývajícím se generováním archivu.

// zpracuje jednotlive clanky, v prvnim parametru je predan vysledek SQL dotazu
// druhy parametr urcuje, zda bude vlozen „trvaly odkaz“
function Article($result, $permalink = true) {
  $publish_date = Date(„j. n. Y H:i“, $result[‚publish_date‘]);  // prevede datum na srozumitelny format
  
  // kazdy clanek je ve zvlastnim bloku
  $article = ‚<div class=“article“>‘;
  $article .= ‚<a name=“‚ . $result[‚article_id‘] . ‚“></a>‘;  // zalozka
  $article .= ‚<h2>‘ . $result[„title“] . ‚</h2>‘;  // titulek
  $article .= ‚<p>‘ . $result[„message“] . ‚</p>‘;  // text clanku
  $article .= ‚<p class=“author“><a href=“mailto:‘ . $result[„email“] . ‚“>‘ . $result[„name“] . ‚</a> /‘ . $publish_date . ‚/‘; // autor + datum vydani
  // ma byt pridan trvaly odkaz ?
  if($permalink) $article .= ‚    <a href=“‚ . Date(„Y_m_d“, $result[‚archive_date‘]) . Date(„_Y_m_d“, $result[‚archive_date‘] + 600000) . ‚.html#‘ . $result[‚article_id‘] . ‚“ class=“permalink“>trvalý odkaz</a></p>‘;
  $article .= „</div>\n“;
  return $article;
}

Další funkcí v souboru function.php je funkce First_Day(), která vrací datum prvního dne v aktuálním týdnu, a to jako počet sekund od 1. 1. 1970. Musíme si však dát pozor na to, že prvním dnem týdne je u nás pondělí, nikoli neděle. Protože znak w použitý ve funkci Date() přiřazuje k neděli 0, musíme pomocí podmínky změnit tuto 0 na 7.

// vraci datum prvniho den v tydnu jako pocet sekund od 1.1. 1970
function First_Day() {
  $day_number = Date(„w“);  // cislo dne v tydnu
  if($day_number == 0) $day_number = 7;  // nedeli nepovazujeme za prvni, ale posledni den tydne
  return MkTime(0,0,0, Date(„m“), Date(„d“)-$day_number+1, Date(„y“));
}

Funkce Archive_Links() je poslední funkcí, kterou si dnes definujeme. Tato funkce vytváří odkazy na archivní stránky a bude použita i při generování samotných archivních stránek. 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, nemá totiž smysl vytvářet odkazy na archivní stránky, které ještě neexistují. Postup, který používáme při vytváření odkazů na archivní stránky, je stejný jako ten, který byl popsán u funkce Article().

// vytvari odkazy na archivni stranky
function Archive_Links() {
  $first_day_of_week = First_Day();  // datum prvniho dne v tydnu
  // vybere data a seradi vzestupne
  $query = @MySQL_Query(„SELECT DISTINCT archive_date FROM article WHERE archive_date <= $first_day_of_week ORDER BY archive_date DESC“) or Weblog_Error(2);
  $link = “;
  while($result = MySQL_Fetch_Array($query)) {
    $archive_date_from = $result[‚archive_date‘];  // prvni den tydne
    $archive_date_to = $result[‚archive_date‘] + 600000;  // posledni den tydne
    $from_to = Date(„j. n. Y“, $archive_date_from) . Date(“ – j. n. Y“, $archive_date_to); // prevede datum na srozumitelnejsi podobu
    
    // vytvori odkazy
    $link .= ‚<li>‘;
    $link .= ‚<a href=“‚ . Date(„Y_m_d“, $archive_date_from) . Date(„_Y_m_d“, $archive_date_to) . ‚.html“>‘ . $from_to . ‚</a>‘;
    $link .= ‚</li>‘;
   }
  return $link;
}

Hotovou aplikaci si samozřejmě můžete prohlédnout a vyzkoušet. Příště opět navážeme na dnešní článek a povíme si, jak vygenerovat archivní stránky.

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

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

Předchozí článek Navigační menu pomocí CSS
Š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 *