SmartTemplate 1.2.1 官方源文件 可以从http://download.youkuaiyun.com/source/670995下载
本系列文章中的实例代码可以到我的资源http://download.youkuaiyun.com/source/670977下载
以前学东西都是东一块西一块的,现在正好有时间,学点东西,同时也做一下记录,以便备忘,也希望可以帮到学习SmartTemplate 的同学,初学,文中难免有纰漏,如有错误或不同意见,希望可以跟我联系lxbin544930@163.com,我会及时更正,共勉。
2. Alternating_Colors
【Content】basic/Alternating_Colors.php:
- <?php
- require_once "../config/smarttemplate_basic.cfg.php";
- $page = new SmartTemplate("Alternating_Colors.html");
- $users = array(
- array( 'NAME' => 'John Doe', 'GROUP' => 'ADMIN' ),
- array( 'NAME' => 'Jack Doe', 'GROUP' => 'SUPPORT' ),
- array( 'NAME' => 'James Doe', 'GROUP' => 'GUEST' ),
- array( 'NAME' => 'Jane Doe', 'GROUP' => 'GUEST' ),
- );
- $page->assign( 'users', $users );
- $page->output();
- ?>
【Template】templates/basic/Alternating_Colors.html:
- <style type="text/css">
- .BG_0 { background-color: #D0D0D0; }
- .BG_1 { background-color: #F0F0F0; }
- </style>
- <table border="1" cellpadding="2" cellspacing="0">
- <!-- BEGIN users -->
- <tr class="BG_{ROWBIT}">
- <td>第{ROWCNT}行</td>
- <td>{NAME}</td>
- <td>{GROUP}</td>
- </tr>
- <!-- END users -->
- </table>
【Return】
- <style type="text/css">
- .BG_0 { background-color: #D0D0D0; }
- .BG_1 { background-color: #F0F0F0; }
- </style>
- <table border="1" cellpadding="2" cellspacing="0">
- <tr class="BG_0">
- <td>第0行</td>
- <td>John Doe</td>
- <td>ADMIN</td>
- </tr>
- <tr class="BG_1">
- <td>第1行</td>
- <td>Jack Doe</td>
- <td>SUPPORT</td>
- </tr>
- <tr class="BG_0">
- <td>第2行</td>
- <td>James Doe</td>
- <td>GUEST</td>
- </tr>
- <tr class="BG_1">
- <td>第3行</td>
- <td>Jane Doe</td>
- <td>GUEST</td>
- </tr>
- </table>
【效果图】
【琐记】
上一篇Blog里讲到了模板的简单赋值替换,只是单纯的将一个单模板变量{TITLE}替换为我们需要的值,然后输出,就像我们学C的时候遇到的“定义一个string类型变量,然后给这个变量赋值,最后printf这个变量”一样,只是很简单的应用。
在实际开发中,我们会遇到类似上图的报表数据,如果用SmartTemplate模板我们应该怎么做呢?这里先不做回答,我们先看一个生活中的例子,如果我们要送给某人某些东西,首先我们要先拿到东西,然后通过某些途径直接或间接(电话或住址等)地找到这个人,然才能把指定的东西给他。那么好,我们再回到Hello_Word的哪一篇,Hello_Word.php通过new tempate('')带我们来到Hello_Word.html的家门口,通过{TITLE}找到要接受指定值的人,这样寄送的工作完成,之后就是output了,很简单,貌似啰嗦了很长-_- !
接下来就是当前的问题,要表现类似上图的报表数据,应该怎么办?要通过怎样的途径才能找到要赋值的数据区域,又要给它什么样的东西(数据类型)他才会接收,当然至于怎样接受是模板类本身要解决的问题不用我们管啦。
SmartTemplate模板使用<!-- BEGIN users-->.....<!-- END users-->来指定users的数据块,php文件通过它来找到要替换的数组变量users,并将欲替换array变量$users按KEY入座,并迭代替换,我们看Alternating_Colors.html中的{NAME}{GROUP}与Alternating_Colors.php中的$users数组做对照就会明白了。还有一个问题就是{ROWBIT}和{ROWCNT}是什么意思呢?中文中有顾名思义,英文中也有,呵呵。。
ROWBIT可以姑且理解为行的bit值,只有0和1,这样如果我们要做奇偶行判断就很方便了;
ROWCNT就可以理解为行的count值,也就是数据行号,只不过它的起始位是0,如果需要起始位为1,只要修改include/class.smarttemplateparser.php文件123行
- . "/$$block"."['ROWCNT']=/$rowcnt;/n"
改为
- . "/$$block"."['ROWCNT']=/$rowcnt+1;/n"
就OK了,如果修改之后没有看到预期的效果,清空一下temp文件夹再试。
【附录】
include/class.smarttemplateparser.php中解析<!-- BEGIN users-->.....<!-- END users-->的PHP代码(不做解释,仅供参考,方便理解和查阅)
- // 'BEGIN - END' Blocks
- if (preg_match_all('/<!-- BEGIN ([a-zA-Z0-9_.]+) -->/', $page, $var))
- {
- foreach ($var[1] as $tag)
- {
- list($parent, $block) = $this->var_name($tag);
- $code = "<?php/n"
- . "if (!empty(/$$parent"."['$block'])){/n"
- . "if (!is_array(/$$parent"."['$block']))/n"
- . "/$$parent"."['$block']=array(array('$block'=>/$$parent"."['$block']));/n"
- . "/$_tmp_arr_keys=array_keys(/$$parent"."['$block']);/n"
- . "if (/$_tmp_arr_keys[0]!='0')/n"
- . "/$$parent"."['$block']=array(0=>/$$parent"."['$block']);/n"
- . "/$_stack[/$_stack_cnt++]=/$_obj;/n"
- . "foreach (/$$parent"."['$block'] as /$rowcnt=>/$$block) {/n"
- . "/$$block"."['ROWCNT']=/$rowcnt;/n"
- . "/$$block"."['ALTROW']=/$rowcnt%2;/n"
- . "/$$block"."['ROWBIT']=/$rowcnt%2;/n"
- . "/$_obj=&/$$block;/n?>";
- $page = str_replace("<!-- BEGIN $tag -->", $code, $page);
- }
- }
今天电脑中毒,开机就弹svchost.exe错误,任务管理器还罢工,搞了一下午才算OK了,郁闷。。。,可能情绪会影响文中某些语句的表达,如有语无伦次、语意模糊的地方希望大家多多拍砖,家里在改房子-_-!!。
明日任务:SmartTemplate 实例分析——基本语法[basic]之Nested_Blocks.html(这是一个嵌套两个<!-- BEGAIN ** --><!-- END *** -->数据块的例子,鉴于本文已经涉及到相关内容,故该Blog会写的比较简单)