使用smarty来实现网站代码简单重用

在网站开发过程中,有大量显示组件是可以被重用的,最常见到的就是一些排行列表,如:最新排行,最热排行等。

代码结构:

index.php
class –>存放业务类
article.class.php
smarty –> smarty
template –>存放smarty模板相关
html –>模板
index.html
plugins –>插件
template_c –>smarty编译目录 Continue reading

在smarty中增加类似foreach的功能自动加载数据

在smarty中使用自定义插件来加载数据(见:http://blog.csdn.net/yycai/archive/2009/12/26/5083594.aspx), 在使用的时候还是感觉不够方便,灵机一动就想写成类似foreach那种标签:

第一步:在Smarty_Compiler.class.php的_compile_tag函数中增加:

  1. //加载
    数据的开始标签
  2. case ‘load’:
  3. $this->_push_tag(‘load’);
  4. return $this->_complie_load_start($tag_args);
  5. break;
  6. //加载数据的结束标签
  7. case ‘/load’:
  8. $this->_pop_tag(‘load’);
  9. return “<?php endforeach; endif; unset(\$_from); ?>”;
  10. break;

第二步:增加一个方法:

  1. /**
  2. * 加载数据
  3. * @param $tag_args
  4. */
  5. function _complie_load_start($tag_args)
  6. {
  7. $key = substr(md5($tag_args), 8, 16); //根据参数生成一个特殊的变量名
  8. $attrs = $this->_parse_attrs($tag_args);
  9. //这里可以增加更多的处理
  10. $class = (!isset($attrs[‘class’]) || emptyempty($attrs[‘class’])) ? ‘cls_crud’ : trim($attrs[‘class’]);
  11. (!isset($attrs[‘table’]) || emptyempty($attrs[‘table’])) && exit(‘`table` is empty!’);
  12. $db = $class::factory(array(‘table’ => substr($attrs[‘table’], 1, -1)));
  13. //定义新变量
  14. $this->_tpl_vars[$key] = $db->get_block_list(array(substr($attrs[‘where’], 1, -1)), $attrs[‘limit’]);
  15. $tag_args = “from=\${$key} “ . $tag_args;
  16. //调用foreach标签处理函数进行处理
  17. return $this->_compile_foreach_start($tag_args);
  18. }

这样就可以在模板中使用load这个标签了。用法例

如:

  1. {load table=“test” where=“`id`<100” limit=10 item=rec}
  2. {/load}

http://code.google.com /p/cyy0523xc/source/browse/trunk/php/在smarty中增加类似foreach的功能自动加载数据.txt
来源:http://blog.csdn.net/yycai/archive/2009/12/28/5092770.aspx

Smarty缩图函数

http://www.cerdmann.com/thumb/

<?php
/*
* Smarty plugin “Thumb”
* Purpose: creates cached thumbnails
* Home:
http://www.cerdmann.com/thumb/
* Copyright (C) 2005 Christoph Erdmann
*
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
* ————————————————————-
* Author:   Christoph Erdmann (CE)
* Internet:
http://www.cerdmann.com Continue reading

Smarty高级特性 – 用户自定义函数使用 SMARTY:: register_function;

Smarty 高级 特性 – 用户自定义函数 使用 SMARTY:: register_function;

前言:
很久不用smarty了,因为大多数项目都是比较轻量型的。前段时间 笔者接了个还算可以的项目,下面有几个程序员 ,与一个美工组为项目团队。为了做快速的布署应用 ,也为了小组成员能形成一个统一的view层的控制,选择了smarty。发现smarty果然还是那么的强大,那么的很黄很暴力。
作者:无喱头 Continue reading

smarty缓存使用技巧

一、使用缓存
要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可.
使用cache_lefetime指定 缓存生存时间,单位为秒
要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id, 如$smarty->display(‘index.tpl’,$my_cache_id);此特性可用于对不同的$_GET进行不同的缓存
二、清除缓存

clear_all_cache();//清除所有缓存
clear_cache(‘index.tpl’);// 清除index.tpl的缓存
clear_cache(‘index.tpl’,cache_id);//清除指定id的缓存 Continue reading

smarty模板引擎中插件的使用实例

在libs/plugins目录里新建一个function.html_options_list.php文件,内容如下:

———————————————————————————————————-
function smarty_function_html_options_list($params, &$smarty)
{
require_once $smarty->_get_plugin_filepath(‘shared’,’escape_special_chars’);

$name = null;
$text = null;
$value = null;
$selected = array();
$extra = ”;

foreach($params as $_key => $_val) {
switch($_key) {
case ‘name’:
case ‘text’:
case ‘value’:
$$_key = (string)$_val;
break;

case ‘selected’:
$$_key = array_map(‘strval’, array_values((array)$_val));
break;

case ‘options’:
$$_key = (array)$_val;
break;

default:
if(!is_array($_val)) {
$extra .= ‘ ‘.$_key.’=”‘.smarty_function_escape_special_chars($_val).'”‘;
} else {
$smarty->trigger_error(“html_options: extra attribute ‘$_key’ cannot be an array”, E_USER_NOTICE);
}
break;
}
}

if (!isset($options) )
return ”; /* raise error here? */

$_html_result = ”;

if (isset($options)) {
foreach ($options as $_i=>$_row) {
if(is_array($_row)) {
$_value = $_row[$value];
$_text  = $_row[$text];

$_html_result .= ‘<option label=”‘ . smarty_function_escape_special_chars($_text) . ‘” value=”‘ . smarty_function_escape_special_chars($_value) . ‘”‘;
if (in_array((string)$_value, $selected))    $_html_result .= ‘ selected=”selected”‘;

$_html_result .= ‘>’ . smarty_function_escape_special_chars($_text) . ‘</option>’ . “\n”;
}

}
}

if(!empty($name)) {
$_html_result = ‘<select id=”‘ . $name . ‘” name=”‘ . $name . ‘”‘ . $extra . ‘>’ . “\n” . $_html_result . ‘</select>’ . “\n”;
}

return $_html_result;
}

—————————————————–

此函数与smarty内置的html_options函数有些不一样,语法如下:
{html_options_list name=’pid’ options=$arealist text=’name’ value=’eid’ selected=’101′}
其中options为二维数组,格式为
———————————————————————————————————-
$_DCACHE[‘AREA’] = array (
1 =>
array (
‘eid’ => ‘1’,
‘name’ => ‘北京市’,
‘rid’ => ‘0’,
),
101 =>
array (
‘eid’ => ‘101’,
‘name’ => ‘东城区’,
‘rid’ => ‘1’,
),
102 =>
array (
‘eid’ => ‘102’,
‘name’ => ‘西城区’,
‘rid’ => ‘1’,
)
}
—————————————————–
name为表单的名称,如果不指定表单的名称的号,则直接输入<option value=’2′></option>格式的信息,对于表单名称需要在模板里指定.
text为二层数组里的字段名
value为下拉项值的字段,
selected为默认选中的值

所以生成的HTML代码如下
<code><select id=”pid” name=”pid”>
<option label=”北京市” value=”1″>北京市</option>
<option label=”上海市” value=”101″ selected=”selected”>东城区</option>
<option label=”天津市” value=”102″>西城区</option>
</select>
</code>
目前此函数还可以进行一些改进,如让表单的名称与id不一样,允许多选和指定大小等,

smarty类中的insert内建函数的介绍及使用方法

{insert}

{insert}标记非常象{include}标记,只是{insert}标 记是不被缓存的,即使模板的缓 存是打开的。它们在每次激活模板时运行。

属性名 类型 必需? 缺省 描述
name string Yes n/a insert函数的名称(insert_name)
assign string No n/a 输出将赋值的模板变量名
script string No n/a 在insert函数调用前需要包含的PHP脚本文件名
[var …] [var type] No n/a 传递给insert函数的变量

假定说有一个模板,在页面顶端是一个横幅的位置。横幅可以包含任意的HTML,图形,FLASH的内容,因此我们不可能在这里使用一个静态的连 接,我们也不希望该内容和页面一样被缓存。这里就用得到{insert}标记:模板需要知道#banner_location_id# 和#site_id#值(从配置文件中得 到),并需要调用一个函数来得到横幅的内容。

例子7-22. {insert}函数

{* 获得横幅的例子 *}
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

本例中,我们使用名称“getBanner”并传递参数#banner_location_id# 和#site_id#。Smarty将在你的PHP应用中寻找一个名为insert_getBanner()的函数,并传 递#banner_location_id#和#site_id#的值作为关联数组的第一个值。应用中所有的{insert}函数名都要在前面加 上”insert_”以避免可能的函数名重复。你的insert_getBanner()函数应该对传入的值加以处理并返回结果。该结果显示在模板中替换 掉{insert}标记。本例中,Smarty会这样调用函数:insert_getBanner(array(“lid” => “12345”,”sid” => “67890”));并在{insert}标记的位置显示返回的结果。

  • 如果指定了assign属性,那么{insert}标 记的输出会赋值给该模板变量而不是输出到模板中。

    注意:将输出赋值给一个模板变量在缓存打 开时不是很有用。

  • 如果指定了script属性,那么该PHP脚本将被包含(仅一次),然后才 执行{insert}函数。这是因为有可能插入函数还不存在,需要首先包含PHP脚本才能运行插入函 数。例如这里文件路径可以是绝对的,也可以是相对于$trusted_dir。如果打开了$security,那么脚本必须放置在$trusted_dir中。

Smarty对象作为第二个参数被传递。这样, 在{insert}函数中,你可以引 用并修改Smarty对象中的信息。

技术注解:模板可以有部分未被缓存。如果你打开了缓存{insert}标记将不被缓存。每次页面创建时它们都会动态运行,即使是在缓存页面内。对于横幅,投票,气 象实况,搜索结果,用户反馈区域等很有用。

参见{include}

Smarty中的Insert方法的使用教程

inset.php
内容如下
<?php
require_once  ‘libs/smarty.class.php’;
require_once  ‘msmarty.class.php’;

$tpl = new msmarty(‘./tpl_c’);
$tpl->setTpl(‘./tpl_t’);
/**
*   showmenu
*   测试smarty插件insert功能
*/
function smarty_insert_showmenu()
{
$banner = ‘<img src=1.gif width=780 height=150>’;
return $banner;
}

$tpl->display(‘test1.html’);
?

/test1.html
内 容如下
{{insert script=’insert.php’ name=’showmenu’}}
由于函数insert_showmenu函数在insert.php脚本里,所以在这里要用script来引进此文件,script要在name之前进行解析,所以对于script引进的文件可以存放一些其它变量的信息,以便在模板中使用.

smarty局部缓存

Smarty提供了强大的 缓存功能。但有时我们并不希望整篇文档都被缓存,而是有选择的缓存某一部分内容或某一部分内容不被缓存。例如你在页面上端使用一个带有广告条位置的模板, 广告条可以包含任何HTML、图象、FLASH等混合信息. 因此这里不能使用一个静态的链接,同时我们也不希望该广告条被缓存. 这就需要在 insert 函数指定,同时需要一个函数取广告条的内容信息。smarty也提供了这种缓存控制能力。

我们可以使用$smarty->register_block($params,&$smarty)使整篇页面中的某一块不被缓存。

index.tpl:

XML/HTML代码
  1. <div align=‘center’>
  2. Page created: {“0″|date_format:”%D %H:%M:%S”}
  3. <{dynamic}>
  4. Now is: {“0″|date_format:”%D %H:%M:%S”}
  5. … do other stuff …
  6. <{/dynamic}>
  7. </div>

index.php:

XML/HTML代码
  1. function smarty_block_dynamic($param, $content, &$smarty) {
  2. return $content;
  3. }
  4. $smarty = new Smarty;
  5. $smarty->caching = true;
  6. $smarty->register_block(‘dynamic’, ‘smarty_block_dynamic’, false);
  7. if(!$smarty->is_cached()){
  8. …….
  9. }
  10. $smarty->display(‘index.tpl’);

