This article describes the usage of PHP template engine Smarty's built-in functions foreach and foreachelse. Share it with everyone for your reference, the details are as follows:
In Smarty templates, you can use foreach to repeat a block. In the template, an array needs to be allocated from PHP. This array can be a multidimensional array. The {foreach} tag in Smarty is the same as the foreach in PHP, except that one of them is used in the template file and the other is used in the PHP script. Therefore, the syntax will be different. However, they all do the same thing, which is to iterate over the contents of an array. There is also a {foreachelse} tag opposite to the {foreach} tag. The function of the {foreachelse} tag is: if the array is empty, then the content in the tag is executed. {foreach} and {/foreach} must appear in pairs in the template. It has four parameters, of which two parameters from and item are necessary. Please see the list below for its parameters:
property | Type | Is it necessary | Default value | Description | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
from | string | Yes | n/a | Name of the array to be looped | |||||||||||||||||||||||||
item | string | Yes | n/a | Variable name of the currently processed element | |||||||||||||||||||||||||
key | string | No | n/a |
Key name of the currently processed element
|
|||||||||||||||||||||||||
name | string | No | n/a | The name of the loop, used to access the loop |
Example idea: retrieve the content from the database, assign it to an array variable $_html, then assign this array variable to the template, and then traverse the array in the template
test.sql (SQL data used)
-- -- 表的结构 `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `username` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `addTime` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ; -- -- 转存表中的数据 `user` -- INSERT INTO `user` (`id`, `username`, `email`, `addTime`) VALUES (1, '苍井空', 'canjingkong@sina.com.cn', '2011-10-24 00:00:00'), (2, '樱木花道', 'ymhd@163.com', '2011-10-24 00:00:00'), (3, '赤木晴子', 'chimiqingzi@yahoo.com,cn', '2011-10-24 00:00:00'), (4, '流川枫', 'lcfeng@sina.com', '0000-00-00 00:00:00'), (5, '蜡笔小新', 'labixiaoxin@sina.com', '2011-10-24 00:00:00'), (6, '金刚葫芦娃', 'jghlw@sina.com', '2011-10-24 00:00:00');
init.inc.php (template initialization file)
<?php define('ROOT_PATH', dirname(__FILE__)); //设置网站根目录 require ROOT_PATH.'/libs/Smarty.class.php'; //加载 Smarty 模板引擎 $_tpl = new Smarty(); //创建一个实例对象 $_tpl->template_dir = ROOT_PATH.'/tpl/'; //重新指定模板目录 $_tpl->compile_dir = ROOT_PATH.'./com/'; //重新指定编译目录 $_tpl->left_delimiter = '<{'; //重新指定左定界符 $_tpl->right_delimiter = '}>'; //重新指定右定界符 ?>
index.php (main file)
<?php require 'init.inc.php'; //引入模板初始化文件 global $_tpl; $_mysqli = new mysqli(); //创建一个 mysqli() 对象 $_mysqli->connect('localhost','root','数据库密码','数据库名'); //连接数据库,请您自行设置 $_mysqli->set_charset('utf8'); //设置编码 $_result = $_mysqli->query("select username,email,addTime from user order by id asc"); $_html = array(); while (!!$_row=$_result->fetch_assoc()) { $_html[] = $_row; } $_tpl->assign('data',$_html); //把数组分配到模板中 $_tpl->display('index.tpl'); //引入模板 $_mysqli->close(); //关闭数据库,释放资源 ?>
tpl/index.tpl (template file of the main file index.php)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>foreach,foreachelse</title> </head> <body> <table align="center" border="1" width="800"> <{foreach from=$data item="row" name="ls"}> <!-- 这个foreach 循环分配过来的数组有几行数据 --> <!-- 在此,我们做几个保留变量 $smarty.foreach 的操作 --> <!-- 当数据显示第一条的时候,第一行的表格背景为黄色,使用属性:first --> <!-- 当数据显示最后一条的时候,最后一行的表格背景为蓝色,使用属性:last --> <!-- 显示下分配过来的数组的总个数,使用属性:total --> <{if $smarty.foreach.ls.first}> <tr bgcolor="#FFFF00"> <!-- 第一行背景为黄色 --> <{elseif $smarty.foreach.ls.last}> <tr bgcolor="#0000FF"> <!-- 最后一行背景为蓝色 --> <{else}> <tr> <{/if}> <td><{$smarty.foreach.ls.iteration}></td><!-- 注意:这里是保留变量 $smarty.foreach 的使用,iteration:总是从 1 开始,每执行一次增加 1 --> <{foreach from=$row item="col" name="lsin"}> <!-- 这个foreach 循环数组内的内容,显示在表格的<td></td>标签里 --> <td><{$col}></td> <{/foreach}> </tr> <{foreachelse}> <!-- 如果分配过来的数组中没有数据,那么就执行下面的操作! --> <tr> <td>对不起!暂时没有数据。</td> </tr> <{/foreach}> <tr> <td colspan="4" align="center">分配数组的总记录数为:<{$smarty.foreach.ls.total}>条</td> </tr> </table> </body> </html>
Execution result:
Finally, the array $_html passed in the main file index.php is a two-dimensional array. The use of reserved variables $smarty.foreach is based on the name attribute in the {foreach} tag. The reserved variable attributes used are: first (first record), last (last record), iteration (always starts from 1, Increase by 1 for each execution), total (used to display the number of loop executions)
Readers who are interested in more PHP-related content can check out the special topics of this site: "Basic Tutorial for Getting Started with Smarty Templates", "Summary of PHP Template Technology", "Summary of PHP Database Operation Skills Based on PDO", "PHP Operations and Operators" Usage summary", "PHP network programming skills summary", "PHP basic syntax introductory tutorial", "php object-oriented programming introductory tutorial", "php string (string) usage summary", "php mysql database operation introductory tutorial" and "Summary of Common Database Operation Skills in PHP"
I hope this article will be helpful to everyone’s PHP program design based on smarty templates.