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



PHP

Redakční systém - generování III.

redakcni system

9. října 2001, 00.00 | V tomto díle seriálu o redakčním systému si ukážeme jak zobrazit vygenerované články. Přidáním této vlastnosti do redakčního systému se můžeme urychlit načítání článků, ale i celkově odlehčit serveru..

Dnes si ukážeme jak má vypadat script index.php, aby se zobrazili vygenerované články.

Jedná se pouze o nahrazení výrazů typu echo $row[0]; výrazem typu @include "./clanky/n_$id.dat;, kde $row[0] a podobné prvky pole jsou proměnné ve kterých je umístěn nadpis, anotace nebo článek. Proč zde není naše známá podmínka? Je to z toho důvodu, že v návštěvnické části se zobrazují pouze schválené články a jak víme, tak schválený článek se generuje na disk a v databázi už není. Je tedy zbytečné ho tam hledat. Ještě bych chtěl upozornit na to, že při načítání souborů s obsahem nadpisu, anotace a článku musí být cesta pouze s jednou tečkou označující aktuální adresář. Jinak by to nefungovalo.
Zavináč před příkazem include, nám zajistí, že se nebude vypisovat žádná chybová hláška, pokud by byly problémy se čtením souboru. Práce zbytku scriptu je patrná z komentářů pana Kocmana.

