Jak na vlastní katalog stránek v PHP – sekce a odkazy

19. března 2001

Ve druhém článku o tvorbě vlastního katalogu jsme si řekli, jak zobrazit úvodní stránku. Nyní se podíváme na implementaci zobrazení obsahu sekce, když uživatel na hlavní stránce klikne na nějakou sekci (a zavolá tak náš skript index.php s parametrem „sekce“).

Obsah sekce

Zobrazení obsahu sekce můžeme rozdělit celkem do tří částí. Nejvýše na stránce bude umístěna „cesta“ k dané vnořené sekci. Cestou mám na mysli řetězec složený z názvů sekcí, postupně, jak jsme se jimi proklikali. Příklad uvádí následující obrázek:

Každý název nadřazené sekce v cestě bude samozřejmě klikací, aby uživatel měl možnost kdykoliv se dostat o libovolnou úroveň výš. Dále skriptem zobrazíme seznam přímých podsekcí. U každé z nich uvedeme v závorce počet v ní zařazených přímých odkazů. Seznam podsekcí pro MySQL by mohl vypadat takto:

Poslední, co pro danou sekci zobrazíme (např. pod dělící čárou), bude seznam odkazů v ní zařazených. Ty mohou být zobrazeny například tak, jak uvádí následující příklad:

Jak je z obrázků patrné, čekají nás celkem tři podproblémy, které musíme postupně vyřešit. Nejprve vyřešme druhý a třetí, teprve potom se vrhněme na první. Ten je totiž o něco náročnější, než zbývající dva.

Zobrazení seznamu podsekcí

Důležitou skutečností je fakt, že máme na vstupu zadán parametr SEKCE, jehož hodnotou je číslo sekce, na jejiž název uživatel klikl a kterou chceme zobrazit. K hodnotě tohoto parametru se dostaneme automaticky přes proměnnou $sekce. Nad databází položíme dotaz na všechny přímé podsekce zadané sekce a tento seznam pak zobrazíme. Ještě zopakuji základní strukturu skriptu:

<?php
$zobraz_uvodni = 0;
/* bude rovno 1, jestlize nebyl predan zadny parametr: */
if (!$sekce) {
  $zobraz_uvodni = 1;
}
/* hlavni cast skriptu */
if ($zobraz_uvodni) { /* nebyl predan parametr ‚sekce‘ */
  /* zobrazime uvodni stranku */
}
else {
  /* „rozbalime“ vybranou sekci */
}
?>

Narozdíl od předchozího dílu se nyní budeme nacházet v poslední části, kde máme uvedený komentář /* „rozbalime“ vybranou sekci */.

/* zobrazeni seznamu podsekci sekce dane parametrem $sekce — index.php */
/* ptame se na seznam vsech podsekci, chceme jejich cisla, nazvy a pocty odkazu */
$dotaz = „SELECT id, nazev, pocet
  FROM sekce, vazby_sekce
  WHERE vazby_sekce.nadsekce_id = $sekce
  AND vazby_sekce.podsekce_id = sekce.id“;
mysql_connect(„localhost“);
$podsekce = mysql(„katalog“,$dotaz);
$pocet_podsekci = mysql_num_row($podsekce);
print „<UL>“;
for ($i=0; $<=$pocet_podsekci; $i++) {
  $cislo = mysql_result($podsekce, $i, „id“);
  $jmeno = mysql_result($podsekce, $i, „nazev“);
  $odkazu = mysql_result($podsekce, $i, „pocet“);
  /* pro kazdou podsekci zobrazime klikatelny odkaz */
  print „<LI> <A HREF=\“index.php?sekce=$cislo\“>$jmeno</A> ($odkazu)“;
}
mysql_close;
print „</UL>“;
/* zobrazime delici caru, za ni budou nasledovat odkazy */
print „<HR SIZE=2 NOSHADE>“;

Seznam odkazů

Nyní se podívejme na základní zobrazení seznamu odkazů (tj. zatím bez možnosti hlasování o kvalitě). Ukázka kódu bude velmi podobná, resp. snad i o něco jednodušší, takže ji zde uvedu jen v krátkosti, bez komentářů:

/* zobrazeni odkazu v sekci dane parametrem $sekce — index.php */
$dotaz = „SELECT nazev, popis, url
  FROM odkaz
  WHERE sekce_id = $sekce“;

