Jak na vlastní katalog stránek v PHP – zařazení odkazu

11. dubna 2001

V jednom z předchozích článků jsme si naimplementovali uživatelské přidání odkazu. Nyní se zaměříme na to, co s takovým nově přidaným odkazem provede správce katalogu. Ten bude mít k dispozici skript, pomocí kterého si bude moci zobrazit seznam nových odkazů. Každý odkaz buď rovnou zařadí do katalogu, nebo jej před zařazením mírně zedituje, nebo daný odkaz, pokud ho zhledá nevhodným, vymaže.

Opět se budu snažit uvést nejjednoduší řešení, i za cenu toho, že možná nebude nejelegantnější. Různá vylepšení už pak nechám na vás.

Pomocné funkce

Tak jako v předchozím díle, budeme také zde potřebovat pomocné funkce. Jednou z  nich bude určitě funkce get_new_id, která tentokrát bude vracet nové ID pro záznam v tabulce ODKAZ (v minulém díle to byla tabulka ZADOSTI). Tato funkce vypadá velmi obdobně:

function get_new_id {
  $id = 0;
  $tmp = mysql(„katalog“, „SELECT MAX(id) AS maxim FROM odkaz“);
  $pocet = mysql_num_rows($tmp);
  if (!$pocet) {
    $id = 1;
  }
  else {
    $id = mysql_result($tmp, 0, „maxim“);
    $id++;
  }
  return $id;
}

Další pro nás velmi užitečnou funkcí bude get_count() vracející počet záznamů v tabulce ZADOSTI. Tuto funkci využijeme na mnoha místech našeho skriptu:

function get_count {
  $pocet = 0;
  mysql_connect(„localhost“);
  $tmp = mysql(„katalog“, „SELECT COUNT(*) AS pocet FROM zadosti“);
  $pocet = mysql_result($tmp, 0, „pocet“);
  if (!$pocet) {
    $pocet = 0;
  }
  mysql_close;
  return $pocet;
}

Při vkládání záznamu do tabulky ODKAZ potřebujeme ještě vygenerovat pomocný řetězec z položek NAZEV a POPIS, odstranit diakritiku a tento řetězec se stane hodnotou atributu ASCII_TEXT (jistě si vzpomenete, že nad tímto atributem se provádí vyhledávání). Protože tento kód budeme potřebovat v našem skriptu několikrát, uděláme se na něj funkci get_ascii(ret1, ret2):

function get_ascii ($ret1, $ret2) {
  $tmp = $ret1 . $ret2;
  $retezec = StrTr($tmp, „áäčďéěëíňóöřšťúůüýžÁÄČĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽ“,
    „aacdeeeinoorstuuuyzAACDEEEINOORSTUUUYZ“);
  return $retezec;
}

Protože dáváme administrátorovi možnost libovolný nový odkaz upravit, neměli bychom tedy ani tady zapomenout na testy, zda název, popis, url, e-mail, atd., jsou zapsány korektně. Pro výrazné zjednodušení ukázek v dnešním článku budu předpokládat, že se administrátor při editaci nedopustí žádné chyby. (V praxi se to ale stát může, a tedy ošetření korektnosti všech hodnot udělat musíte. V předchozím díle jste se dověděli jak. Ten postup bude úplně stejný).

Úvodní stránka skriptu

Pustí-li se skript zarad_odkazy.php poprvé (tj. bez žádných parametrů), zobrazí se úvodní stránka, na které budou dva odkazy a informace, kolik nových odkazů bylo přidáno. Příklad ukazuje obrazek:

Jak bude skript pracovat?

Ve skriptu budeme mít dvě akce. První (hromadné zařazení odkazů) bude určena pro takové odkazy, u kterých administrátor nazná, že jsou vyplněny v  pořádku. Všechny odkazy se zobrazí jako seznam, u každého odkazu bude checkbox, který administrátor zaškrtne, bude-li chtít daný odkaz (beze změn!) uložit do katalogu. Pod seznamem bude tlačíko „Zařadit“, po jehož stisku se znovu zavolá skript, který vezme všechny zaškrtnuté záznamy a hromadně je přesune z tabulky ZADOSTI do tabulky ODKAZ. (Ty odkazy, které zůstaly nezaškrtnuté, zůstanou nadále v tabulce ZADOSTI a administrátor bude mít možnost s nimi operovat pomocí druhé akce.)

