XML export

XML export je k dispozici na adrese http://www.a-prague.com/xml/export.php. Této adrese je potřeba v URL nebo v POST datech předat přihlašovací údaje – přihlašovací jméno v parametru login, heslo v parametru password. Pro přístup ke XML exportu je potřeba mít příslušné oprávnění.

Bez dalších parametrů je vrácen seznam tabulek, které je možno získat. Každou z těchto tabulek je možno předat v GET parametru table. V tom případě je vrácen její kompletní obsah.

Chyby

Pokud dojde k chybě (autorizace, neplatný název tabulky, …), je vrácen jediný element <error> obsahující popis chyby.

Formát vrácených dat

Kořenový element dokumentu je <resultset>, každý řádek tabulky je uzavřen ve značce <row>. V každém řádku tabulky je seznam značek <field> s atributem name obsahujícím název sloupce. Všechny hodnoty obsahují čistá textová data – pokud je jejich obsahem HTML fragment, je patřičným způsobem zakódován. U prázdných hodnot (NULL) se sloupec nepředává.

Texty jsou k dispozici v několika jazycích. Tyto texty jsou uloženy ve sloupcích sloupec_en, sloupec_de a podobně. V dokumentaci jsou tyto sloupce popsány jako sloupec_LANG. Seznam používaných jazyků je k dispozici v tabulce jazyky. Všechny texty jsou vždy k dispozici v anglické verzi, ostatní překlady mohou být nedostupné – v tom případě nejsou vůbec přenášeny.

Veškerá data jsou přenášena v kódování UTF-8.

Ukládání dat

Rozhraní dovoluje kromě exportu dat také ukládání nových objednávek a hodnocení hotelů. V tom případě se místo parametru table předá parametr save s hodnotou objednavka nebo hodnoceni.

Výpočet ceny

Do výpočtu ceny ubytování vstupuje několik tabulek. Základní cena je uložena v tabulce pokoj_cenik. Cena doplňových služeb je uložena v tabulce hotel_cena a nevztahují se na ni žádné slevy.

Hotel může aplikovat slevu na všechny pokoje – ta je uložena v tabulce hotel_specialni_nabidka. Sleva může být vyjádřena absolutní hodnotou nebo procentem (určuje sloupec mena) a může platit jen pro určitý počet osob (min_osob, max_osob). Ve stejné tabulce jsou uloženy i nabídky „X nocí za cenu Y“ (ve sloupcích x, y a jednorazove) a nabídky transferu zdarma (sloupce x a transfer).

Kromě toho může být aplikovaná sleva i na jednotlivé pokoje – ty jsou uložené v tabulce pokoj_cenik_sleva. Mohou být opět vyjádřeny absolutně nebo relativně (mena) a mohou platit jen od určitého počtu nocí (min_noci).

Přistýlky

Počet lůžek je uveden v tabulce pokoj ve sloupci pocet_luzek. Maximální možný počet přistýlek je uveden ve sloupci pristylka. Přistýlky jsou uloženy buď v tabulce hotel_cena se sloupcem specialni nastaveným na extra_bed nebo v tabulce pokoj se sloupcem byt nastaveným na extra_bed. Druhý způsob se používá v případě, kdy se cena přistýlky mění v průběhu roku.

Import dat

Data je vhodné uložit z XML do vlastní databáze a na webových stránkách je zobrazovat z ní. Databáze by měla být vytvořena podle dokumentace jednotlivých tabulek např. následujícím PHP skriptem:

<?php
$jazyky
= array();
$xml = simplexml_load_file("http://www.a-prague.com/xml/export.php?login=" . LOGIN . "&password=" . PASSWORD . "&table=jazyky");
foreach (
$xml->row as $row) {
$jazyk = array();
foreach (
$row->field as $field) {
$jazyk[(string) $field["name"]] = (string) $field;
}
$jazyky[] = $jazyk;
}

$file = file_get_contents("http://www.a-prague.com/xml-export-documentation");
preg_match_all('~<h3><a name="(.+)"(.*)</table>~sU', $file, $tables, PREG_SET_ORDER);
foreach (
$tables as $table) {
preg_match_all('~<th>(.+)</th>\\s*<td>(.+)</td>~sU', $table[2], $columns, PREG_SET_ORDER);
$create = array();
foreach (
$columns as $column) {
$typ = preg_replace('~ - .*~s', '', strip_tags($column[2]));
if (
substr($column[1], -5) == "_LANG") {
foreach (
$jazyky as $jazyk) {
$create[] = substr($column[1], 0, -4) . "$jazyk[id] $typ COLLATE utf8_$jazyk[mysql_kodovani]_ci";
}
} else {
$create[] = "$column[1] $typ";
}
}
mysql_query(
"CREATE TABLE $table[1] (\n\t" . implode(",\n\t", $create) . "\n);\n\n");
}

