smarty 插件

来源:互联网 发布:java getmethod 编辑:程序博客网 时间:2024/05/01 11:50

大家都知道我们在设计网站的时候会对数据库做大量的select操作,而各种形式表现出来,比如很多的列表性质的区块,无论我们是采用过程的还是OO的,我们需要写大量的语句产生需要的结果,我们如果同时使用模板,比如Smarty作为表现层,我们要在PHP脚本层把数据assign给模板,再在模板上进行各种不同显示表示。
  最近写了个网站,在前台上有大量类似的List页。虽然整个系统基于MVC模式,使用工厂来抽象了很多操作,不过写起来仍然很烦琐,比如在设计模板的时候发现数据多了两条,就要到后面的model中去修改,想一想能不能让模板直接要求要显示的数据呢?经过实验,利用smarty的插件,我们很容易实现这一点:

  首先写个最最简单的smarty插件
<?php
// function.list.php
/**
* Smarty 插件
* @author doodoo
* @date 2005-09-12
*/
function smarty_function_list($params, &$smarty)
{
$sql = $params['sql'];
$assign = $params['assign'];
$limit = $params['limit'];
$conn = mysql_connect("localhost","root","");
mysql_select_db("test");
$r = mysql_query($sql." limit $limit");
while($row=mysql_fetch_array($r)){
$data[] = $row;
}
$smarty->assign($assign,$data); // 自赋值
}
?>

把这个文件放在smarty目录的plugins目录,这个插件就可以使用了。
然后我们来编写主程序文件
<?php
/**
* 主程序
* @author doodoo
*/
require_once 'Smarty.class.php';
$smarty=&new Smarty();
$smarty->display('test.html');
?>
最后我们来设计模板文件 test.html
{* 调用我们刚编写的插件 *}
{list assign="datas" sql="select name from singers order by rand()" limit=6}

{section name=i loop=$datas}
{$smarty.section.i.index+1}. 姓名:{$datas[i].name}<br>
{/section}
  现在我们运行程序,发现我们只需要把sql语句写在{list assign.. sql=...} 这里模板就可以根据我们的需要取得数据并且赋值给自己。这样一来虽然我们设计模板多了一个步骤,但却获得了更少的编程量
  当然,现实使用中我们多半不会直接把sql写在模板里,我们可能再进行一些封装,毕竟,写SQL对美工难度大了点,我这里只是提供一个思路,基于这样的思路。