IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

itnetwork.cz
localhost

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 2x (1.85 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Řešené úlohy k 9.-11. lekci práce se soubory v PHP
Všechny články v sekci
Soubory a práce s nimi v PHP
Přeskočit článek
(nedoporučujeme)
Šablonovací systém XSLT v PHP - Vícejazyčné šablony
Článek pro vás napsal Kit
Avatar
Uživatelské hodnocení:
7 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