Redakční systém - generování - 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 - generování

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

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: