Jak zobrazovat aktuální měnové kurzy

30. ledna 2002

Chcete obohatit své stránky o informace, které se budou automaticky aktualizovat? Popíši vám to na příkladu v PHP, s jehož pomocí můžete doplnit své stránky o aktuální kurzovní lístek České národní banky.

Základním požadavkem je server, který podporuje v podstatě jakékoli server side skriptování. V tomto případě bude použito PHP, ale jak již jsem nastínil, není problém stejným postupem využít například perlovských CGI skriptů nebo ASP. Nejdůležitějším bodem naší práce bude získat aktuální kurzovní lístek, ze kterého bychom mohli vycházet. Přesně takový nabízí ke stažení ČNB na svých webových stránkách. Jeho adresa je: http://wdb.cnb.cz/CNB_TXT/KURZY.K_CURRTXT. Jedná se o obyčejný textový soubor, který vypadá zhruba následovně:

17.01.2002 #12
zeme|mena|mnozstvi|kod|kurz
Australie|dolar|1|AUD|18,904
Dansko|koruna|1|DKK|4,357
EMU|euro|1|EUR|32,375
Japonsko|jen|100|JPY|27,801
Kanada|dolar|1|CAD|22,742
MMF|SDR|1|XDR|46,028
Madarsko|forint|100|HUF|13,282
Norsko|koruna|1|NOK|4,099
Novy Zeland|dolar|1|NZD|15,467
Polsko|zloty|1|PLN|8,803
Slovensko|koruna|100|SKK|76,486
Slovinsko|tolar|100|SIT|14,704
Svedsko|koruna|1|SEK|3,489
Svycarsko|frank|1|CHF|22,080
USA|dolar|1|USD|36,717
Velka Britanie|libra|1|GBP|52,701

První řádek obsahuje datum, pro který je aktuální kurzovní lístek platný. Číslo za křížkem udává pořadové číslo kurzovního lístku v měsíci (resp. bankovní den, mezi které nepatří víkendy a státní svátky). Druhý řádek popisuje jednotlivé sloupce v následujících řádcích, kterými jsou: země, ve které měna platí, název měny, množství, kód (zkratka) měny a kurz. Trošku se pozastavím nad položkami množství a kurz. Jistě jste si všimli, že v položce kurz je uváděno pouze jedno číslo, ale ve směnárnách vídáte i šest různých hodnot (výkup, střední, nákup, valuty/devizy). V našem případě se jedná o průměrný kurz, který se může lišit od kurzu v jednotlivých bankách a směnárnách. Množství udává, kolik cizí měny dostanete za tolik Kč, kolik je uvedeno v položce kurz.

Nyní znáte strukturu i adresu souboru, takže se můžete pustit do práce, jejímž výsledkem bude úhledná HTML tabulka s přehledem kurzů pro nejdůležitější měny (americký dolar, slovenská koruna, britská libra, švýcarský frank a samozřejmě euro). Další měny v našem příkladu nepoužiji, můžete je jednoduše doplnit sami.

Funkce skriptu bude následující: Nejdříve si „sáhnete“ pro textový soubor na server ČNB, který načtete do pole (každý řádek bude v jedné položce pole). Na závěr činnosti skriptu uložíte HTML soubor, který později použijete jako include do stránek serveru.

Jelikož se kurzovní lístek mění pouze jednou denně, je zbytečné, aby se skript generující HTML tabulku s aktuálními kurzy spouštěl pokaždé, když by se měla zobrazit kurzovní tabulka. Proto ukládejte výsledek skriptu na disk do souboru. Můžete ho pak použít nesčetněkrát kdekoli bude potřeba, bez nutnosti stahovat soubor z cizího serveru (v případě nedostupnosti by docházelo ke zpomalení běhu skriptu). Z tohoto důvodu bude nejlepší tento skript spouštět automaticky například každý všední den ráno pomocí cronu (nejsem si přesně jist, v kolik hodin se soubor s kurzovním lístkem aktualizuje). Ti, kdo přístup k tomuto systémovému démonu nemají, budou muset použít jiný mechanismus spouštění skriptu.

Nejdříve si vytvořte HTML tabulku, která bude obsahovat všechny důležité údaje – v našem případě využijete pouze tři položky: kód, množství a kurz. Tabulka bude vytvořena ze dvou HTML šablon. První bude základní struktura tabulky s hlavičkou a druhá bude jeden řádek tabulky.

Šablona hlavičky tabulky

<table border=“0″ cellspacing=“0″ cellpadding=“0″ bgcolor=“#000000″>
  <tr>
    <td>
      <table border=“0″ cellspacing=“1″ cellpadding=“2″>
        <tr>
          <td bgcolor=“#A0A0A0″ align=“center“ colspan=“3″> <b>
Kurzovní lístek pro den: $datum</b> </td>
      </tr>
      <tr>
        <td bgcolor=“#A0A0A0″ align=“left“><b>Kód</b>&nbsp;</td>
        <td bgcolor=“#A0A0A0″ align=“center“>&nbsp;<b>Množství
</b>&nbsp;</td>
        <td bgcolor=“#A0A0A0″ align=“center“>&nbsp;<b>Kurz
</b>&nbsp;</td>
        </tr>
        $obsah
      </table>
    </td>
  </tr>
</table>

Šablona řádku tabulky

      <tr>
        <td bgcolor=“#$bg“ align=“left“>$kod</td>
        <td bgcolor=“#$bg“ align=“center“>$mnozstvi</td>
        <td bgcolor=“#$bg“ align=“center“>$kurz</td>
      </tr>

Tyto šablony si uložte na disk např. pod názvy kurz_table.html a kurz_row.html. Nyní začnete se samotným skriptem vytvářejícím tabulku s kurzy.

