Avagy a vCardról, a hCardról és azok kiszolgálásáról.
A vCard többnyire a mobileszközök és asztali alkalmazások kényelmes adatcseréjét biztosító elektronikus névjegykártya formátum. A hCard az XHTML-en alapuló, a vCardnak teljes mértékben megfelelő mikroformátum – szintén névjegy adatok tárolására. Milyen kényelmes volna, ha egyszerre tudnánk nyújtani mindkettőt, egyszeres munkával. Kell egy közös nevező, de már meg is van: az XML. Hogyan lesz majd a pure XML-ből vCard vagy hCard? Megdörzsöljük a lámpást, és előjön az XSLT. Én mondom, ez klassz!
Szükséges tehát kialakítanunk egy XML formátumot a névjegy adatok tárolására. Mi lusták vagyunk, nem írunk saját DTD-t, hanem felhasználjuk a W3C RDF-es megvalósítását. Lássuk, hogyan festene a nevjegy.xml:
Róbert Gedeon Róbert Gedeon Gida 1974-01-12 tanuló +36201234567 gida@100holdas.pg Erdősor 10 Százholdaspagony 6124 Micimackó
Ez egy tetszőleges kód, ettől tartalmazhat többet és kevesebbet is egyaránt a névjegyünk, valamint megadhatók olyan opcionális adatok is, amelyek nem feltétlenül részei a vCard szabványnak. Lássuk azt a hcard.xsl stíluslapot, ami ebből XHTML kimenetet gyárt.
névjegye
<div class="vcard">
</div>
<h1><a class="url fn" href="{@*}"></a></h1>
<div class="adr">
<div class="street-address"></div>
<span class="locality"></span>
<span class="postal-code"></span>
</div>
<div class="tel"></div>
<div class="bday"></div>
<div class="role"><em></em></div>
<div><a class="email" href="mailto:{.}"></a></div>
A boldoguláshoz ez így még édeskevés, csatoljuk hozzá az XML dokumentumunkhoz.
Az eredmény pedig, íme: nevjegy_kesz.xml
Természetesen ebben az esetben csak hCard formátumban érkezik a névjegy. (Házifeladatként készítsük el a vCard specifikációjának megfelelően a vCardba transzformáló stíluslapot.) A kliensfüggő kiszolgálás azonban nem olyan egyszerű, mert tapasztalataim szerint a vCard-képes szoftverek nem tudnak HTTP-n keresztül kinyerni egy névjegyet, így nem dönthetünk egyszerűen a HTTP_ACCEPT tartalma alapján; tehát a szerveroldali futtató környezetnek kell a feldolgozást is elvégezni, hiszen míg a korszerű böngészők (Gecko, Opera 9, IE 6, Safari) képesek stíluslap alapján átalakítani egy XML dokumentumot, addig a vCard-képes ügyfelek (például levelezőprogram) többnyire erre képtelenek.
<?php
header('Content-type: text/xml; enconding=utf-8');
print '' . "\n";
if (isset($_GET['type']) && $_GET['type'] == 'vcard') {
print '' . "\n";
} else {
print '' . "\n";
}
/* Az XML dokumentum fennmaradó része. */
?>
Ez így rusnya, mi? Szerintem is. Egyszerűnek egyszerű, működik is, de próbáljuk elkülöníteni a logikát a tartalomtól. Vannak PHP-ben XML függvények? Vannak. Hát akkor használjuk is őket! PHP5 barátoknak:
load("vcard.xsl");
} else {
header('Content-type: text/xml; charset=utf-8');
$dom->load("hcard.xsl");
}
$proc = new xsltprocessor;
$xsl = $proc->importStylesheet($dom);
$document = new domDocument();
$document->load("nevjegy.xml");
print $proc->transformToXml($document);
?>
És régi motorosoknak:
$xmldata); $xsltproc = xslt_create(); print xslt_process($xsltproc, 'arg:/_xml', $xsl, NULL, $arguments); ?>
Kész: hCard és vCard. Mindkét verzióban gondoskodtunk a tartalomnak megfelelő MIME típus szerinti kiszolgálásról. A vCardot nem böngészőben szeretnénk nézegetni, így felajánljuk letöltésre.
Ismert hibák:
- A PHP-vel feldolgozott változat Internet Exploler 6 alatt nem megy, mert az XHTML 1.1-et
application/xhtml+xmlfejléccel kell kiszolgálni, azonban az IE azt még nem ismeri.
Felhasznált irodalom: