MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

PHP: Šablonovací systém XSLT(1) - jednoduché čtení RSS

Většina začátečníků začne používat PHP tak, že nejprve vytvoří stránku v HTML a do ní začne vkládat kusy kódu v PHP. Asi takto:

<html>
<head>
<title><?php echo $titulek; ?></title>
</head>
<body>
<h1><?php echo $titulek; ?></h1>
<ul>
<?php
foreach($seznam as $polozka){
   echo "<li>",htmlspecialchars($polozka),"</li>\n";
}
?>
</ul>
</body>
</html>

Příklad je velmi zjednodušen, není v něm uvedeno naplnění hodnot proměnné $titulek a pole $seznam.

V této podobě bylo vytvořeno mnoho funkčních webů. Výhodou je jednoduchost, jazyk PHP byl původně určen k přesně takovému použití. Vkládání opakujících se bloků bylo vyřešeno funkcemi include() a require().

S rostoucí komplexností stránky a množstvím podstránek se však tato jednoduchost ztrácí. Autor designu stránky už často není schopen odpovědně volat potřebné proměnné, zejména pokud je potřebné vybírat data z databáze. Vývojáři volali po oddělení aplikace od dat.

Vzniklo mnoho lepších či horších šablonovacích systémů, které dokáží číst externí soubor, doplnit do něj potřebné řetězce a vypsat na výstup. Mezi takové patří například Smarty. V PHP data uložíte do speciálního pole, zavoláte Smarty a data se uloží na správné místo. Nevýhodou je, že se musíte naučit další jazyk. Vlastně používáte šablonovací jazyk napsaný v šablonovacím jazyku.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Psal jsem, že data pro šablonovací systém je nutné předem uložit do nějakého pole. Obecně to ani nemusí být pole, ale nějaká dobře známá datová strukura. Může to být CSV, JSON, XML, DOM nebo cokoli jiného, čemu šablonovací systém rozumí.

Mezi jinými vznikl i velmi komplexní šablonovací systém XSLT. Vývojáři si ho moc neoblíbili, protože není úplně jednoduché se ho naučit. Také proto, že je dost "upovídaný". Je to dáno tím, že šablony se píší v jazyku XML. Vstupní data jsou také ve formátu XML. Sloučením šablony a dat (transformací) vznikne nový soubor teoreticky libovolného typu, v našem případě HTML.

Pro jednoduchou ukázku jsem si vybral soubor RSS z webu itnetwork. Tento soubor chci převést do nějakého líbivějšího formátu a zobrazit v prohlížeči. Využiji skutečnosti, že RSS používá formát XML a použiji šablonu XSLT.

itnetwork.xsl

<?xml version="1.0"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version='1.0'>
<xsl:output method="html" encoding="utf-8" indent="yes"/>

<xsl:template match="/rss/channel">
<html>
<head>
<meta http-equiv="refresh" content="300"/>
<title><xsl:value-of select="title"/></title>
</head>
<body>
<h1><xsl:value-of select="title"/></h1>
<ul>
<xsl:for-each select="item">
        <li>
        <xsl:element name="a">
                <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
                <xsl:attribute name="target">_blank</xsl:attribute>
                <xsl:value-of select="title"/>
        </xsl:element>
        <p><xsl:value-of select="description"/></p>
        </li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

Všechny příkazy pro XSLT začínají <xsl:... Deklarace na začátku jsou nutné k definici výstupu transformace.

V této podobě to však ještě nejde použít. Proč? Protože šablonu sice máme, ale nemáme data. Také nemáme virtuální stroj, který by data spojil se šablonou. Vlastně máme. Je součástí PHP na většině serverů. Stačí ho jen spustit:

<?php
$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load('itnetwork.xsl');
$xsl->importStyleSheet($doc);

$doc->load('http://www.itnetwork.cz/rss_generator_all.php');
echo "<!DOCTYPE html>",$xsl->transformToXML($doc);

To je vše. Šablonu itnetwork.xsl a skript umístíte na svém oblíbeném webhostingu a můžete si začít užívat prohlížení RSS kanálu s pětiminutovou periodou. Pokud vás nějaký příspěvek zaujme, stačí kliknout.

Uvedená šablona je velmi primitivní, je napsána procedurálně a vůbec nevyužívá nejsilnějších stránek XSLT.

Zjednodušený šablona XSLT

I tak jednoduchou šablonu je však možné ještě víc zjednodušit. Něco za něco. Ve zjednodušené šabloně je možné používat jen velmi omezenou sadu příkazů XSLT. Pro běžné použití nám však na čtečku RSS vystačí i tato omezená sada:

<?xml version="1.0"?>

<html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version='1.0'>
<head>
<meta http-equiv="refresh" content="300"/>
<title><xsl:value-of select="/rss/channel/title"/></title>
</head>
<body>
<h1><xsl:value-of select="/rss/channel/title"/></h1>
<p><a target="_blank">
        <xsl:attribute name="href"><xsl:value-of select="/rss/channel/link"/></xsl:attribute>
        <xsl:attribute name="title"><xsl:value-of select="/rss/channel/title"/></xsl:attribute>
        <xsl:value-of select="/rss/channel/link"/>
</a></p>
<ul>
<xsl:for-each select="/rss/channel/item">
        <li><a target="_blank">
                <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
                <xsl:value-of select="title"/>
        </a>
        <p><xsl:value-of select="description" disable-output-escaping="yes"/></p>
        </li>
</xsl:for-each>
</ul>
</body>
</html>

Jak vidíte, tato zjednodušená šablona se již dost podobá šablonám běžných šablonovacích systémů. Stále si však zachovává svou základní vlastnost: Pokud neobsahuje validní kód XML, bude při spuštění vypisovat chyby. Tato vlastnost je výhodná při ladění šablony - snižuje pravděpodobnost nevalidního výstupu HTML.

Zjednodušené šablony by se však měly používat spíš výjimečně. Pokud byste pomocí takové šablony chtěli prezentovat nějaký portál, u kterého každá podstránka vypadá trochu jinak (index, článek, novinky, fórum), museli byste asi mít takových šablon víc. A to by bylo nepraktické. Pro portály typu ITnetwork je výhodnější vytvořit standardní šablonu, která se automaticky přizpůsobí struktuře vstupních dat.


 

Všechny články v sekci
Soubory a práce s nimi v PHP
Článek pro vás napsal Kit
Avatar
Jak se ti líbí článek?
2 hlasů
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Aktivity (5)

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:1.8.2012 23:16

Obarvení syntaxe XSLT se sice moc nepovedlo, ale snad to tolik nevadí.

Odpovědět
1.8.2012 23:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Kit
David Jančík:1.8.2012 23:34

On ten FSHL highlighter je celkem na nic. Dívali jsme se i na jeho zdrojové kódy a to teda bylo počteníčko... Zamýšlíme, že si napíšeme vlastní, stejně tak přemýšlíme i nad Texy. Přijde nám, že vše má akorát moc zbytečného kódu a ve výsledku to nic neumí.

Odpovědět
1.8.2012 23:34
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík
Kit:1.8.2012 23:49

Zkusil jsem GeSHi a zvládl to perfektně. Texy! samotné to neumí, využívá právě GeSHi.

Odpovědět
1.8.2012 23:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:3.8.2012 15:46

Velmi zajímavá metoda generování výstupu :)

S tím GeSHi nemám moc dobré zkušenosti, co se týče výkonu. Byl asi 50x pomalejší, než to FSHL co tam máme teď, zvýrazňování trvalo v řádech stovek ms. Osobně nechápu, jak to autor dokázal. FSH to zvládlo v řádu desítek ms.

S FSHL máme nyní problémy, protože již není ve vývoji a nedá se v tom vyznat, jestli se chceš pobavit, tak se mu koukni na zdrojáky, něco takového jsem dlouho neviděl a opět nechápu, jak se to autorovi mohlo podařit.

Dost vážně přemýšlím o tom, že si napíši vlastní highlighter, protože nabídka již hotových řešení je příšerná a navíc v tom nevidím nic složitého. Zavadil jsem o Hyperlight, ještě zkusím ten, třeba to napotřetí bude lepší :)

Odpovědět
3.8.2012 15:46
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:3.8.2012 20:35

Jak je uvedeno v posledním odstavci: Je to napsáno procedurálně. Psát by se to tak nemělo, protože složitější případy by se tím dělaly obtížně. Když se to napíše deklarativně, tak na celý portál vystačíš s jedinou šablonou.

ad highlighter: Je nutné použít cache. Ve svém nehotovém CMS ji mám a výkonově je to úplně někde jinde.

Odpovědět
3.8.2012 20:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:4.8.2012 9:23

V tomto příkladu jsem využil skutečnosti, že RSS obsahuje hotové XML, které stačí natáhnout do DOMu a aplikovat XSLT. Při generování výstupu aplikace nejprve musíš vyrobit XML nebo ještě lépe přímo DOM. Tak dosáhneš maximálního výkonu.

Odpovědět
4.8.2012 9:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:25.8.2012 14:25

Fatal error: Class 'XSLTProcessor' not found in C:\EasyPHP-5.3.9\www\index.php on line 3
co s tím

 
Odpovědět
25.8.2012 14:25
Avatar
Kit
Redaktor
Avatar
Odpovídá na martinkobelka
Kit:25.8.2012 18:25

Je potřeba doinstalovat modul XSLT do PHP.

Odpovědět
25.8.2012 18:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:29.8.2012 12:16

Není někde článek, kde bych se dočetl o popisu těch objektů co v článku používáte? pochopil jsem, že se šablona uloží do souboru csl, a pak si ji načtu do těch objektů, ale už nic o tom, jak ji v php zpracovat atd.

 
Odpovědět
29.8.2012 12:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na martinkobelka
Kit:29.8.2012 12:30

O článku nevím. Používám oficiální dokumentaci PHP, kde je vše včetně příkladů. Dobrý tutoriál o XSLT v češtině napsal Jiří Kosek.

Odpovědět
29.8.2012 12:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.