Import dat lze v PHP provést např. následujícím způsobem:

<?php
$xmlreader
= new XMLReader;
$result = mysql_query("SHOW TABLES");
while (
$row = mysql_fetch_row($result)) {
$table = $row[0];
$xmlreader->open("http://www.a-prague.com/xml/export.php?login=" . LOGIN . "&password=" . PASSWORD . "&table=$table");
$columns = array();
$result1 = mysql_query("SHOW COLUMNS FROM $table");
while (
$row1 = mysql_fetch_assoc($result1)) {
$columns[$row1["Field"]] = $row1["Type"];
}
mysql_free_result($result1);
mysql_query("TRUNCATE $table");
$set = array();
while (
$xmlreader->read()) {
if (
$xmlreader->nodeType == XMLReader::ELEMENT && $xmlreader->name == "field") {
$column = $xmlreader->getAttribute("name");
$xmlreader->read();
if (isset(
$columns[$column])) {
$set[$column] = "'" . addslashes($xmlreader->value) . "'";
}
} elseif (
$xmlreader->nodeType == XMLReader::END_ELEMENT && $xmlreader->name == "row") {
mysql_query("INSERT INTO $table (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")");
$set = array();
}
}
$xmlreader->close();
}
mysql_free_result($result);
?>

Popis sloupců tabulek

hotel

id int Identifikátor
id_mesto int - nastaveni(id) Město
id_typ int - hotel_typ(id) Typ
jmeno_LANG varchar(127) Název
hvezdicky enum('1','2','3','4','5') Hvězdičky
hide_typ bool Skrýt typ hotelu
id_umisteni int - hotel_umisteni(id) Umístění
hodina_od time Nástup od
hodina_do time Odchod do
adresa_LANG tinytext Adresa
kontaktni_osoba varchar(127) Kontaktní osoba
latitude double Zeměpisná šířka
longitude double Zeměpisná délka
popis_description_LANG text Popis
popis_location_LANG text Popis - Umístění
popis_suitable_LANG text Popis - Vhodné pro
pocet_pokoju int Celkový počet pokojů - prázdné se vypočtou z pokojů
pocet_luzek int Celkový počet lůžek - prázdné se vypočtou z pokojů
hlaseni bool Zobrazovat Hlášení
hlaseni_LANG text Hlášení (zobrazuje se před popisem)
search_note_LANG text Poznámka ve výsledcích vyhledávání
provize double(16,4) Provize [%]
provize_vypocet enum('bez_odectu','odecist_5proc','odecist_9proc','odecist_19proc') Způsob výpočtu
provize_dan double Procento daně
skryt bool Skrýt v prezentaci
platba_predem bool Vyžaduje platbu předem
skryt_cenik bool V prezentaci nezobrazovat ceník
platba_LANG tinytext Přijímaná platba
id_storno_podminky int - storno_podminky(id) Storno podmínky
pevna_mena char(3) - kurzy(mena) Měna
alternativni_ceny set('Sun','Mon','Tue','Wed','Thu','Fri','Sat') Alternativní ceny
popularita int Popularita
popularita_obdobi int Popularita bez období
mistni_poplatek int Místní poplatek [Kč/osoba/noc]

kreditni_karty_hotelu

id_hotel int - hotel(id) Identifikátor

hotel_skupiny

id_hotel int - hotel(id) Identifikátor

hotel_storno

id int Identifikátor
id_hotel int - hotel(id) Identifikátor
od date Od
do date Do
storno_LANG text Storno

hotel_obsazeno

id int Identifikátor
id_hotel int - hotel(id) Identifikátor
datum_od date Obsazeno od
datum_do date Obsazeno do

foto

id int Identifikátor
id_hotel int - hotel(id) Identifikátor
pozice int Pořadí
soubor varchar(127) Soubor - ../data/hotel-
sirka int -
vyska int -
text_LANG varchar(127) Popis

hotel_cena

id int Identifikátor
id_hotel int - hotel(id) Hotel
text_LANG varchar(127) Popis
specialni enum('extra_bed') Speciální
cena_mena decimal(9,2) Cena v měně
jednorazove bool Jednorázová platba: ne - za každou noc
provize bool Započítat do provize
skryt bool Skrýt v prezentaci

hotel_specialni_nabidka

id int Identifikátor
id_hotel int - hotel(id) Hotel
od date Od
do date Do
cena double Sleva uplatněná na všechny pokoje
mena enum('mena', '%') Měna
x tinyint X (X nocí za cenu Y)
y tinyint Y
jednorazove bool Jednorázově (pouze noc zdarma)
transfer bool Nad X nocí transfer zdarma
min_osob int Minimální počet osob
max_osob int Maximální počet osob
text_LANG varchar(127) Nabídka
vytvoreno datetime Změněno

pokoj

