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 |
varchar(255) |
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 |
varchar(250) |
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 |
varchar(255) |
Titulek stránky |
| url_LANG |
varchar(250) |
Přátelské URL |
| slogan_LANG |
varchar(255) |
Slogan nad menu |
| keywords_LANG |
varchar(255) |
META Keywords |
| description_LANG |
varchar(255) |
META Description |
| noindex |
bool |
Neindexovat vyhledávači |
| tabulka_id |
int - hotel(id) |
Objekt |