7. září 2001, 00.00 | Seriál navazující na seriál o Redakčním systému od Jirky Kocmana. Stávající systém tak rozšíříme o možnost generování článků na disk.
Jak jsem již slíbil, ukážeme si, jak generovat články na disk. Vypadat to bude asi takto: autor napíše článek, ten se
uloží do datadáze a je v ní tak dlouho, dokud není schválen k zobrazení. Teprve v tuto chvíli se generuje!
Co všechno se bude generovat? Nebude to celá tabulka, to by byl "pěknej matlajs", ale jen položky, které mají typ dat v
tabulce označen TEXT. Jedinnou výjimkou je nadpis (VARCHAR(256)). To je kvůli fultextovému vyhledávání. Je tak
postavené. Ještě si budeme generovat fora, konkrétně položky predmet a text. Ostatní snad raději generovat
nebudeme.
Není však problém si to připsat, ale jak říkám, nesmí to být moc velký "matlajs." Čím začneme? Asi generováním
článků. To se spustí po schválení článku (stav=="a"). Nejlépe to ukáže
samotný script.
korektura.php (./admin/korektura.php)
<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT");
// 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");
if(File_Exists("../clanky/n_$did.dat")):
@UnLink("../clanky/n_$did.dat");
@UnLink("../clanky/a_$did.dat");
@UnLink("../clanky/c_$did.dat");
@UnLink("../clanky/p_$did.dat");
endif;
}
// zobrazíme hlavičku stránky
head();
?>
<h3>Korektura</h3>
<?
if (!$id && !$send)
{
@$sql = mysql_query("SELECT C.id,C.nadpis,R.rubrika,A.jmeno,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><?
if($row[1]==""): @include "../clanky/n_$row[0].dat";
else: echo $row[1]; endif;?></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="korektura.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š článek 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");
if($clanek==" " || $nadpis=="" || $perex==" ")
mysql_query("DELETE FROM clanky WHERE id='$id'");
echo "<H3>Upraveno</H3>\n";
If($stav=="a")
{
$generuj="clanek";
include "./generuj.php";
}
// 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.dat";
?>
</SELECT>
</TD>
</TR>
<TR>
<TD><B>Rubrika:</B></TD>
<TD>
<SELECT NAME="rubrika">
<?
// vloží seznam rubrik
include "../inc/rubriky_admin.dat";
?>
</SELECT>
</TD>
</TR>
<TR>
<TD><B>Nadpis:</B></TD>
<TD><INPUT TYPE="TEXT" NAME="nadpis" SIZE="58" MAXLENGHT="250" VALUE="<?
If($data[6]==""): @include
"../clanky/n_$id.dat"; else: echo $data[6]; endif; ?>"></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Perex:</B></TD>
<TD><TEXTAREA NAME="perex" COLS="50" ROWS="4">
<? If($data[7]==""): @include "../clanky/a_$id.dat"; else:
echo $data[7]; endif; ?></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Článek:</B></TD>
<TD><TEXTAREA NAME="clanek" COLS="50" ROWS="20">
<? if($data[8]==""): @include "../clanky/c_$id.dat"; else:
echo $data[8]; endif; ?></TEXTAREA></TD>
</TR>
<TR>
<TD VALIGN="TOP"><B>Poznámka:</B></TD>
<TD><TEXTAREA NAME="poznamka" COLS="50" ROWS="4">
<? if($data[9]==""): @include "../clanky/p_$id.dat";
else: echo $data[9]; endif; ?></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);
?>
|
|
Podmínky na které jsem upozornil, jsem vysvětloval již minule, ale vezmu to ještě jednou. if($data[číslo]==""):
(pokud je proměnná $data[číslo] prázdná), include
"../clanky/(n,p,c,a)_$id.dat"; (načte se nadpis, článek... z
adresáře clanky). Else: echo $data[číslo]; (jinak se zobrazí obsah proměnné
$data[číslo]).
Pokud se ptáte co znamená ta podmínka, kde se dotazujeme na obsah proměnných $clanek
$perex a $nadpis, tak čtěte. Pokud článek nebude mít nadpis, anotaci či
samotný článek, tak bude smazán. Proč? Jednak proto, že by z něj čtenář nic neměl, a jednak proto, že pokud ho
schválí nějaký "neposlušný" korektor, nadělal by ve scriptu index.php
pěknou neplechu. Možná se vám nezdají ty dva mezerníky v podmínce ($clanky==" "
a $perex==" "). Nevím jak vám, ale mě, pokud jsem nechal volné místo objevily se
mi pak v těchto proměnných dva mezerníky. Vše by vyřešilo použitím funkce Chop().
Možná, že vám se to stávat nebude. V opačném případě by bylo na místě její použití. Nic tím nezkazíte.
If($stav=="a")
{
$generuj="clanek";
include "./generuj.php";
}
|
|
Toto je to, co způsobuje generování. Pokud je stav roven a, to jest, že článek je
schválen, tak se vytvoří soubory s
obsahy jednotlivých položek. Proč je to umístěno právě tam, kde to je? Je to proto, že potřebujeme, aby v databázi už
byl ten článek, co je schválen. To znamená, že musí být updatován. Krátce a jasně: formulář korektura.php musí být odeslán a stav musí
být a, aby se články začaly generovat. O obsahu scriptu generuj.php a větvi, kde generuj=="clanek" si povíme
příště.