id int Identifikátor
id_hotel int - hotel(id) Hotel
typ_LANG varchar(127) Typ pokoje
pocet_luzek int Lůžek
pristylka int Přistýlek
byt enum('ne','ano','dormy','extra_bed') Byt
mistnosti tinyint Místností
poschodi tinyint(4) Poschodí
pocet int Množství
alotment_pocet int Počet pokojů v allotmentu
program bool Pobytový program
skryt bool Skrýt v prezentaci
popis_LANG text Popis

vybaveni_hotelu_pokoje

id_umisteni int - pokoj(id) Identifikátor

pokoj_min_noci

id int Identifikátor
id_pokoj int - pokoj(id) Identifikátor
od date Od
do date Do
min_noci int Minimální počet nocí

pokoj_obsazeno

id int Identifikátor
id_pokoj int - pokoj(id) Identifikátor
od date Od
do date Do
pocet int Počet volných pokojů

pokoj_cenik

id int Identifikátor
id_hotel int - hotel(id) Identifikátor
id_pokoj int - pokoj(id) Pokoj
od date Od
do date Do
cena double Cena
alternativni_cena double Alternativní cena

pokoj_cenik_sleva

id int Identifikátor
id_hotel int - hotel(id) Identifikátor
id_pokoj int - pokoj(id) Pokoj
od date Od
do date Do
cena double Sleva
mena enum('mena','%') Typ slevy (mena/%)
min_noci int Minimální počet nocí

hodnoceni

id int Identifikátor
id_hotel int - hotel(id) Hotel
id_objednavka int - objednavka(id) Objednávka
jmeno varchar(50) Jméno
email varchar(50) E-mail
jazyk char(2) - jazyky(id) Jazyk
datum date Datum
hodina time Čas
id_druh int - hodnoceni_druh(id) Typ
text text Zpráva
plus text Plus
minus text Mínus
odpoved text Naše odpověď

hodnoceni_text

id_hodnoceni int - hodnoceni(id) Identifikátor
znamka int Známka

hodnoceni_druh

id int Identifikátor
poradi int Pořadí
nazev_LANG varchar(30) Název

hodnoceni_typ

id int Identifikátor
poradi int Pořadí
nazev_LANG varchar(30) Název

hotel_skupina

id int Identifikátor
poradi int Pořadí
nazev_LANG varchar(30) Název

nastaveni

mesto_LANG varchar(50) Město
stat char(2) - staty(idf) Stát
latitude double Zeměpisná šířka
longitude double Zeměpisná délka

jazyky

id char(2) Identifikátor
kod char(2) Kód pro HTML
poradi int Pořadí
nazev varchar(30) Název
vlajecka varchar(250) Vlaječka - ../data/jazyk-
admin bool Používat v adminu
mena char(3) - kurzy(mena) Výchozí měna
mysql_kodovani enum('general','icelandic','latvian','romanian','slovenian','polish','estonian','spanish','swedish','turkish','czech','danish','lithuanian','slovak','spanish2','roman','persian') MySQL kódování
datum_format varchar(20) Formát datumu pro PHP date()

staty

id int Identifikátor
idf char(2) Kód
stat_LANG varchar(30) Stát

hotel_typ

id int Identifikátor
poradi int Pořadí
ikona varchar(100) Ikona na mapě - ../data/typ-
text_LANG varchar(127) Typ
texty_LANG varchar(127) Typ v množném čísle

hotel_umisteni

id int Identifikátor
id_mesto int - nastaveni(id) Město
id_umisteni enum('out','near','centrum') Oblast
poradi int Pořadí
text_LANG varchar(255) Městská část
hranice varchar(250) Hranice městské části (EncodedPolyline)
hranice_levels varchar(64) Hranice městské části (EncodedLevels)
latitude double Zeměpisná šířka nadpisu
longitude double Zeměpisná délka nadpisu

storno_podminky

id int Identifikátor
storno_LANG text Text

kreditni_karty

id int Identifikátor
poradi int Pořadí
ikona varchar(50) Ikona - ../data/kreditka-
text_LANG varchar(127) Název
bookable bool Použitelná pro platbu

vybaveni

id int Identifikátor
ikona varchar(50) Ikona - ../data/vybaveni-
text_LANG varchar(255) Vybavení

kurzy

id int Identifikátor
mena char(3) Měna
kurz double(16,4) Kurz
predchozi_kurz float Předchozí kurz
datum date Datum

url

id int Identifikátor
id_mesto int - nastaveni(id) Město
titulek_LANG tinytext Titulek stránky
url_LANG varchar(250) Přátelské URL
slogan_LANG tinytext Slogan nad menu
keywords_LANG tinytext META Keywords
description_LANG tinytext META Description
noindex bool Neindexovat vyhledávači
tabulka_id int - hotel(id) Objekt