Samozřejmě se může stát, že se některé nově přidané odkazy nebudou administrátorovi líbit a buď se je rozhodne zařadit až po malé editaci, a nebo úplně zrušit. K tomuto úkolu bude sloužit druhá akce (procházení jednotlivých záznamů). Skript vybere právě první záznam z tabulky ZADOSTI, přehledně jej zobrazí (tentokrát v editovatelném formuláři). Pod zobrazeným záznamem se budou vyskytovat dvě tlačítka: „Zařaď“ a „Smaž“. Po stisku prvního se aktuální obsah daného záznamu (který mohl být administrátorem předtím zeditován) uloží a zobrazí se další záznam z tabulky ZADOSTI, a postup se opakuje. Stiskem druhého tlačítka se záznam nenávratně smaže a zobrazí se další záznam z tabulky ZADOSTI. Celý postup bude probíhat tak dlouho, dokud bude co kontrolovat.

Obě akce budou proveditelné pouze v případě, že v tabulce ZADOSTI je uložen alespoň jeden odkaz.

Struktura skriptu

Základním parametrem, který nám bude rozlišovat, co se má provádět za akci, bude opět parametr AKCE. Je-li hodnota parametru AKCE nedefinována (skript volán poprvé), zobrazí se úvodní stránka. Bude-li hodnota parametru akce=hromadn, pak se bude provádět první akce, akce=jednotl zajistí provádění druhé akce.

<?php
/* kostra skriptu — zarad_odkazy.php */
/* (1) uvodni stranka */
if (!$akce) {
  if (get_count()>0) {
    /* zobraz odkazy na obe akce */
  }
  /* zobraz informaci, kolik zaznamu je ulozeno v tabulce ZADOSTI */
}
/* (2) hromadne zarazeni odkazu */
if (($akce) && ($akce == ‚hromadn‘)) {
  /* zpracujeme zakliknute odkazy z predchoziho volani skriptu */
  if (get_count()>0) {
    /* zobrazime seznam zbyvajicich odkazu k zarazeni */
  }
  else {
    /* neni jiz co zarazovat, vypiseme hlasku */
  }
}
/* (3) jednotlive zpracovani zaznamu */
if (($akce) && ($akce == ‚jednotl‘)) {
  /* zpracujeme zaznam z predchoziho volani skriptu */
  if (get_count()>0) {
    /* zobrazime dalsi zaznam na zpracovani */
  }
  else {
    /* neni jiz co zpracovavat, vypiseme hlasku */
  }
}
?>

(1) úvodní stránka

Následuje kód první části. Kód je relativně jednoduchý, takže jej nebudu už blíže komentovat:

/* (1) uvodni stranka */
if (!$akce) {
  if (get_count()>0) {
    print „<UL>“;
    print „<LI> <A HREF=\“zarad_odkazy.php?akce=hromadn\“>Hromadné zařazení odkazů</A>“;
    print „<LI> <A HREF=\“zarad_odkazy.php?akce=jednotl\“>Procházení jednotlivých záznamů&lt/A>“;
    print „</UL>“;

    print „<HR SIZE=1 NOSHADE>“;
  }
  $p = get_count();
  print „V tabulce ZADOSTI je uloženo $p odkazů<BR>“;
}

(2) hromadné zařazení odkazů

Jak bude pracovat tato část skriptu jsem již popsal výše. Ještě doplním, že zobrazený odkaz je vhodné udělat klikací (tag <A> s atributem TARGET=_top pro otevření stránky v novém okně prohlížeče), aby si administrátor mohl příslušnou stránku před zařazením prohlédnout. U každého odkazu bude checkbox se jménem ODKAZ, jehož předávanou hodnotou bude ID nového odkazu (tak jak je uveden v tabulce ZADOSTI). IDy odkazů, které budeme chtít zařadit, budeme mít na vstupu skriptu v poli. V rámci této akce máme tedy formulář s tlačítkem „Zařadit“. Pokud pro toto tlačítko použijeme název AKCE, ztratíme informaci o původní hodnotě AKCE, která nám říká, že jsem v části skriptu „hromadného zařazení odkazů“. Proto zvolíme název tlačítka jako UKOL. (chápejte jej jako podakci v rámci dané akce). Následující kód je už delší, takže se budu snažit vložit komentáře přímo do něj.

