redakcni system
redakcni system
14. června 2001, 00.00 | Pokračujeme v seriálu o redakčním systému. Dnes budeme tvořit skripty určené k
zadávání, editování, mazání článků a skript určený k náhledu na článek.
Po další pauze přicházím s dalším pokračováním seriálu o redakčním systému. Dnešní díl
se bude zabývat vkládáním a upravováním článků. Za pomoci dnešních skriptů budete moci
vkládat, upravovat, mazat a schvalovat články a to jak vaše vlastní, tak i články vložené
některým z autorů.
Celkem si dnes popíšeme šest skriptů. První se jmenuje addclanek.php a slouží
ke vložení článku do redakčního systému. Další se jmenuje prehled.php. Tento
skript zobrazí přehled všech článků s odkazy na editaci a s možností smazání. Zobrazené
informace budou: autor článku, rubrika ve které se článek nachází, datum vložení (pokud
byl článek schválen jedná se o datum publikace), priorita článku, čtenost a stav
článku (vložen, zkorekturován, schválen). Třetí skript bude korektura.php. Tento
skript zobrazí stejný přehled článků jako předchozí, ale obsahuje navíc i možnost úpravy
samotného článku. Čtvrtým a pátým skriptem jsou stats.php a userstats.php.
První zobrazí statistiky čtenosti článků. Druhý je mírná modifikace předchozího, s tím
rozdílem, že se jedná jen o statistiku článků přihlášeného autora. Posledním skriptem
je nahled.php, což je jednoduchý skript který zobrazí článek v podobě HTML
stránky. Nejdříve tedy začneme vkládáním článků:
addclanek.php (/admin/addclanek.php)
Tento skript bude vkládat do databáze nové články. Článek se vždy vloží pod autorem,
jež je právě přihlášen. Tzn. pokud třeba šéfredaktor vkládá článek za jiného autora,
který nemá přístup k redakčnímu systému, bude muset autora změnit při korektuře článku.
Skript zobrazí formulář pro vložení všech potřebných položek (rubrika, nadpis, anotace,
text článku...). Dále pak formulář obsahuje checkbox, který, pokud bude zatrhlý způsobí
ve článku změnu všech přechodů na nový řádek (stisk klávesy ENTER) na tag <BR>.
Po odeslání formuláře skript uloží získaná data do databáze - tabulky clanky.
Skript vypadá následovně:
<?
// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
echo "Neautorizovaný přístup";
exit;
}
include "../function.php";
include "../conn.php";
// autorizace
auth();
// bude-li odeslán formulář, vložíme údaje do databáze
if ($send)
{
// pokud je zaškrnuto BEZ HTML nahradíme konce řádků tagy <BR>
if ($bezhtml == "ano") $clanek = nl2br($clanek);
$sql = mysql_query("INSERT INTO clanky VALUES(
'',$autor,$rubrika,".time().",0,0,'$nadpis',
'$perex','$clanek','$poznamka','n')
");
?>
<H3 ALIGN="CENTER">Článek vložen</H3>
<?
// ukončíme skript
foot();
exit;
}
// zobrazení formuláře
?>
<H3 ALIGN="CENTER">Přidání článku</H3>
<FORM METHOD="POST" ACTION="addclanek.php">
<INPUT TYPE="HIDDEN" NAME="send" VALUE="true">
<TABLE BORDER="1" CELLSPACING="0" CELLPADDING="4" ALIGN="CENTER">
<TR>
<TD><B>Autor:</B></TD>
<TD><B><? echo $INFO[3]; ?></B>
<INPUT TYPE="HIDDEN" NAME="autor" VALUE="<? echo $INFO[0]; ?>">
</TD>
</TR>
<TR>
<TD><B>Rubrika:</B></TD>
<TD>
<SELECT NAME="rubrika">
<?
// vloží se seznam rubrik
include "./../inc/rubriky_admin";
?>
</SELECT>
</TD>
</TR>
<TR>
<TD><B>Nadpis:</B></TD>
<TD><INPUT TYPE="TEXT" NAME="nadpis" SIZE="58" MAXLENGHT="250"></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Perex:</B></TD>
<TD><TEXTAREA NAME="perex" COLS="50" ROWS="4"></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Článek:</B></TD>
<TD><TEXTAREA NAME="clanek" COLS="50" ROWS="20"></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Poznámka:</B></TD>
<TD><TEXTAREA NAME="poznamka" COLS="50" ROWS="4"></TEXTAREA></TD>
</TR>
<TR>
<TD><B>Bez HTML:</B></TD>
<TD><INPUT TYPE="CHECKBOX" NAME="bezhtml" VALUE="ano"></TD>
</TR>
<TR>
<TD ALIGN="CENTER" COLSPAN="2"><INPUT TYPE="SUBMIT" VALUE="ODESLAT"></TD>
</TR>
</TABLE>
</FORM>
<? foot(); ?>
|
|
Dalším skriptem v pořadí je prehled.php, ale jelikož je celý obsažen
ve skriptu korektura.php nebudu jeho výpis uvádět (bude v kompletním kódu)
a budu se věnovat skriptu korektura.php, který při svém zobrazení zobrazí
obsah článků v databázi a pokud mu bude při jeho zavolání známa proměnná $id,
zobrazí místo seznamu článků formulář určený pro editaci článku. Tento formulář je
podobný formuláři pro vkládání článků, ale neobsahuje položku Bez HTML a má
navíc pole priorita, datum a stav. Priorita určí důležitost článku v daném dni - v
seznam článků se bude zobrazovat v rámci článků z jednoho dne výše než články bez
nebo s nižší prioritou. Datumem určíme datum publikace článku - můžeme tak jeho
vydání naplánovat klidně na měsíce dopředu. Stav určuje v jakém stádiu se konkrétní
článek nachází. Zda byl právě vložen, či už prošel korekturou nebo zda je již článek
schválen. Návštěvníkům stránek se samozřejmě budou zobrazovat jen schválené články.
Ve formuláři je tedy možno editovat všechny potřebné údaje. Po jeho odeslání,
bude článek v databázi upraven.
korektura.php (/admin/korektura.php)
<?
// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
echo "Neautorizovaný přístup";
exit;
}
// vložíme soubory
include "../conn.php";
include "../function.php";
// autorizace
auth();
// pokud uživatel není šéfredaktor nebo redaktor tak ho vyhodíme
if ($INFO[6] < 2)
{
echo "Neautorizovaný přístup";
mysql_close($conn);
exit;
}
// existuje-li proměnná $did pokusíme se smazat článek s id
// shodujícím se s $did
if (isset($did))
{
@$sql = mysql_query("DELETE FROM clanky WHERE id = $did");
}
// zobrazíme hlavičku stránky
head();
?>
<h3>Korektura</h3>
<?
if (!$id && !$send)
{
@$sql = mysql_query("SELECT C.id,C.nadpis,A.jmeno,R.rubrika,C.datum,
C.counter,C.stav,C.priorita
FROM clanky C, rubriky R, autori A
WHERE C.id_autor = A.id AND C.id_rubrika = R.id
ORDER BY datum DESC, priorita DESC");
// pokud je v databázi alespoň jeden článek
if(@mysql_num_rows($sql) > 0)
{
?>
<table border=0 cellspacing=0 cellpadding=1>
<tr bgcolor=#C0C0C0>
<td bgcolor=#C0C0C0><b> Článek</b></td>
<td bgcolor=#C0C0C0 align="center"><b> Rubrika </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Autor </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Datum </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Čtenost </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Priorita </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Stav </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Náhled </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Editovat </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Smazat </b></td>
</tr>
<?
$i = 0; // pomocná proměnná
// pro každý záznam v databázi se opakuje smyčka, ve které
// postupně zobrazíme všechny uživatele
while ($row = mysql_fetch_row($sql))
{
// pokud je číslo liché, vložíme do proměnné bgcolor
// šedou barvu. Jinak bude proměnná prázdná
if ($i%2==0) $bgcolor=''; else $bgcolor=" bgcolor=#C0C0C0";
?>
<tr<? echo $bgcolor; ?>>
<td<? echo $bgcolor; ?>> <b><? echo $row[1];?></b></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[2];?></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[3];?></td>
<td<? echo $bgcolor; ?> align="center">
<? echo date("d.m.Y",$row[4]);?></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[5];?></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[7];?></td>
<td<? echo $bgcolor; ?> align="center">
<?
// zobrazení stavu článku
if ($row[6]=="n") echo "vložen";
elseif ($row[6]=="k") echo "korektura";
else echo "schválen";
?>
</td>
<td<? echo $bgcolor; ?> align="center">
<A HREF="nahled.php?id=<? echo $row[0]; ?>"
TARGET="_blank">Náhled</A> </td>
<td<? echo $bgcolor; ?> align="center">
<A HREF="korektura.php?id=<? echo $row[0]; ?>">Editovat</A> </td>
<form method="get" action="prehled.php">
<input type="hidden" name="did" value="<? echo $row[0]; ?>">
<td<? echo $bgcolor; ?> align="center">
<input type="submit" value="Smazat"
onclick="return confirm('Opravdu chceš uživatele smazat ?')"> </td>
</form>
</tr>
<?
// zvýšíme proměnnou i o 1.
$i++;
}
// uvolníme výsledek
mysql_free_result($sql);
?>
</table>
<?
}
// pokud není nikdo v databázi - nemožné, ale co kdyby...
else
{
?>
<h3><font color="#FF0000"><b>Nenalezen žádný záznam !!!</b></font></h3>
<?
}
}
// pokud byl odelsán formulář
elseif ($send && $id)
{
// vytvoříme unixový čas
$datum = MkTime(0,0,0,$mesic,$den,$rok);
// updatujeme údaje z formuláře
@$sql = mysql_query("UPDATE clanky SET
id_autor = '$autor', id_rubrika = '$rubrika',
datum = '$datum', priorita = '$priorita',
nadpis = '$nadpis', anotace = '$perex',
clanek = '$clanek', poznamka = '$poznamka',
stav = '$stav'
WHERE id = $id");
echo "<H3>Upraveno</H3>\n";
// ukončíme skript
foot();
exit;
}
// zobrazujeme formulář pro editaci článku
else
{
// selectuje se článek s konkrétním id
@$sql = mysql_query("SELECT * FROM clanky WHERE id = $id");
$data = mysql_fetch_row($sql);
$autor = $data[1];
$rubrika = $data[2];
?>
<FORM METHOD="POST" ACTION="korektura.php">
<INPUT TYPE="HIDDEN" NAME="send" VALUE="true">
<INPUT TYPE="HIDDEN" NAME="id" VALUE="<? echo $id; ?>">
<TABLE BORDER="1" CELLSPACING="0" CELLPADDING="4" ALIGN="CENTER">
<TR>
<TD><B>Autor:</B></TD>
<TD>
<SELECT NAME="autor">
<?
// vloží seznam autorů
include "./../inc/autori";
?>
</SELECT>
</TD>
</TR>
<TR>
<TD><B>Rubrika:</B></TD>
<TD>
<SELECT NAME="rubrika">
<?
// vloží seznam rubrik
include "./../inc/rubriky_admin";
?>
</SELECT>
</TD>
</TR>
<TR>
<TD><B>Nadpis:</B></TD>
<TD><INPUT TYPE="TEXT" NAME="nadpis" SIZE="58" MAXLENGHT="250"
VALUE="<? echo $data[6]; ?>"></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Perex:</B></TD>
<TD><TEXTAREA NAME="perex" COLS="50" ROWS="4">
<? echo $data[7]; ?></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Článek:</B></TD>
<TD><TEXTAREA NAME="clanek" COLS="50" ROWS="20">
<? echo $data[8]; ?></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Poznámka:</B></TD>
<TD><TEXTAREA NAME="poznamka" COLS="50" ROWS="4">
<? echo $data[9]; ?></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Priotita:</B></TD>
<TD><INPUT TYPE="TEXT" NAME="priorita" SIZE="2" MAXLENGHT="2"
VALUE="<? echo $data[5]; ?>"></TD>
</TR>
<TR>
<TD><B>Stav</B></TD>
<TD>Vložen:
<INPUT TYPE="RADIO" NAME="stav" VALUE="n"
<? if ($data[10] == 'n') echo " CHECKED";?>>,
Korektura: <INPUT TYPE="RADIO" NAME="stav" VALUE="k"
<? if ($data[10] == 'k') echo " CHECKED";?>>,
Schválen: <INPUT TYPE="RADIO" NAME="stav" VALUE="a"
<? if ($data[10] == 'a') echo " CHECKED";?>>
</TD>
</TR>
<TR>
<TD><B>Čas publikování:</B></TD>
<TD><SELECT NAME="den">
<?
// pro 31 dní zobrazí option
for ($i=1; $i<=31; $i++)
{
echo " <OPTION VALUE=$i";
if (date("m") == $i) echo " SELECTED";
echo ">$i</OPTION>\n";
}
?>
</SELECT>
.
<SELECT NAME="mesic">
<?
// pro každý měsíc se zobrazí option
for ($i=1; $i<= 12; $i++)
{
echo " <OPTION VALUE=$i";
if (date("m") == $i) echo " SELECTED";
echo ">$i</OPTION>\n";
}
?>
</SELECT>
.
<SELECT NAME="rok">
<OPTION VALUE="2001">2001</OPTION>
<OPTION VALUE="2002">2002</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD ALIGN="CENTER" COLSPAN="2"><INPUT TYPE="SUBMIT"
VALUE="ODESLAT"></TD>
</TR>
</TABLE>
</FORM>
<?
}
// zobrazíme patičku stránky a zavřeme spojení s databází
foot();
mysql_close($conn);
?>
|
|
Dalšími skripty, které si popíšeme budou stats.php a userstats.php,
které budou zobrazovat statistiky článků podle jejich čtenosti. Články budou
chronologicky řazeny od nejčtenějších po nejméně čtené. Oba skripty jsou téměř
totožné, ovšem skript stats.php oproti skriptu userstats.php zobrazuje
statistiky článků všech autorů a je určen pro redaktory a šéfredaktora. Druhý skript
je omezen jen na statistiky článků přihlášeného autora. První skript si podrobněji
popíšeme níže, druhý bude v podstatě totožný, jen select z databáze bude obsahovat
jednu podmínku navíc a nebude mít ve výsledku položku s jménem autora. Pro porovnání
uvádím oba hlavní selecty do databáze. První je pro celkové statistiky, druhý pro
statistiky jednotlivých autorů. Samozřejmě, že se ekvivalentně změní i vzhled
tabulky, ve které se budou zobrazovat výsledky z databáze. Po selectech do databáze
následuje zdrojový kód skriptu stats.php.
SELECT C.id,C.nadpis,A.jmeno,R.rubrika,C.datum,C.counter FROM clanky C, rubriky R,
autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id ORDER BY counter DESC,
datum DESC, priorita DESC
SELECT C.id,C.nadpis,R.rubrika,C.datum,C.counter FROM clanky C, rubriky R, autori A
WHERE C.id_autor = A.id AND C.id_rubrika = R.id AND C.id_autor = $INFO[0] ORDER BY
counter DESC, datum DESC, priorita DESC
stats.php (/admin/stats.php)
<?
// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
echo "Neautorizovaný přístup";
exit;
}
// vložíme soubory
include "../conn.php";
include "../function.php";
// autorizace
auth();
// pokud uživatel není šéfredaktor tak ho vyhodíme
if ($INFO[6] < 2)
{
echo "Neautorizovaný přístup";
mysql_close($conn);
exit;
}
// zobrazíme hlavičku stránky
head();
?>
<h3>Statistiky článků</h3>
<?
// select do databáze
@$sql = mysql_query("SELECT C.id,C.nadpis,A.jmeno,R.rubrika,C.datum,C.counter
FROM clanky C, rubriky R, autori A
WHERE C.id_autor = A.id AND C.id_rubrika = R.id
ORDER BY counter DESC, datum DESC, priorita DESC");
// pokud je v databázi alespoň jeden článek
// zobrazíme tabulku se statistikami
if(@mysql_num_rows($sql) > 0)
{
?>
<table border=0 cellspacing=0 cellpadding=1>
<tr bgcolor=#C0C0C0>
<td bgcolor=#C0C0C0><b> Článek</b></td>
<td bgcolor=#C0C0C0 align="center"><b> Rubrika </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Autor </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Datum </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Čtenost </b></td>
<td bgcolor=#C0C0C0 align="center"><b> Náhled </b></td>
</tr>
<?
$i = 0; // pomocná proměnná
// pro každý záznam v databázi se opakuje smyčka, ve které
// postupně zobrazíme všechny uživatele
while ($row = mysql_fetch_row($sql))
{
// pokud je číslo liché, vložíme do proměnné bgcolor
// šedou barvu. Jinak bude proměnná prázdná
if ($i%2==0) $bgcolor=''; else $bgcolor=" bgcolor=#C0C0C0";
?>
<tr<? echo $bgcolor; ?>>
<td<? echo $bgcolor; ?>> <b><? echo $row[1];?></b></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[2];?></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[3];?></td>
<td<? echo $bgcolor; ?> align="center">
<? echo date("d.m.Y",$row[4]);?></td>
<td<? echo $bgcolor; ?> align="center"> <? echo $row[5];?></td>
<td<? echo $bgcolor; ?> align="center">
<A HREF="nahled.php?id=<? echo $row[0]; ?>" TARGET="_blank">Náhled</A>
</td>
</tr>
<?
// zvýšíme proměnnou i o 1.
$i++;
}
// uvolníme výsledek
mysql_free_result($sql);
?>
</table>
<?
}
// pokud není nikdo v databázi - nemožné, ale co kdyby...
else
{
?>
<h3><font color="#FF0000"><b>Nenalezen žádný záznam !!!</b></font></h3>
<?
}
// zobrazíme patičku stránky a zavřeme spojení s databází
foot();
mysql_close($conn);
?>
|
|
Na závěr článku nám zbyl, dnes asi nejskromnější skript s názvem nahled.php,
který nám po svém zavolání s parametrem id zobrazí článek s id shodným s
předaným parametrem id. Článek bude zobrazen jako náhled na HTML stránku a otevře se
v novém okně prohlížeče. Nyní trošku detailněji popíši následující SQL dotaz:
SELECT C.nadpis,A.jmeno,A.email,R.rubrika,C.datum,C.anotace,C.clanek,A.oautorovi
FROM clanky C, rubriky R, autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id
AND C.id= $id
Budeme selectovat položky ze třech tabulek: clanky položky nadpis,
datum, anotace, clanek, tabulky autori položky
jmeno, email a oautorovi, tabulky rubriky položku
rubrika. Jelikož v dotazu spojujeme více tabulek musíme použít několik
podmínek. Jako výchozí tabulku bereme tabulku clanky. Položky z tabulky
autori se berou z řádku kde je id z tabulky autori shodné s id_autor
v tabulce clanky. Položky z tabulky rubriky se berou z řádku, kde je
id shodné s id_rubrika z tabulky články. Poslední podmínka určuje id
konkrétního článku. Následuje výpis kódu skriptu nahled.php:
nahled.php (/admin/nahled.php)
<?
// není-li uživatel autorizován, vykopneme ho
if (!isset($PHP_AUTH_USER)):
echo "Neautorizovaný přístup";
exit;
endif;
// includneme funkce a spojíme se s databází
include "../conn.php";
include "../function.php";
// ověříme autorizaci
auth();
// select článku a informací o autorovi a rubrice
@$sql = mysql_query("SELECT C.nadpis,A.jmeno,A.email,R.rubrika,C.datum,
C.anotace,C.clanek,A.oautorovi
FROM clanky C, rubriky R, autori A
WHERE C.id_autor = A.id AND C.id_rubrika = R.id
AND C.id= $id");
// načtení výsledku z databáze
@$data = mysql_fetch_row($sql);
mysql_close($conn);
// zobrazíme stránku a v ní získaná data
head();
?>
<H3 ALIGN="CENTER"><? echo $data[0]; ?></H3>
<P><? echo $data[5]; ?></P>
<? echo $data[6]; ?>
<P>
Publikováno: <B><? echo date("d.m.Y",$data[4]); ?></B>
v rubrice <B><? echo $data[3]; ?></B>.
<B>Autor:</B>
<A HREF="mailto:<? echo $data[2]; ?>"><? echo $data[1]; ?></A>
</P>
<P><? echo $data[7]; ?></P>
<? foot(); ?>
|
|
Takže tímto jsme dokončili programování administrační části redakčního systému.
Všechny administrační skripty si můžete stáhnout v
zazipovaném archivu.
V příštích dvou dílech seriálu probereme klientskou část. První se bude zabývat
zobrazením seznamů článků s rozdělením do jednotlivých rubrik, zobrazením článků
dle autorů a nakonec zobrazení samotného článku. Druhý a poslední díl seriálu se
bude zabývat diskuzními fóry, přidáváním a zobrazením jednotlivých diskuzních
příspěvků.