Definice proměnných

Ve skriptu nejdříve nadefinujte proměnné, které obsahují cesty k jednotlivým souborům na lokálním disku a zároveň nadefinujte cestu k textovému souboru obsahujícímu aktuální kurzovní lístek. Poté se pokuste tento textový soubor stáhnout a uložit jednotlivé řádky do pole, se kterým budete dále pracovat. Pokud se stažení souboru nezdaří, bude skript ukončen. Jakmile bude soubor stažen, otevřete soubory s šablonami tabulky a načtete je do proměnných.

<?
$file = „http://wdb.cnb.cz/CNB_TXT/KURZY.K_CURRTXT“;
// proměnná $file obsahuje cestu k souboru s aktuálním kurzovním lístkem
$row = „kurz_row.html“;
// cesta k souboru s šablonou řádku
$table = „kurz_table.html“;
// cesta k souboru s šablonou tabulky
$vysledek = „kurozovni_listek.html“;
// cesta k tabulce s aktuálním kurzovním lístkem
$bgs = „E0E0E0“;
// v proměnné bgs je barva světlejšího řádku v tabulce
$bgt = „C0C0C0“;
// v proměnné bgt je barva tmavšího řádku v tabulce

Získání souboru ze vzdáleného serveru

@$f = fopen($file,“r“);
// otevře soubor $file pro čtení
if (!$f) exit;
// pokud bude server nedostupný nebo nebude existovat soubor s aktuálním kurzovním lístkem, ukončí běh skriptu
while (!feof ($f))
{
// budete číst po řádcích, dokud nedojdete na konec souboru
        $tmp[] = chop(fgets($f, 4096));
}
// každý řádek bude uložený jako jeden index v poli $tmp
// funkce chop odstraní z konce řádku značku pro přechod na nový řádek
@fclose($f);
// nyní již není třeba práce se souborem, proto uzavřete spojení na tento soubor

Načtení šablon tabulky

Načtěte šablony řádků a tabulky a přidejte do nich zpětná lomítka kvůli správné funkčnosti funkce eval:

@$f = fopen($row,“r“);
$radek = fread($f,1000000);
$radek = addslashes($radek);
@fclose($f);
@$f = fopen($table,“r“);
$tabulka = fread($f,1000000);
$tabulka = addslashes($tabulka);
@fclose($f);

Vytvoření tabulky – dosazení dat

Z prvního řádku souboru získáte den, pro který je kurzovní lístek určen a přiřadíte ho proměnné $datum. Poté nadefinujete pole $zobrazit obsahující čísla řádků (číslováno od jedničky) v původním souboru, které se mají ve finální HTML tabulce zobrazit. Jinými slovy, vyberete měny, které budou v tabulce obsaženy. Pro každou z položek pole $zobrazit provedete sled několika funkcí. Explode se postará o rozdělení obsahu řádku na potřebné položky (potřebujete získat kód, množství a kurz). Další funkce přiřadí proměnné $bg aktuální barvu pozadí řádku tabulky, ve kterém bude zobrazen zpracovávaný soubor. Funkcí eval pak do šablony řádku „dosadíte“ proměnné $kod, $mnozstvi, $kurz a $bg. Výsledek přidáte ke stávajícímu obsahu proměnné $obsah.

Po dokončení smyčky provedete opět funkci eval, která tentokrát dosadí do šablony tabulky proměnnou $obsah. Ve finále pak uložíte soubor na disk, abyste ho mohli používat jako include soubor.

$datum = substr($tmp[0], 0, 10);
// v prvním řádku souboru je datum, proto z prvního indexu pole vyberte prvních 10 znaků – datum ve formátu d.m.Y
$zobrazit = array(13,5,17,18,16);
// pole $zobrazit obsahuje čísla řádků v textovém souboru s kurzy získanými z ČNB, resp. se jedná o měny, které se zobrazí v tabulce
for ($i = 0; $i<count($zobrazit); $i++)
{
        $tmp2 = explode(„|“,$tmp[($zobrazit[$i]-1)]);
        $kod = $tmp2[3];
        $mnozstvi = $tmp2[2];
        $kurz = $tmp2[4];
// pro každou položku z výše uvedeného pole získáte hodnoty kód, množství a kurz; pomocí funkce eval je vložíte do šablony řádku, která se uloží v proměnné $obsah
        $bg = ($i%2==1) ? $bgs : $bgt;
// nastavíte pozadí pro řádek tabulky
        eval(„\$radek_tmp = \“$radek\“;“);
// do šablony řádku dosadíte proměnné…
        $obsah .= $radek_tmp;
}
// …a připíšete jej do proměnné $obsah
eval(„\$tabulka = \“$tabulka\“;“);
// do šablony tabulky vložíte proměnné, konkrétně se vyevaluje proměnná $obsah

Uložení na disk

@$f = fopen($vysledek,“w“);
@fwrite($f,$tabulka);
@fclose($f);
?>

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ší

4 komentářů

  1. milan

    Čvn 4, 2010 v 18:41

    Doporučuji http://addons.nette.org/cs/cnb funguje i bez frameworku a ma spoustu vychytavek

    Odpovědět
  2. Anonym

    Kvě 28, 2011 v 2:42

    Toto je již několik let stará věc ,která už dávno nefunguje. Soubor neexistuje.. Petr

    Odpovědět
  3. Anonym

    Kvě 29, 2011 v 21:27

    Anonymní: jiste, vzdyt je to z roku 2002.

    Odpovědět
  4. M

    Kvě 17, 2017 v 22:25

    Změnil se jen odkaz, nyní platí http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=dnes (nebo přímo datum =17.5.2017 místo =dnes), jinak je popsaný formát stále stejný.

    Odpovědět

Napsat komentář

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