Byl vydán Debian 12.10, tj. desátá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
Byla vydána nová verze 4.5 svobodného notačního programu MuseScore (Wikipedie). Představení novinek v oznámení v diskusním fóru a také na YouTube.
Byla vydána nová verze 8.6.0 správce sbírky fotografií digiKam (Wikipedie). Přehled novinek i s náhledy v oficiálním oznámení (NEWS). Nejnovější digiKam je ke stažení také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.
O víkendu probíhá v Praze na Karlově náměstí 13 konference Installfest 2025. Na programu je celá řada zajímavých přednášek a workshopů. Vstup je zdarma. Přednášky lze sledovat i online na YouTube.
Byla vydána nová verze 2.49.0 distribuovaného systému správy verzí Git. Přispělo 89 vývojářů, z toho 24 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.
Premiér Petr Fiala (ODS) dnes na síti X vyloučil, že by za jeho vlády mohla začít platit vyhláška, podle níž by poskytovatelé internetového připojení měli uchovávat adresy internetových stránek, na které se lidé připojují.
Flock 2025, tj. konference pro přispěvatele a příznivce Fedory, proběhne od 5. do 8. června v Praze.
Zemřel Mark Klein, který dlouhá léta pracoval pro telekomunikační firmu AT&T a proslavil se jako whistleblower, když zveřejnil informace o spolupráci AT&T s agenturou NSA. Cílem spolupráce bylo sledovat veškerou komunikaci občanů za pomocí zařízeních v místnosti 641A. O spolupráci obou subjektů napsal knihu Wiring Up The Big Brother Machine...And Fighting It.
Byla vydána nová verze 16 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v changelogu.
Texas Instruments představil nejmenší mikrokontrolér na světě MSPM0C1104. Je o 38 % menší než současné nejmenší mikrokontroléry. Má pouze 1,38 mm².
Tímto dílem ukončíme seznamování s vestavěnými funkcemi a v díle následujícím se již přejdeme na speciální funkce, tzv. custom functions.
V minulém díle tohoto seriálu jsme se seznámili s funkcemi, resp. tagy, {ldelim}
a {rdelim}
. Jejich použití je nám tedy známe. Ve větších blocích kódu, kde je potřeba použít závorky {
a }
, by využití těchto tagů nebylo příliš efektivním. Řešení problému je párový tag {literal}{/literal}
. Vše, co je mezi těmito dvěma tagy, není interpretováno šablonovacím strojem, ale je zobrazeno "tak, jak je". Využití nalezneme např. při psaní interních definici CSS stylů nebo u JavaScriptu. Jako vždy nejvíce pomohou k pochopení ukázkové příklady.
Ukázka funkce v JavaScriptu (obdoba funkce s předcházející kapitoly, vysvětlující {ldelim}
a {rdelim}
):
{literal} <script type="text/javascript"> function showServerInfo(name, ip) { alert("Server name:\n" + name + "\n" + ip); } </script> {/literal} <a href="javascript:showServerInfo('{$smarty.server.SERVER_NAME}', '{$smarty.server.SERVER_ADDR}')">Server Info</a>
Použití při definování interního CSS stylu:
<style type="text/css"> {literal} /* Definice stylu */ DIV.info { border: 1px solid #ffffff; background-color: #aabbcc; } {/literal} </style> ... <div class="info">Pouziti interniho CSS stylu</div>
Tag php
slouží pro přímé vložení PHP kódu do šablony. Jedná se o pokročilou techniku, téměř ve všech případech se to dá vyřešit jinak (např. na úrovni pluginů - viz některá z příštích kapitol), vkládání PHP kódu přímo do šablony se nedoporučuje. Důležitým upozorněním je, že pokud chceme ze šablony uvnitř tohoto tagu přistupovat k proměnným PHP, musíme použít globální kontext. Následující příklady demonstrují jednoduché použití tohoto tagu a složitější použití při předávání obsahu proměnné.
{php} // Vlozeni skriptu zobrazujiciho kurzovni listek (priklad) include("/cesta/k/souboru/kurzovni-listek.php"); {/php}
Složitější příklad předávání obsahu proměnných z vloženého PHP v šabloně do proměnné v šabloně (zní to složitě, funguje jednoduše):
{php} global $promenna_1, $promenna_2; if($promenna_1 == $promenna_2) { // Nasledujici obsah bude odeslan prohlizeci - jako v beznem PHP echo("Obe promenne maji stejnou hodnotu - promenna_1 = promenna_2"); } // Ukazka prirazeni hodnoty do promenne Smarty sablony $this->assign("tpl_machine", "Smarty Template Engine"); {/php} {* Vypis definovane promenne na urovni sablony *} <div>Na sablony pouzivame <strong>{$tpl_machine}</strong></div>
Jak jsme si již řekli ve čtvtém dílu tohoto seriálu, funkce section
slouží k procházení složitějších datových polí. Funkce je, stejně jako foreach
, cyklus, takže musí být ukončen - párový tag. Jinak řečeno, vše, co je mezi {section}
a {/section}
, se "cyklí". Chování lze ovlivnit šesti možnými parametry, z čehož dva jsou povinné. Prvním povinným parametrem je name
, pomocí něhož jednoznačně identifikujeme cyklus. Druhým povinným parametrem je loop
, který definuje počet iterací. Zadat můžeme číslo nebo objekt, se kterým bude operace provedena. V podstatě tím, že předáme parametru loop
pole, dojde k tomu, že Smarty aplikuje na pole PHP funkci sizeof, a dále pracuje s velikostí předaného pole. Uvnitř cyklu pak přistupujeme k libovolné proměnné šablony (nejčastěji k polím).
Následující parametry jsou volitelné. První ze skupiny těchto parametrů je start
. Určuje počátek iterace, implicitně je nastaven na číslo 0
. Zadáme-li zápornou hodnotu, Smarty provede odpočet od konce pole, a tuto pozici označí jako výchozí. Př.: pole o sedmi hodnotách: zadáme-li -3
, počáteční pozice bude na indexu 4. Parametr loop
je vnitřně ošetřen tak, že pokud zadáme neplatnou hodnotu, dojde k převedení na nejbližší možnou hodnotu. Dalším parametrem je step
, pomocí něhož lze upravovat kroky iterace cyklu. Zadáme-li krok 2
, výsledkem bude např. 0 2 4 ...
. Stejně jako u parametru start
lze použít zápornou hodnotu, čímž docílíme zpětného průchodu, tedy např. 10 8 6 ...
(při hodnotě -2
). Implicitně má step
hodnotu 1
. Předposledním parametrem je max
, který určuje maximální počet iterací cyklu. Implicitní hodnota není stanovena, resp. jedná se o nekonečno. Poslední parametr show
může nabývat hodnot TRUE
nebo FALSE
a slouží k nastavení, zda-li se má výsledek cyklu section
zobrazovat. Praktické využití nejlépe pochopíme z příkladů.
Pro následující výpisy předpokládejme přiřazení hodnot do pole v PHP takto:
<?php $pole = array(10, 20, 30); $smarty->assign("pole", $pole); ?>
Pro demonstraci použijeme následující šablonu:
{* Cyklus vypise obsah celeho pole $pole *} {section name="vypis_pole" loop=$pole} {$pole[vypis_pole]}<br /> {/section} <br /> {* Cyklus vypise obsah celeho pole $pole v opacnem poradi *} {section name="vypis_pole_r" loop=$pole step="-1"} {$pole[vypis_pole_r]}<br /> {/section}
Výstup bude vypadat takto:
10<br /> 20<br /> 30<br /> <br /> 30<br /> 20<br /> 10<br />
Ne vždy ale potřebujeme procházet pole. V některých případech nám stačí pouze generování čísel dle určitých podmínek. Parametr loop
nemusí odkazovat na pole, ale může obsahovat číslo. Hodnotu, na kterou se bude vázat iterace. Stejně jako u foreach můžeme i u této funkce použít konstrukce $smarty.foreach.jmeno.vlastnost
. Viz příklad:
{section name="c1" start="0" loop="20" step="4"} {$smarty.section.c1.index} {/section} <br /> {section name="c2" loop="50" max="8" step="-4"} {$smarty.section.c2.index} {/section}
Výstupem našeho příkladu bude:
0 4 8 12 16 <br /> 49 45 41 37 33 29 25 21
Způsob použití může být i složitější. Pro demonstraci použijeme dvourozměrné
pole a zároveň si vysvětlíme použití sectionelse
. Část sectionelse
se provede pouze tehdy, pokud předáme parametru loop
neexistující nebo prázdné pole. V podstatě se jedná o stejný příklad jako u foreach, s tím rozdílem, že tato funkce má nepatrně jiné parametry, tedy i jejich použití.
Pro následující výpisy předpokládejme přiřazení hodnot do pole v PHP takto:
<?php $smarty->assign("kontakty", array( array("jmeno" => "Petr", "mail" => "petr@abclinuxu.cz", "mobil" => "775 123 456"), array("jmeno" => "Martin", "mail" => "martin@abclinuxu.cz", "mobil" => "776 123 456"), array("jmeno" => "Jan", "mail" => "jan@abclinuxu.cz", "mobil" => "777 123 456"))); ?>
K demonstraci výpisu použijeme následující šablonu:
<table> <tr> <td><b>Jméno</b></td> <td><b>E-mail</b></td> <td><b>Telefon</b></td> </tr> {section name="zamestnanci" loop=$kontakty} <tr> <td>{$kontakty[zamestnanci].jmeno}</td> <td>{$kontakty[zamestnanci].mail}</td> <td>{$kontakty[zamestnanci].mobil}</td> </tr> {sectionelse} {* Tato cast se provede v pripade prazdneho pole *} <tr> <td><b>Neplatná vstupní data</b></td> </tr> {/section} </table>
Výstupem této šablony bude (v případě existujícího vstupu, jinak se provede
větev sectionelse
) toto:
<table> <tr> <td><b>Jméno</b></td> <td><b>E-mail</b></td> <td><b>Telefon</b></td> </tr> <tr> <td>Petr</td> <td>petr@abclinuxu.cz</td> <td>775 123 456</td> </tr> <tr> <td>Martin</td> <td>martin@abclinuxu.cz</td> <td>776 123 456</td> </tr> <tr> <td>Jan</td> <td>jan@abclinuxu.cz</td> <td>777 123 456</td> </tr> </table>
Někdy se může stát, že máme stejné hodnoty jako v předchozím případě, ale v jednorozměrných polích. K úspěšnému projití polí potřebujeme splnit jednu důležitou podmínku, a to stejný rozměr všech polí. Je-li tato podmínka splněna, můžeme projít všechny pole pomocí jednoho iterátoru (resp. na ostatní pole použijeme iterátor pole prvního). Představme si tedy, že místo vícerozměrného pole $kontakty
máme tři pole: $jmeno
, $mail
a $mobil
:
<?php $smarty->assign("jmeno", array("Petr", "Martin", "Jan")); $smarty->assign("mail", array("petr@abclinuxu.cz", "martin@abclinuxu.cz", "jan@abclinuxu.cz")); $smarty->assign("mobil", array("775 123 456", "776 123 456", "777 123 456")); ?>
Šablona na průchod může vypadat takto:
{section name="zamestnanci" loop=$jmeno} <p> Jmeno: {$jmeno[zamestnanci]}<br /> Mail: {$mail[zamestnanci]}<br /> Telefon: {$mobil[zamestnanci]} </p> {/section}
Výsledek by měl být jasný, ale pro jistotu:
<p> Jmeno: Petr<br /> Mail: petr@abclinuxu.cz<br /> Telefon: 775 123 456 </p> <p> Jmeno: Martin<br /> Mail: martin@abclinuxu.cz<br /> Telefon: 776 123 456 </p> <p> Jmeno: Jan<br /> Mail: jan@abclinuxu.cz<br /> Telefon: 777 123 456 </p>
Samozřejmostí je možnost zanořování cyklů do sebe, tedy uvnitř section
může být jiný cyklus. Příklad můžeme postavit na předcházejících ukázkách, s tím rozdílem, že každý uživatel bude mít několik telefonních čísel. Pro demonstraci potřebujeme nějaké vícerozměrné pole naplněné hodnotami; použijeme následující:
<?php $smarty->assign("kontakty", array( array("jmeno" => "Petr", "mail" => "petr@abclinuxu.cz", "telefony" => array("775 123 456", "234 567 890")), array("jmeno" => "Martin", "mail" => "martin@abclinuxu.cz", "telefony" => array("776 123 456", "234 567 891")), array("jmeno" => "Jan", "mail" => "jan@abclinuxu.cz", "telefony" => array("777 123 456", "234 567 892")))); ?>
Jednoduchá šablona, která vypíše obsah pole $code
a tím demonstruje
zanoření dvou cyklů do sebe, vypadá takto:
<table> <tr> <td><b>Jméno</b></td> <td><b>E-mail</b></td> <td><b>Telefony</b></td> </tr> {section name="zamestnanci" loop=$kontakty} <tr> <td>{$kontakty[zamestnanci].jmeno}</td> <td>{$kontakty[zamestnanci].mail}</td> <td> {section name="telefony" loop=$kontakty[zamestnanci].telefony} {$kontakty[zamestnanci].telefony[telefony]}<br /> {/section} </td> </tr> {sectionelse} {* Tato cast se provede v pripade prazdneho pole *} <tr> <td><b>Neplatná vstupní data</b></td> </tr> {/section} </table>
Výsledek této šablony bude dle očekávání:
<table> <tr> <td><b>Jméno</b></td> <td><b>E-mail</b></td> <td><b>Telefony</b></td> </tr> <tr> <td>Petr</td> <td>petr@abclinuxu.cz</td> <td>775 123 456<br />234 567 890</td> </tr> <tr> <td>Martin</td> <td>martin@abclinuxu.cz</td> <td>776 123 456<br />234 567 891</td> </tr> <tr> <td>Jan</td> <td>jan@abclinuxu.cz</td> <td>777 123 456<br />234 567 892</td> </tr> </table>
Již víme, že pomocí speciální konstrukce můžeme získávat informace o průběhu cyklu. Konstrukce $smarty.section.jmeno.vlastnost
, umožňuje použít následující vlastnosti: index
, index_prev
, index_next
, iteration
, first
, last
, rownum
, show
a total
.
Pomocí této vlastnosti můžeme sledovat aktuální hodnotu indexu v poli (počáteční hodnota při prvním průchodu je nastavena na 0
, není-li explicitně změněno parametrem start
). K aktuální hodnotě indexu můžeme tedy uvnitř cyklu, kterým vypisujeme zaměstnance a jejich kontakty, přistupovat přes $smarty.section.zamestnanci.index
.
Obsahuje hodnotu o step
menší, než je hodnota index
. Tedy hodnota $smarty.section.jmeno.index_prev
je rovna hodnotě $smarty.section.jmeno.index - step
.
Opačný případ index_prev
. Obsahuje hodnotu o step
větší, než je hodnota index
. Tedy hodnota $smarty.section.jmeno.index_next
je rovna hodnotě $smarty.section.jmeno.index + step
.
Pro jednoduchou demonstraci, jak tyto indexy fungují, použijeme tuto šablonu:
{section name="index_test" loop="10" step="2"} {$smarty.section.index_test.index} {$smarty.section.index_test.index_prev} {$smarty.section.index_test.index_next}<br /> {/section}
Jednoduchý výstup:
0 -2 2<br /> 2 0 4<br /> 4 2 6<br /> 6 4 8<br /> 8 6 10<br />
Obsahuje hodnotu iterace cyklu, tedy po kolikáté je cyklus vykonáván. Při prvním průchodu se jedná o číslo 1, v každém dalším průchodu je obsah $smarty.section.jmeno.iteration
inkrementován o jedna.
Vlastnost first
nabývá hodnoty TRUE
při prvním průchodu cyklu. Lze využít např. při tisku hlavičky tabulky uvnitř section
.
Opak vlastnosti first
, nabývá hodnoty TRUE
při posledním průchodu cyklu. Lze využít např. při tisku patičky tabulky uvnitř section
.
Tato vlastnost je pouze alias k iteration
. Pracuje naprosto stejně.
Obsahuje hodnotu parametru loop
. V případě nastavení step
na hodnotu 1
je shodný s počtem iterací. Při změně kroku to však neplatí a toto použití může vést k nečekaným chybám. K celkovému počtu iterací slouží total
(viz dále).
Stejně jako loop
obsahuje hodnotu parametru, v tomto případě parametru show
. Tuto hodnotu lze využít v různých místech šablony, např. pro podmíněné výpisy v závislosti na tom, zda-li byl obsah cyklu vypsán, či nikoliv.
Jak jsme si již uvedli u vlastnosti loop
, total
obsahuje hodnotu celkového počtu iterací, které cyklus vykonal.
Tato funkce funguje podobně jako modifikátor strip. Odstraňuje všechny bílé znaky mezi {section}
a {/section}
. Vše, co je uvnitř HTML tagů, tedy vše mezi <
a >
logicky ignoruje, aby nedocházelo k poškozování kódu. Použití je vhodné k minimalizování kódu. Dva příklady demonstrují použití na kódu, kde jsou všechny řádky uzavřeny v HTML značkách, a na kódu, kde je uzavřen blok generovaného textu.
{strip} <table> <tr> <td>Lorem</td> <td>Ipsum</td> </tr> </table> {/strip}
Výstupem této šablony bude:
<table><tr><td>Lorem</td><td>Ipsum</td></tr></table>
A teď šablona bloku generovaného textu:
{strip} <p> Lorem ipsum dolor sit amet consectetuer cursus In consectetuer ligula nibh. Pretium hac justo et malesuada Morbi cursus consectetuer nulla Curabitur Nam. </p> {/strip}
V tuto chvíli je funkce strip
nepoužitelná, protože mezi bílé znaky
patří nejen konce řádků, ale i mezery na konci řádků. Veškeré tyto znaky byly odstraněny a tím i náš text znehodnocen, konkrétně byla odstraněna mezera za tečkou první věty, což je patrné na výsledku:
<p>Lorem ipsum dolor sit amet consectetuer cursus In consectetuer ligula nibh.Pretium hac justo et malesuada Morbi cursus consectetuer nulla Curabitur Nam.</p>
V příštím díle se začneme seznamovat se speciálními funkcemi (custom functions).
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
V dnešním článku navážeme na předchozí díly článkudobra formulacia :)