/* (2) hromadne zarazeni odkazu */
if (($akce) && ($akce == ‚hromadn‘)) {
  /* zpracujeme zakliknute odkazy z predchoziho volani skriptu */
  if (($ukol) && ($ukol == ‚Zařadit‘)) {

    mysql_connect(„localhost“);
    /* zpracujeme kazdy odkaz predany v poli $odkaz */
    for ($i = 0; $i < Count($odkaz); $i++ ) {
      /* nejprve zjistime a dopocteme informace o odkazu */
      $dotaz = „SELECT nazev, popis, url, sekce_id, email, ulozeno, heslo
        FROM zadosti WHERE id = $odkaz[$i]“;

      $novy_odkaz = mysql(„katalog“, $dotaz);

      $nazev = mysql_result($novy_odkaz, 0, „nazev“);
      $popis = mysql_result($novy_odkaz, 0, „popis“);
      $url = mysql_result($novy_odkaz, 0, „url“);
      $email = mysql_result($novy_odkaz, 0, „email“);
      $sekce_id = mysql_result($novy_odkaz, 0, „sekce_id“);
      $modifikovano = mysql_result($novy_odkaz, 0, „ulozeno“);
      $heslo = mysql_result($novy_odkaz, 0, „heslo“);

      $ascii_text = get_ascii ($nazev, $popis);
      $kval_pocet = 0;
      $kval_prum = 0;
      $dostupnost = ‚A‘;

      $id = get_new_id();
      /* pripravime si prikaz INSERT pro vlozeni noveho odkazu do tabulky ODKAZ */
      $prikaz = „INSERT INTO odkaz VALUES ($id, ‚$nazev‘, ‚$popis‘, ‚$url‘, ‚$ascii_text‘,
      $kval_pocet, $kval_prum, ‚$dostupnost‘, $sekce_id, ‚$email‘, ‚$modifikovano‘,
      ‚$heslo‘);
      /* vlozime odkaz do tabulky ODKAZ */
      mysql(„katalog“, $prikaz);

      if (mysql_errno() == 0) {
        /* pokud $prikaz probehl uspesne, muzeme odkaz z tabulky ZADOSTI vymazat */
        $smazat = „DELETE FROM zadosti WHERE id = $odkaz[$i]“;
        mysql(„katalog“, $smazat);
        print „Odkaz $odkaz[$i] byl úspěšně vložen do katalogu<BR>“;
      }
      else {
        /* odkaz se nam nepodarilo uspesne vlozit do tabulky ODKAZ */
        /* proto nemuzeme tento odkaz z tabulky ZADOSTI vymazat */
        print „Při práci s databází došlo k chybě, odkaz neuložen“;
      }

    }
    mysql_close;
  }
  if (get_count()>0) {
    /* zobrazime seznam zbyvajicich odkazu k zarazeni */
    print „<FORM ACTION=\“zarad_odkazy.php\“ METHOD=\“get\“>“;
    mysql_connect(„localhost“);

    /* dotaz na vsechny nove pridane odkazy v tabulce ZADOSTI */
    $dotaz_na_odkazy = „SELECT zadosti.id AS cislo, zadosti.nazev AS z_nazev,
      zadosti.popis AS z_popis, url, sekce.nazev AS s_nazev,
      e_mail, ulozeno
      FROM zadosti, sekce
      WHERE zadosti.sekce_id = sekce.id“;

    $seznam_odkazu = mysql(„katalog“, $dotaz_na_odkazy);
    $pocet_odkazu = mysql_num_rows($seznam_odkazu);

    print „<OL>“;

    for ($i = 0; $i < $pocet_odkazu; $i++) {

      $cislo = mysql_result($seznam_odkazu, $i, „cislo“);
      $z_nazev = mysql_result($seznam_odkazu, $i, „z_nazev“);
      $z_popis = mysql_result($seznam_odkazu, $i, „z_popis“);
      $url = mysql_result($seznam_odkazu, $i, „url“);
      $s_nazev = mysql_result($seznam_odkazu, $i, „s_nazev“);
      $email = mysql_result($seznam_odkazu, $i, „email“);
      $ulozeno = mysql_result($seznam_odkazu, $i, „ulozeno“);

      print „<LI>“;
      print „<INPUT TYPE=\“checkbox\“ NAME=\“odkaz[]\“ VALUE=\“$cislo\“>“;
      print „<A HREF=\“$url\“>$z_nazev</A><BR>“;
      print „$z_popis<BR>$url<BR>“;
      print „sekce: $s_nazev, vložil: $email, dne: $ulozeno“;

    }

    print „</OL>“;
    print „<INPUT TYPE=\“submit\“ NAME=\“ukol\“ VALUE=\“Zařadit\“>“;
    print „</FORM>“;
  }
  else {
    /* neni jiz co zarazovat, vypiseme hlasku */
    print „V tabulce ZADOSTI již není žádný nově přidaný odkaz“;
  }
}

