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

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

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



PHP

Redakční systém VIII

redakcni system

26. července 2001, 00.00 | V posledním díle seriálu o redakčním systému si povíme o diskusích k jednotlivým článků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: \nReply-To: ");
               }
             }
         // 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.

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: