Redakční systém 8.

Po delší odmlce se opětovně setkáváme u seriálu o redakčním systému. Dnešní díl bude dílem závěrečným. Na konci článku naleznete odkaz na kompletní skripty včetně základního instalačního „manuálu“. Diskusní fóra ke článkům budou pojata jako jednoduchá kniha návštěv. Všechny diskusní příspěvky se budou ukládat do databáze, odkud budou následně čtena a zobrazována návštěvníkům.

Po delší odmlce se opětovně setkáváme u seriálu o redakčním systému. Dnešní díl bude dílem závěrečným. Na konci článku naleznete odkaz na kompletní skripty včetně základního instalačního „manuálu“. Diskusní fóra ke článkům budou pojata jako jednoduchá kniha návštěv. Všechny diskusní příspěvky se budou ukládat do databáze, odkud budou následně čtena a zobrazována návštěvníkům.

Nejdříve si popíšeme základní funkce skriptu forum.php. Tento skript obdrží jako argument proměnnou clanek ve které bude id článku. Pokud tato proměnná nebude existovat, skript zobrazí hlášku o tom, že článek neexistuje. Pokud je argument uveden, vyhledáme v tabulce clanky název článku (nadpis), který použijeme ve výstupu skriptu. Pokud název článku nenajdeme, opětovně zobrazíme hlášku o tom, že článek neexistuje. V opačném případě se budeme snažit v tabulce fora najít veškeré záznamy, kde bude ve sloupci id_clanku shodné číslo s id článku. Takovéto záznamy seřadíme dle data sestupně a zobrazíme je. Nakonec vložíme formulář pro přidání komentáře. Pokud v tabulce nenajdeme žádný příspěvek patřící článku, ke kterému se fórum vztahuje, zobrazíme o tom jednoduchou hlášku.

Jakmile návštěvník vyplní formulář a odešle jej, skript se bude snažit vyhodnotit data vyplněná ve formuláři. Pokud návštěvník nezadá jméno a text příspěvku, bude mu vrácen formulář s chybovým hlášením a žádostí o vyplnění povinných položek. Pokud budou všechny povinná pole vyplněna, uložíme data do databáze. Poté se budeme snažit z databáze načíst všechny emailové adresy přispěvatelů, kteří si zatrhli položku „upozorňovat emailem na nové příspěvky“. Pomocí dotazu: SELECT DISTINCT email FROM fora WHERE id_clanku = ‚$clanek‘ zajistíme výběr unikátních emailových adres, na které bude odeslán email upozorňující na nový diskusní příspěvek.

forum.php (/forum.php)

<?
// vložíme soubory s funkcemi
include "./conn.php";
include "./function.php";
// zobrazíme hlavičku stránky
head();
?>
<TABLE BORDER="0" ALIGN="CENTER" WIDTH="100%">
<TR>
<TD VALIGN="TOP" WIDTH="200">
<!-- levý slopec -->
<?
// vložíme levý sloupec
include "./levy.php";
?>
<!-- levý slopec - konec -->
</TD>
<TD VALIGN="TOP">
<!-- pravý slopec -->
<?
// pokud není proměnná $clanek
if (!isset($clanek))
{
$neni_clanek = 1;
}
// pokud existuje proměnná $clanek
else
{
// najdeme nadpis článku
@$sql = mysql_query("SELECT nadpis FROM clanky WHERE id = $clanek");
@$name = mysql_result($sql,0,0);
// pokud název článeku nalezneme
if ($name != "")
{
$clanek_je = 1;
// pokud byl odeslán formulář
if ($add == true)
{
// existují povinné položky
if ($jmeno && $zprava)
{
if ($notify != "a") $notify = "n";
// vložíme data do databáze
@$sql = mysql_query("INSERT INTO fora VALUES
('','$clanek','".time()."','$jmeno',
'$email','$predmet','$zprava','$notify')");
$predmet = '';
$zprava = '';
$mess = "Novy prispevek ke clanku: ".$name."\n\n";
$mess .= "Precist si jej muzete na adrese:\n";
$mess .= "http://".$SERVER_NAME.$SCRIPT_NAME."?clanek=".$clanek;
// odešleme notifikaci na nový diskuzní příspěvek
@$sql = mysql_query("SELECT DISTINCT email FROM fora
WHERE id_clanku = '$clanek'");
while (@$row = mysql_fetch_row($sql))
{
mail($email,"Novy prispevek v diskuzi",$mess,
"From: rs@example.com\nReply-To: rs@example.com");
}
}
// pokud chybí povinné údaje
else
{
$error = 1;
}
}
}
// článek v databázi neexistuje
else
{ $neni_clanek = 1; }
}
// pokud nebyl nalezen článek
if ($neni_clanek == 1)
{
echo "<h3 align=\"center\">Článek neexistuje</h3>\n";
}
// článek byl nalezen
else
{
echo "<h3 align=\"center\">Diskuze ke článku
<A HREF=\"index.php?clanek=$clanek\">$name</A></h3>\n";
// výběr diskusních příspěvků
@$sql = mysql_query("SELECT * FROM fora WHERE id_clanku = $clanek
ORDER BY datum DESC");

// pokud ke článku existuje příspěvek a nebyl odeslán forulář
if (@mysql_num_rows($sql)>0 && !$add && !$error)
{
while ($row = mysql_fetch_row($sql))
{
?>
<P>
<B>Příspěvek ze dne:</B> <? echo date("d.m.Y H:i:s",$row[2]);?>
<BR>
<B>Přispěl:</B> <A HREF="mailto:<? echo $row[4]; ?>">
<? echo $row[3];?></A>
<BR>
<B>Předmět:</B> <? echo $row[5]."\n<BR>\n". $row[6];?>
</P>
<?
}
}
// neexistuje žádný příspěvek
elseif (!$add && !$error)
{
echo "<P ALIGN=\"CENTER\">Zatím nikdo nepřispěl</P>\n";
}
// byl odeslán formulář a chybí povinná položka
elseif ($add && $error)
{
echo "<CENTER><B>Chybí některá povinná položka
(jméno nebo zpráva).</B><BR>\n";
echo "<A HREF=\"forum.php?clanek=$clanek\">Zpět na
fórum</A>, ";
echo "<A HREF=\"index.php?clanek=$clanek\">Zpět na
článek</A>.\n</CENTER><BR>";
}
// komentář byl vložen
else
{
echo "<CENTER><B>Komentář byl vložen</B>
<BR>\n";
echo "<A HREF=\"forum.php?clanek=$clanek\">Zpět na
fórum</A>, ";
echo "<A HREF=\"index.php?clanek=$clanek\">Zpět na
článek</A>.\n</CENTER><BR>";
}
}
?>
<FORM METHOD="POST" ACTION="forum.php">
<INPUT TYPE="HIDDEN" NAME="add" VALUE="true">
<INPUT TYPE="HIDDEN" NAME="clanek" VALUE="<? echo $clanek; ?>">
<TABLE BORDER="0" ALIGN="CENTER" CELLSPACING="0">
<TR>
<TD>Jméno:  </TD>
<TD><INPUT TYPE="TEXT" NAME="jmeno" VALUE="<? echo $jmeno; ?>"
SIZE="40" MAXLENGHT="250"></TD>
</TR>
<TR>
<TD>Email:  </TD>
<TD><INPUT TYPE="TEXT" NAME="email" VALUE="<? echo $email; ?>" SIZE="40"
MAXLENGHT="250"></TD>
</TR>
<TR>
<TD>Předmět:  </TD>
<TD><INPUT TYPE="TEXT" NAME="predmet" VALUE="<? echo $predmet; ?>"
SIZE="40" MAXLENGHT="250"></TD>
</TR>
<TR>
<TD VALIGN="TOP">Zpráva:  </TD>
<TD>
<TEXTAREA NAME="zprava" COLS="34" ROWS="5">
<? echo $zprava; ?>
</TEXTAREA>
</TD>
</TR>
<TR>
<TD COLSPAN="2" ALIGN="CENTER">
Upozorňovat mailem na nové příspěvky:  
<INPUT TYPE="CHECKBOX" NAME="notify" VALUE="a" CHECKED>
</TD>
</TR>
<TR>
<TD COLSPAN="2" ALIGN="CENTER">
<INPUT TYPE="SUBMIT" VALUE="Přidat příspěvek">
</TD>
</TR>
</TABLE>
<!-- pravý slopec - konec -->
</TD>
</TR>
</TABLE>
<?
// patička stránky a ukončení práce s databází
foot();
mysql_close($conn);
?>

Tímto bychom měli za sebou diskusní fóra ke článkům. Jednoduchý redakční systém je tímto hotov. Neříkám, že takovýto RS je profesionální a bude plně dostačující všem uživatelům. Vždy je co zdokonalovat. I na tomto jednoduchém příkladu je spousta věcí, které by se daly přidat a změnit. Například můžete přidat upload obrázků ke článkům, fulltextové vyhledávání ke článkům, upozorňování na nové články – ať už administrátory tak i návštěvníky pomocí mailling listů, vytváření a administraci různých HTML šablon a následné přepracování RS do systému fast templates apod. Článek se měl zaměřit hlavně na základní principy fungování obdobných publikačních webových aplikací a doufám že tento účel splnil.

Můžete si stáhnout kompletní skripty redakčního systému zabalené v zazipovaném souboru. Tento zip obsahuje i dump databáze (bez dat, pouze tabulky) a textový soubor s několika body jak uvést skripty do činosti.

Navigace v seriálu← Redakční systém 7.