(3) individuální zpracování záznamů

Tato část nám zobrazí na stránce vždy jen jeden odkaz (a to ten první v tabulce ZADOSTI). Struktura této části skriptu bude velmi podobná s tím, že vždy zpracováváme jeden záznam (a ne více) a obsah daného záznamu je editovatelný ve formuláři. Popis této části jsem již uvedl výše.

Protože tato část kódu je opravdu velmi podobná té předchozí, uvedu již pouze „pseudokód“, ve kterém slovně popíši, co se má provést. Konkrétní napsání kódu už tak nechám na vás.

/* (3) jednotlive zpracovani zaznamu */
if (($akce) && ($akce == ‚jednotl‘)) {
  /* zpracujeme zaznam z predchoziho volani skriptu */
  if (($ukol) && ($ukol == ‚Smaž‘)) {

    /* smazeme dany zaznam z tabulky ZADOSTI, prislusny prikaz vypada takto:
    DELETE FROM zadosti WHERE id = $id
    za predpokladu, ze v $id mame cislo zpracovaneho odkazu z predchoziho volani skriptu
    */

  }

  if (($ukol) && ($ukol == ‚Zařaď‘)) {
    /* temer stejne, jako obsah tela cyklu FOR pro jeden zpracovavany odkaz, tj. */
    /* k danemu $id zjistite vsechny informace z tabulky ZADOSTI,
     nektere informace dopocitate (kvalita_prum = 0, kvalita_pocet = 0,
     dostupnost = ‚A‘, ascii_text = get_ascii($nazev, $popis))
     a provedete INSERT do tabulky ODKAZ
    */

    /* pokud se INSERT provede uspesne, tj. mysql_errno() == 0, pak
     smazete zaznam z tabulky ZADOSTI:
     DELETE FROM zadosti WHERE id = $id
     jinak se vypise hlaska a zaznam z tabulky ZADOSTI se nesmaze
    */

  }

  if (get_count()>0) {
    /* zobrazime dalsi zaznam na zpracovani */

    /* vezmeme 1. zaznam z tabulky ZADOSTI, ten ziskame timto dotazem:
    SELECT id, nazev, popis, url, sekce_id, e_mail, ulozeno FROM zadosti LIMIT 1;
    */

    /* provedeme prislusny mysql prikaz, hodnoty si ulozime do promennych $id, $nazev,
     $popis, $url, …
    */

    /* zobrazite formular pro tento zaznam, s tim, ze nektere udaje
     udelate editovatelne – napr. editovatelny nazev zapise takto:
     <INPUT TYPE=\“text\“ NAME=\“nazev\“ VALUE=\“$nazev\“>
     tj. date hodnotu promenne $nazev jako defaultni hodnotu prvku
     formulare
    */

    /* pridate 2 tlacitka pro podakci, ktera se ma provest:
     <INPUT TYPE=\“submit\“ NAME=\“ukol\“ VALUE=\“Zařaď\“>
     <INPUT TYPE=\“submit\“ NAME=\“ukol\“ VALUE=\“Smaž\“>
    */

  }
  else {
    /* neni jiz co zpracovavat, vypiseme hlasku */
  }
}

Závěrem

Ke třetí části bych uvedl ještě jednu malou poznámku. V editovatelném formuláři, ve kterém je zobrazen obsah zpracovávaného záznamu, je také editovatelné číslo sekce. Protože by jistě bylo výhodnější místo čísla pracovat s názvy, můžete v  tomto místě vygenerovat prvek formuláře <SELECT>, v němž bude zobrazen seznam všech názvů sekcí. Postup, jak udělat tento prvek SELECT se seznamem sekcí, je uveden v předchozím díle.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

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 *