Po úvodním seznámení s diskusním fórem si dnes povíme, jak zobrazit úvodní stránku, tedy seznam témat. Procvičíme si práci s databází, funkcemi a datem. Také se dozvíte, jak vytvořit velmi často používaný efekt – střídání barevného pozadí tabulky.
Úvodní stránka (index.php)
Nejprve si vytvoříme tabulku se 4 sloupečky – Téma, Autor, Poslední Odpověď, Počet odpovědí.
<? $width=90; //šířka tabulky require "db.php"; //otevřeme databázi require "style.php"; //načteme soubor s konfigurací require "header.php"; //vložíme hlavičku ?> <!– TABULKA, VE KTERÉ VYPÍŠEME SEZNAM TÉMAT –> <table width="90%" border="0" cellspacing="0" cellpadding="0" align="center" bgcolor="Black"><tr><td> <table width="100%" border="0" cellspacing="1" cellpadding="3" align="center"> <tr bgcolor="#4A4A4A"> <td class="tableheading">Téma</td> <td width="15%" class="tableheading">Autor</td> <td width="20%" align="center" class="tableheading">Poslední odpověď</td> <td width="10%" align="center" class="tableheading">Odpovědí</td> </tr> |
|
Poté si definujeme funkci Count_Answers($topic), která spočítá počet odpovědí na dané téma. V parametru funkce předáváme ‚id‘ právě zpracovávaného příspěvku. Nejprve vybereme a spočítáme přímé odpovědi, následně procházíme a pomocí rekurze přičítáme nepřímé odpovědi (odpovědi na odpovědi). Funkce vrací celkový počet odpovědí na dané téma.
//tato fce počítá počet odpovědí na dané téma, v parametru předáváme právě zpracovávaný příspěvek (téma) function Count_Answers($topic) { $count = 0; //předpokládáme žádnou odpověď //vybíráme přímé odpovědi $answer = MySQL_Query("SELECT id FROM phorum WHERE thread = $topic") or die($query_error); $count = MySQL_Num_Rows($answer); //spočítáme přímé odpovědi //procházíme nepřímé odpovědi a přičítáme while($entry = MySQL_Fetch_Array($answer)) $count += Count_Answers($entry["id"]); return $count; //vrať počet odpovědí } |
|
Následně z databáze vybereme všechna témata (thread = 0), spočítáme je a do proměnné $page_number uložíme počet stran, na kterých se témata eventuelně zobrazí (počet témat vydělíme počtem příspěvků na jedné straně a zaokrouhlíme nahoru). Pomocí proměnné $page, která udává číslo zobrazované stránky, spočítáme kolikáté téma se vypíše jako první. Následně příslušná témata vybereme z databáze. ‚ORDER BY latest DESC‘ znamená, že témata budou seřazena podle data poslední odpovědi, a to sestupně. Pomocí ‚LIMIT $start, $view_number‘ omezíme výběr tak, že vybereme 20 (standardní hodnota $view_number) témat, počínaje tématem $start.
//vybíráme témata $main_topic = MySQL_Query("SELECT id FROM phorum WHERE thread = 0 ") or die($query_error); $topics_number = MySQL_Num_Rows($main_topic); //počet témat $page_number = Ceil($topics_number/$view_number); //počet stran, na kterých se témata zobrazí $start = $page*$view_number; //první téma, které zobrazíme //vybíráme hlavní témata – seřazena podle času poslední odpovědi $main_topic = MySQL_Query("SELECT id, author, email, subject, body, latest FROM phorum WHERE thread = 0 ORDER BY latest DESC LIMIT $start, $view_number") or die($query_error); |
|
Nyní můžeme přistoupit k samotnému vypisování témat. U tabulky budeme střídat barevné pozadí řádků, což je dostatečně okomentováno ve zdrojovém kódu.
//CYKLEM VYPÍŠEME SEZNAM TÉMAT while ($entry = MySQL_Fetch_Array($main_topic)): //následující podmínka umožní střídat barevné pozadí tabulky //pokud je $y dělitelné dvěma (sudé), použijeme první pozadí, jinak druhé, a následně $y o 1 zvýšíme if ($y%2==0) echo ‚<tr bgcolor="‘ . $table_bgcolor . ‚">‘; else echo ‚<tr bgcolor="‘ . $table_bgcolor_alt . ‚">‘; $y++; |
|
Funkce Date(), kterou velmi dobře znáte, slouží k formátování času a data. Standardně tato funkce pracuje s aktuálním časem. Jako druhý parametr však můžeme uvést i jiný čas, a to jako počet sekund od 1. ledna 1970. Toho využijeme, když budeme chtít vypsat upozornění, že na dané téma byla přidána odpověď dnes nebo včera. Pokud se datum poslední odpovědi („$entry[„latest“]) rovná aktuálnímu datu, vypíšeme ‚dnes’. Stejně postupujeme i v druhé podmínce. Funkce Time() vrací aktuální počet sekund od 1. ledna 1970, 86400 je počet sekund za jeden den. Pokud se tedy datum poslední odpovědi rovná včerejšímu datu (Time()-86400) vypíšeme ‚včera‘.
//TÉMA echo ‚<td class="table"><a title="‘. $entry["body"] . ‚" href="read.php?id=‘ . $entry["id"] . ‚&view=‘ . $view . ‚">‘ . $entry["subject"]. ‚</a>‘; //pokud byla poslední odpověď na zpracovávané téma uložena dnes nebo včera, vypíšeme upozornění if(Date("dmY", $entry["latest"])==Date("dmY")) echo ‚ <font class="smallred">dnes</font>‘; if(Date("dmY", $entry["latest"])==Date("dmY", Time()-86400)) echo ‚ <font class="smallbrown">včera</font>‘; echo ‚</td>‘; |
|
V dalších sloupečcích bude autor, datum a čas poslední odpovědi a počet odpovědí na dané téma.
//AUTOR – pokud zadal autor příspěvku svůj email, vytvoříme odkaz echo ‚<td width="25%" class="table">‘; if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘; echo $entry["author"]; if ($entry["email"]!="") echo ‚</a>‘; echo ‚</td>‘; //POSLEDNÍ ODPOVĚĎ – počet sekund od 1. 1. 1970 převedeme na srozumitelnější formát echo ‚<td width="10%" align="center" class="table">‘ . Date("d. m. Y, H:i:s", $entry["latest"]) . ‚</td>‘; //POČET ODPOVĚDÍ – použijeme dříve definovanou funkci echo ‚<td width="10%" align="center" class="table">‘ . Count_Answers($entry["id"]) . ‚</td>‘; echo ‚</tr>‘; endwhile; MySQL_Close(); //zavřeme databázi ?> </table></td></tr></table> |
|
Pod tabulku se seznamem témat umístíme ještě tabulku, ve které bude celkový počet témat ($topics_number) a odkazy na starší a novější témata. Vše je dostatečně okomentováno ve zdrojovém kódu, a navíc problematikou výpisu příspěvků po určitém počtu jsme se zabývali již v předchozích seriálech.
<!– TABULKA, VE KTERÉ JE POČET TÉMAT, ODKAZY NA STARŠÍ A NOVĚJŠÍ TÉMATA –> <table width="90%" border="0" cellspacing="0" cellpadding="3" align="center"><tr> <td align="right" class="menu"> <? echo ‚Celkem zde je <b>‘ . $topics_number . ‚</b> témat. ‚; //pokud nejsme na první stránce vypíšeme odkaz na novější témata if ($page!=0) echo ‚<a href="index.php?page=‘ . ($page-1) . ‚&view=‘ . $view . ‚">Novější témata</a>‘; //pokud existuji starši témata, vypíšeme odkaz if ($page_number>$page+1) echo ‚ <a href="index.php?page=‘ . ($page+1) . ‚&view=‘ . $view . ‚">Starší témata</a>‘; ?> </td> </tr></table> </body></html> |
|
Tímto dnešní díl končí, příště se podíváme na detailní zobrazování témat a odpovědí.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Libor Šustek
Úno 23, 2011 v 21:09Chybí mi proměnná $page, kde ji definuji?