Smarty Template Engine 11.díl - Řídící struktury II.
V mnoha případech dolování dat nám jednoduchý příkaz „foreach“ stačit nebude. Nároky mohou být různé, stejně tak se pak mění i způsob, jakým přistupovat k prvkům pole. Proto existuje ve Smarty příkat „section“, který nabízí kodérům několik zásadních možností, které v praxi jednou určitě oceníte. Šikovný programátor si jednotlivé metody dokáže i ve Smarty doladit sám, proč však nevyužít možností, jež nám Smarty samo nabízí.
Section
Příkaz section se z PHP nejvíce podobá cyklu „for“, jež známe z většiny programovacích jazyků od Basicu, přes Pascal až po Javu. Oproti foreach je však přístupování k řádkům DB, či prvkům pole mírně odlišné a mění se i zápis atributů.
index.php
<?php
require_once("./hlavicka.php");
/*----vytvoreni asociativniho pole----*/
$days[0] = array('name' => 'pondeli', 'shrt' => 'mon');
$days[1] = array('name' => 'utery', 'shrt' => 'tue');
$days[2] = array('name' => 'streda', 'shrt' => 'wen');
$days[3] = array('name' => 'ctvrtek', 'shrt' => 'thurs');
$days[4] = array('name' => 'patek', 'shrt' => 'fri');
$days[5] = array('name' => 'sobota', 'shrt' => 'sat');
$days[6] = array('name' => 'nedele', 'shrt' => 'sun');
$smarty->assign('days', $days);
$smarty->display('index.tpl');
?>
index.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-language" content="cs" />
<title>
Smarty - index
</title>
</head>
<body>
<div>
<p>
{section name=dny loop=$days}
den: {$days[dny].name} ({$days[dny].shrt}) <br/>
{sectionelse}
Pole je prázdné.
{/section}
</p>
</div>
</body>
</html>
Nejjednodušší zápis vydíte výše. Včetně bloku „sectionelse“, jež slouží k určení instrukcí, v případě, že předáme prázdné pole.
Základní parametry pro vypsání jsou tedy takovéto:
- name – určení názvu section. Unikátní v rámci šablony
- loop – proměnná, jež má být procházena
Způsob, jak přistoupit k jednotlivé hodnotě je pak následující:
$loop[name] /* v případě, že obsahuje pouze jeden sloupec*/
$loop[name].sloupec /* v případě, že sloupců je více*/
Výhody section proti Foreach
Co tedy nabízí příkaz section, krom jiného zápisu, navíc? První a zároveň jedno z nejpříjemnějších vylepšení oceníte v případě, kdy např. Vypisujete data ze dvou sql dotazů, přiřazených pomocí dvou různých proměnných.
V takovém případě se nemusíte odkazovat pomocí podmínek a ID řádku, ale příkaz section umožní vypsání dalších polí (dle stejného indexu pole) až do hodnoty, jež je nastavena počtem řádku v proměnné, přiřazené prostřednictvím atributu „loop“.
Jasnější by to mohlo být na příkladě.
index.php
<?php
require_once("./hlavicka.php");
$ttl = array('Mgr.','Ing.','');
$smarty->assign('ttl',$ttl);
$firstName = array('John','Josh','Jane');
$smarty->assign('firstName',$firstName);
$lastName = array('First', 'Second', 'Third');
$smarty->assign('lastName',$lastName);
$smarty->display('index.tpl');
?>
Vytvoříme si tedy tři proměnné, všechny se stejným počtem řádků.
index.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-language" content="cs" />
<title>
Smarty - index
</title>
</head>
<body>
<div>
<p>
{section name=person loop=$lastName}
<p>
{$ttl[person]|default:'Mr.'} {$firstName[person]} {$lastName[person]}<br/>
</p>
{/section}
</p>
</div>
</body>
</html>
V šabloně pak nastavíme jako výchozí proměnnou, jež budeme procházet. V našem případě jsem si vybral příjmení == "lastName". Nemusíme však připisovat další příkazy section (jak by tomu bylo u foreach) a příkaz automaticky vypíše prvky se stejným ID z ostatních proměnných.
Vnořování
Na nesouvislá data se dá také odkazovat pomocí indexu ať už přímo v atributech cyklu, nebo pomocí podmínek. Tuto možnost si rozebereme v příštích dílech.