mysql_connect(„localhost“);
$odkazy = mysql(„katalog“,$dotaz);
$pocet = mysql_num_rows($odkazy);
print „<BR>V této sekci bylo nalezeno: <B>$pocet</B> záznamů<BR>“;
print „<UL>“;
for ($i=0; $i<=$pocet; $i++) {
  $nazev = mysql_result($odkazy, $i, „nazev“);
  $popis = mysql_result($odkazy, $i, „popis“);
  $url = mysql_result($odkazy, $i, „url“);

  print „<LI> <A HREF=\“$url\“ TARGET=\“_top\“>$nazev</A><BR>“;
  print „$popis<BR>“;
  print „<A HREF=\“$url\“ TARGET=\“_top\“>$url</A>“;
}
mysql_close;
print „</UL>“;

Zobrazení klikatelné „cesty“

Vraťme k našemu prvnímu podproblému. Na vstupu máme číslo aktuální sekce a pomocí něho se musíme dopracovat až k číslu hlavní sekce, která již nemá žadnou nadřazenou. Při řešení tohoto úkolu budeme operovat zejména s tabulkou VAZBY_SEKCE (a i s tabulkou SEKCE, kvůli zjištění názvů).

Nejprve se podíváme do sloupce PODSEKCE a najdeme v něm číslo aktuální sekce. K  němu tedy hned zjistíme k jaké nadřazené sekci patří. Podíváme se, zdali tato nadřazená sekce má také svou nadřazenou. Pokud ne, skončili jsme, vygenerovali jsme tedy cestu až k hlavní sekci. Pokud má další nadřazenou, musíme opět testovat, zdali ta nadřazená nemá ještě další nadřazenou a tak dál.

Vezmu-li náš příklad z úvodního obrázku, máme vybranou sekci MySQL (té odpovídá nějaké číslo). Z tabulky VAZBY_SEKCE zjistíme, že její nadřazenou sekcí je sekce Systémy. Při opětovné aplikaci tohoto postupu zjistíme, že sekce Systémy má nadřazenou sekci Databáze. Sekce Databáze má v tabulce SEKCE nastaven příznak, že je hlavní (nemá už žádnou nadřazenou) a tak jsme mohli postup ukončit. Postupně jsme vygenerovali řetězec MySQL – Systémy – Databáze. Ve skriptu pak zajistíme, aby se názvy sekcí vypsaly v opačném pořadí. To už ale není příliš velký problém. Následujicí fragment kódu okomentuji:

/* zobrazeni klikatelne cesty reprez. zanoreni sekce — index.php */
$proved = 1; /* pomocna promenna, je-li 1, provede se test na nadrazenou sekci */
$cesta = “; /* sem budeme generovat retezec klikatelnych nazvu sekci */
mysql_connect(„localhost“);
$info = mysql(„katalog“, „SELECT nazev FROM sekce WHERE id = $sekce“);
$nazev = mysql_result($info, 0, „nazev“);
$cesta = „<A HREF=\“index.php?sekce=$sekce\“>$nazev</A>“;
$pom_sekce = $sekce; /* pracovni promenna */
while ($proved) { /* dokud nenarazime na hlavni sekci */
  /* nejprve otestujeme zda_li $pom_sekce je hlavni, pokud ano, vyskocime z 
  cyklu */

  $hlavni = mysql(„katalog“,“SELECT koren FROM sekce
    WHERE id = $pom_sekce AND koren = ‚Y'“);
  /* pokud je hlavni, pak mysql_num_rows() vrati prave cislo 1, jinak 0 */
  $je_hlavni = mysql_num_rows($hlavni);

  if ($je_hlavni) {
    $proved = 0; /* jiz neni dalsi nadrazena */
  }
  else {
    /* zjisti ID a NAZEV nadrazene sekce */
    $nadraz = mysql(„katalog“, „SELECT nadsekce_id FROM vazby_sekce
      WHERE podsekce_id = $pom_sekce“);
    $pom_sekce = mysql_result($nadraz, 0, „nadsekce_id“);

    $nazev_s = mysql(„katalog“, „SELECT nazev FROM sekce WHERE id = $pom_sekce“);
    $nazev = mysql_result($nazev_s, 0, „nazev“);

    /* a pridej ji do klikatelne cesty */
    $cesta = „<A HREF=\“index.php?sekce=$pom_sekce\“>$nazev</A> -> „.$cesta;

    $proved = 1; /* testuj dalsi nadrazenou */
  }
}
mysql_close;
print „<BR>$cesta<BR>“;

Znovu podotýkám, že jsem uvedené ukázky kvůli přehlednosti nezatěžoval testováním chybových výstupů. Tímto jsme probrali základní zobrazení sekce a příště se budeme věnovat samostatné kapitole, a to jednoduchému vyhledávání nad odkazy.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *