Redakční systém VI. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



PHP

Redakční systém VI.

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ů.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: