在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局部缓存

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)