<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT"); 
// 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 existuje proměnná $clanek zobrazíme článek. Ten musí být schválený
    // a čas vydání musí být menší nebo shodný s aktuálním
    if ($clanek > 0)
    {
      // select článku. Článek musí být aktivní a musí
     @$sql = mysql_query("SELECT A.jmeno,A.email,R.rubrika,C.datum,A.oautorovi FROM 
             clanky C, rubriky R, autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id 
             AND C.stav = 'a' AND datum <= $cas AND C.id = $clanek");

      // pokud nalezneme v databízi jeden záznam, zobrazíme článek
      if (mysql_num_rows($sql) == 1)
      {
        $data = mysql_fetch_row($sql);

        // přičteme počítadlo přečtení
        @$sql = mysql_query("UPDATE clanky SET counter = counter + 1 WHERE id = $clanek");
        // spočítáme příspěvky v diskuzi
        @$sql = mysql_query("SELECT count(*) FROM fora WHERE id_clanku = $clanek");
        $prispevku = mysql_result($sql,0,0);

        @mysql_free_result($sql);
        // zobrazíme článek
        ?>
        <H3 ALIGN="CENTER"><? @include "./clanky/n_$clanek.dat"; ?></H3>

        <? @include "./clanky/c_$clanek.dat";?>
        <P>
        Publikováno: <B><? echo date("d.m.Y",$data[3]); ?></B> v rubrice <B><? echo $data[2]; 
?></B>.
        <BR>
        <B>Diskuze:</B>
          <A HREF="forum.php?clanek=<? echo $clanek; ?>" >
        <?
          // pokud v diskuzi není příspěvek
          if ($prispevku == 0)
            { echo "žádný příspěvek"; }
          // pokud je v diskuzi jeden příspěvek
          elseif ($prispevku == 1)
            { echo "jeden příspěvek"; }
          // pokud jsou v diskuzi 2,3 nebo 4 příspěvky
          elseif ($prispevku > 1 && $prispevku < 5)
            { echo $prispevku . "příspěvky"; }
          // pokud je v diskuzi více než 4 příspěvky
          else
            { echo $prispevku . "příspěvků"; }
        ?>
        </A><BR>
        <B>Autor:</B> <A HREF="mailto:<? echo $data[1]; ?>"> <? echo $data[0]; ?></A>
        </P>
	<A HREF="nahled.php?id=<? echo $clanek ?> " TARGET="_blank">Náhled pro tisk</A>
        <P><? echo $data[4]; ?></P>
    <?
	}
      // pokud v databázi nenalezneme žádný článek
      else
      {
        ?><H1 ALIGN="CENTER">Článek neexistuje !!!</H1><?
      }
    }
    // pokud existuje proměnná $rubrika zobrazíme články rubriky
    elseif ($rubrika > 0)
    {
      @$sql = mysql_query("SELECT * FROM rubriky WHERE id = $rubrika");
      if (mysql_num_rows($sql) == 1)
      {
        @$data = mysql_fetch_row($sql);
        ?><H3 ALIGN="CENTER">Rubrika <? echo $data[1]; ?></H3><?
        // select přehledu článků
        @$sql = mysql_query("SELECT count(*) FROM clanky WHERE stav = 'a'
         AND datum <= $cas AND id_rubrika = $rubrika ORDER BY datum DESC, priorita DESC");
        // pokud je v databázi alespoň jeden článek
        if (mysql_result($sql,0,0) > 0)
        {
          odkazy(mysql_result($sql,0,0),$CL_PER_PAGE, "index.php?rubrika=".$rubrika."&");
          // select přehledu článků
          Mysql_free_result($sql);
          @$sql = mysql_query("SELECT C.id,C.datum, A.jmeno,A.id,count(F.id) FROM clanky C, 
           autori A LEFT JOIN fora F ON F.id_clanku = C.id WHERE C.id_rubrika = $rubrika AND
           C.id_autor = A.id AND C.stav = 'a' AND C.datum <= $cas GROUP BY C.id ORDER BY 
           C.datum DESC, C.priorita DESC LIMIT $odtud,$CL_PER_PAGE");
          // pro každý záznam z databáze zobrazíme získaná data
          while ($row = mysql_fetch_row($sql))
          {
          ?>
          <H3><A HREF="index.php?clanek=<? echo $row[0]; ?>"> 
          <? @include "./clanky/n_$row[0].dat"; 
?></A></H3>
          <DIV>
            <? @include "./clanky/a_$row[0].dat"; ?>
            <BR>
            <B>Publikováno:</B> <? echo date("d.m.Y",$row[1]); ?>. 
	<B>Autor</B>:
            <A HREF="index.php?autor=<? echo $row[3]; ?>"> <? echo $row[2]; ?></A><BR>
            <?
            if ($row[4] > 0)
            {
            ?>
              <B>Diskuze:</B> 
	<A HREF="forum.php?clanek=<? echo $row[0]; ?>">
            <?
             // pokud je v diskuzi jeden příspěvek
             if ($row[4] == 1)
               { echo "jeden příspěvek"; }
             // pokud jsou v diskuzi 2,3 nebo 4 příspěvky
             elseif ($row[4] > 1 && $row[4] < 5)
               { echo $row[4] . "příspěvky"; }
             // pokud je v diskuzi více než 4 příspěvky
             else
               { echo $row[4] . "příspěvků"; }
             echo "</A>"; 	
     	}
       ?>
	</DIV>
          <?
          }

          echo "<BR>".$odkazy;
          @mysql_free_result($sql);
        }

        else
        {
          ?><H1 ALIGN="CENTER">Nenalezeny žádné články !!!</H1><?
        }
      }

      else
      {
        ?><H1 ALIGN="CENTER">Rubrika neexistuje !!!</H1><?
      }
    }

    // pokud existuje proměnná $autor zobrazíme články autora
    elseif ($autor > 0)
    {
      @$sql = mysql_query("SELECT * FROM autori WHERE id = $autor");
      if (mysql_num_rows($sql) == 1)
      {
        @$data = mysql_fetch_row($sql);
        ?>
        <H3 ALIGN="CENTER">Autor:
          <A HREF="mailto:<? echo $data[4]; ?>">
          <? echo $data[3]; ?></A></H3>
        <?
        // select přehledu článků
        @$sql = mysql_query("SELECT count(*) FROM clanky WHERE stav = 'a' AND datum <= $cas
          AND id_autor = $autor ORDER BY datum DESC, priorita DESC");
        // pokud je v databázi alespoň jeden článek
        if (mysql_result($sql,0,0) > 0)
        {
          odkazy(mysql_result($sql,0,0),$CL_PER_PAGE, "index.php?autor=".$autor."&");
          // select přehledu článků
          @$sql = mysql_query("SELECT C.id,C.datum,R.id, R.rubrika,count(F.id) FROM clanky C, 
           rubriky R LEFT JOIN fora F ON F.id_clanku = C.id WHERE C.id_rubrika = R.id AND 
           C.id_autor = $autor AND C.stav = 'a' AND C.datum <= $cas GROUP BY C.id 
           ORDER BY C.datum DESC, C.priorita DESC LIMIT $odtud,$CL_PER_PAGE") 
             or die(mysql_error());
		  
          // pro každý záznam z databáze zobrazíme získaná data
          while ($row = mysql_fetch_row($sql))
          {
          ?>
          <H3><A HREF="index.php?clanek=<? echo $row[0]; ?>">
            <? @include "./clanky/n_$row[0].dat"; ?></A></H3>
          <DIV>
            <? @include "./clanky/a_$row[0].dat"; ?>
            <BR>
            <B>Publikováno:</B> <? echo date("d.m.Y",$row[1]); ?>
            v <B>rubrice</B>:
            <A HREF="index.php?rubrika=<? echo $row[2]; ?>">
              <? echo $row[3]; ?></A><BR>
            <?
            if ($row[4] > 0)
            {
            ?>
              <B>Diskuze:</B>
                <A HREF="forum.php?clanek=<? echo $row[0]; ?>">
            <?
             // pokud je v diskuzi jeden příspěvek
             if ($row[4] == 1)
               { echo "jeden příspěvek"; }
             // pokud jsou v diskuzi 2,3 nebo 4 příspěvky
             elseif ($row[4] > 1 && $row[4] < 5)
               { echo $row[4] . "příspěvky"; }
             // pokud je v diskuzi více než 4 příspěvky
             else
               { echo $row[4] . "příspěvků"; }
             echo "</A>";
            }
       
?>
            </DIV>
          <?
          }
          echo "<BR>".$odkazy;
        }

        else
        {
          ?><H1 ALIGN="CENTER">Nenalezeny žádné články !!!</H1><?
        }
      }

      else
      {
      ?><H1 ALIGN="CENTER">Autor neexistuje !!!</H1><?
      }
    }

    // jinak zobrazíme články ze všech rubrik i autorů.
    else
    {
      ?><H2 ALIGN="CENTER">Hlavní stránka našeho serveru</H2><?

      // select přehledu článků
      @$sql = mysql_query("SELECT count(*) FROM clanky WHERE stav = 'a' AND datum<= $cas 
	  ORDER BY datum DESC, priorita DESC");
      // pokud je v databázi alespoň jeden článek
      if (mysql_result($sql,0,0) > 0)
      {
        odkazy(mysql_result($sql,0,0),$CL_PER_PAGE,"index.php?");
        // select přehledu článků
        @$sql = mysql_query("SELECT C.id,C.datum, A.jmeno,A.id,count(F.id),R.id,R.rubrika 
         FROM clanky C, rubriky R, autori A LEFT JOIN fora F ON F.id_clanku = C.id WHERE 
         C.id_rubrika = R.id AND C.id_autor = A.id AND C.stav = 'a' AND C.datum <= $cas 
         GROUP BY C.id ORDER BY C.datum DESC, C.priorita DESC LIMIT $odtud,$CL_PER_PAGE");
        // pro každý záznam z databáze zobrazíme získaná data
        while ($row = mysql_fetch_row($sql))
        {
        ?>
        <H3><A HREF="index.php?clanek=<? echo $row[0]; ?>">
          <? @include "./clanky/n_$row[0].dat"; ?></A></H3>
        <DIV>
          <? @include "./clanky/a_$row[0].dat"; ?>
          <BR>
          <B>Publikováno:</B> <? echo date("d.m.Y",$row[1]); ?>
             v <B>rubrice</B>:
          <A HREF="index.php?rubrika=<? echo $row[5]; ?>">
             <? echo $row[6]; ?></A><BR>
          <B>Autor</B>:
          <A HREF="index.php?autor=<? echo $row[3]; ?>">
             <? echo $row[2]; ?></A><BR>
          <?
          if ($row[4] > 0)
          {
            ?><B>Diskuze:</B>
              <A HREF="forum.php?clanek=<? echo $row[0]; ?>"><?
            // pokud je v diskuzi jeden příspěvek
            if ($row[4] == 1)
              { echo "jeden příspěvek"; }
            // pokud jsou v diskuzi 2,3 nebo 4 příspěvky
            elseif ($row[4] > 1 && $row[4] < 5)
              { echo $row[4] . "příspěvky"; }
            // pokud je v diskuzi více než 4 příspěvky
            else
              { echo $row[4] . "příspěvků"; }
            echo "</A>";
          }
          	?></DIV><?
        }

	echo "<BR>".$odkazy;
        @mysql_free_result($sql);
      }

      else
      {
      ?><H1 ALIGN="CENTER">Nenalezeny žádné články !!!</H1><?
      }
    }
?>
    <!-- pravý slopec - konec -->
  </TD>
</TR>
</TABLE>

<?
foot();
mysql_close($conn);
?>


Pro ukázku si předvedeme co se děje pokud se zobrazuje článek. Pokud dostaneme v proměnné $clanek hodnotu vyšší než 0, zobrazíme článek s id které je hodnotou proměnné $clanek. Z tabulky autori vybereme jmeno email a něco oautorovi. Z tabulky rubriky vybereme položku rubrika. Z tabuky clanky vyberem datum. Musí být splněny tyto podmínky: Položka id_autor z tabulky clanky se musí shodovat s id v tabulce autori. Id_rubrika z tab. clanky musí být stejné jako id z rubriky. Článek musí být schválený (stav z clanky musí být a). Položka datum z clanky musí být menší než aktuální datum a hlavně se id článku musí shodovat s obsahem proměnné $clanek. Pokud v databázi nalezneme jeden článek načteme výsledek dotazu do proměnné $data. Článku přidáme jeden přístup tak, že v tabulce clanky zvýšíme položku counter o jednu. Následně spočítáme příspěvky v databázi pro tento článek a pomocí fce MySQL_Result() s parametry výsledek, záznam a položka záznamu zjistíme, kolik jich vlastně je. Do vycentrovaného nadpisu velikosti tři načteme soubor n_$id.dat, kde $id nahrazuje číslo článku. V tomto souboru je nadpis. Jako další zobrazíme soubor c_$id.dat kde se ukrývá samotný článek. V položce $data[3] máme kolik sekund uběhlo od 1.1. 1970 do doby než byl článek schválen. To asi moc lidí nezajímá a tak to fce Date() převede na lidské datum ve formátu DD.MM.RRRR, což už je pro normálního smrtelníka přijatelné. Za touto informací dáme název rubriky ve které se článek nalézá, tedy $data[2]. Následující podmínky zajišťují správný tvar slova příspěvek. Je sice dobré mít jeden příspěvek, ale mít k článku nula, tři nebo dvanáct příspěvek není asi dobré. A to nám tato podmínka řeší. Dále dáme k dispozici jméno ($data[0]) a email ($data[1]). Přidáme náhled pro tisk a $data[4], tady něco o autorovi. Pokud je připojen obrázek ve formátu JPEG nebo GIF zobrazíme ho v plné velikosti. Upload obrázků přidám v některém dalším díle. Jestliže článek na který ukazuje hodnota proměnné $clanek v databázi nenalezneme, vypíšeme chybovou hlášku. Toť vše. Jak jednoduché, že?
Script ještě budeme upravovat. Není finální, ale měl by fungovat (alespoň doufám, že vám bude, mě ano).
Přidáme ještě kaskádové styly, fultextové vyhledávání, pár drobností pro aktuálnost a zobrazování obrázků, jejiž upload jsem nedávno dodělal.

Dnes to bylo trochu delší a tak příště to zkrátíme a ukážeme si obsah scriptu levy.php.

Chtěl bych poprosit všechny, kteří mají nějaký nápad jak RS ještě vylepšit, nechť mi ho zašlou a já se ho pokusím nějak uvést do praxe. Vaše návrhy čekám na mém . Děkuji.

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

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

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

 

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

Uživatelské jméno:

Heslo: