Lekce 14 - Šablonovací systém XSLT v PHP - Jednoduché čtení RSS
V předešlém cvičení, Řešené úlohy k 9.-11. lekci práce se soubory v PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Pokud nestačí šablony v PHP, je možné použít nástroje silnějšího kalibru. K tomuto účelu byla vytvořena transformace XSLT, kterou si dnes ukážeme.
Motivace
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 lang="cs"> <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.
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á struktura. 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 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.
Ukázka
Pro jednoduchou ukázku jsem si vybral starý 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.
Takto vypadá naše RSS šablona 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 lang="cs"> <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:
$doc = new DOMDocument(); $xsl = new XSLTProcessor(); // soubor šablony $doc->load('itnetwork.xsl'); $xsl->importStyleSheet($doc); // RSS $doc->load('https://www.itnetwork.cz/api/System-Event/rss/all'); echo("<!DOCTYPE html>" . $xsl->transformToXML($doc));
V souboru php.ini
je třeba odkomentovat (odstranit
;
) řádek extension=xsl
(ve starších verzích
extension=php_xsl.dll
) k použití třídy
XSLTProcessor
.
To je vše. Šablonu itnetwork.xsl
a skript umístíme na svém
oblíbeném webhostingu a můžeme 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 můžeme vidět, 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 bychom 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 bychom 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 další lekci, Šablonovací systém XSLT v PHP - Vícejazyčné šablony, si ukážeme jednoduchý způsob vytváření vícejazyčných šablon v XSLT.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 3x (1.85 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP