Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
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 12 - Š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í.

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á 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 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 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.

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('https://www.itnetwork.cz/api/System-Event/rss/all');
echo "<!DOCTYPE html>",$xsl->transformToXML($doc);

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.


 

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í:
4 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

 

 

Komentáře

Avatar
Kit
Tvůrce
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
Tvůrce
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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kit
Tvůrce
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
Tvůrce
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
Tvůrce
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
Tvůrce
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
Tvůrce
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
Tvůrce
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.