注解:
定义一个函数,函数名格式为:smarty_type_name($params, &$smarty)
type为block
name为用户自定义标签名称,在这里是{dynamic}
两个参数是必须的,即使在函数中没有使用也要写上。两个参数的功能同上。

单独这样使用,可能你发现并没有实现您所需要的功能,这是因为还需要在smarty_compiler.class.php中修改几行代码:

在上面的这个文件里面搜索$smarty->register_function(‘current_time’,’smarty_function_current_time’,true);这个字符串,大约在702行。

把这行代码修改为:

if($tag_command == ‘dynamic’) $this->_plugins[‘block’][$tag_command] = array($plugin_func, null, null, null, false);
else $this->_plugins[‘block’][$tag_command] = array($plugin_func, null, null, null, true);

之后再打开您刚才写的页面就会发现部分缓存的功能已经实现了。

动态网页制作技巧PHP:详细彻底学习Smarty

页面请求变量
以下是访问页面请求变量诸如get,post,cookies,server,enviroment和session变量的例子. 例如{$smarty.server.SERVER_NAME}取得服务器变量,{$smarty.env.PATH}取得系统环境变量path, {$smarty.request.username}取得get/post/cookies/server/env的复合变量。

{$smarty.now}变量用于访问当前时间戳.
可以用 date_format调节器格式化输出. 例如{$smarty.nowdate_format:”%Y-%m-%d %H:%M:%S”}

{$smarty.const}
你可以直接访问PHP常量. 例如{$smarty.const._MY_CONST_VAL}

{$smarty.capture}
可以通过 {capture}..{/capture}结构 截取的输出可以使用{$smarty} 变量访问.

{$smarty.config}
{$smarty}变量 可以访问已经加载的config变量.
例如 {$smarty.config.foo}就可以表示 {#foo#}.

{$smarty.section}, {$smarty.foreach}
{$smarty} 变量可以访问’section’和’foreach’循环的属性.

{$smarty.template}
显示当前被处理的模板的名字.

{$smarty.version}
显示smarty模板的版本

{$smarty.ldelim}
显示左分隔符

{$smarty.rdelim}
显示右分隔符

 

变量调节器
变量调节器用于变量,自定义函数和字符串.
可以使用”符号和调节器名称应用调节器.
变量调节器由赋予的参数值决定其行为.
参数由’:’符号分开.
如果你用变量调节器调节数组变量,结果是数组的每个值都被调节.如果你想要调节器调节整个数组,你必须在调节器名字前加上@符号.
例如: {$articleTitle@count}(这将会在输出 $articleTitle 数组里的数目)

capitalize
将变量里的所有单词首字大写. 参数值boolean型决定带数字的词是否首字大写。默认不大写

count_characters
计算变量值里的字符数.参数值boolean型决定是否计算空格数。默认不计算空格

cat
将cat里的参数值连接到给定的变量后面.默认为空。

count_paragraphs
计算变量里的段落数量

count_sentences
计算变量里句子的数量

count_Words
计算变量里的词数

date_format
日期格式

第一个参数控制日期格式.
如果传给date_format的数据是空的,将使用第二个参数作为默认时间

%a – 星期几的简写

%A – 星期几的全写

%b – 月份的简写

%B – 月份的全写

%c – 日期时间06/12/05 11:15:10

%C – 世纪时间

%d – 一个月的第几号(从 01 到 31)

%D – 同 %m/%d/%y

%e – 一个月的第几号,号为单数则前面加一空格 (从 1 到 31)

%g – 世纪

%G – 世纪 [0000,9999]

%h – 同%b

%H – 24小时形式的小时(从00到23)

%I – 12小时形式的小时(从01到 12)

%j – 一年中的第几天(从 001 到 366)

%k – 24小时形式的小时,单数字前面加空格. (从 0 到 23)

%l – 12小时形式的小时,单数字前面加空格.(range 1 to 12)