94hwan-PHP框架基本原理

Source:94hwan 与众不同  Author:网络部
2011-09-20 14:36

tpl 类实际上对smarty进行简化封装,它的成员方法都是静态方法,因此使用是相当简单的。

1、在这个类中,实际上主要是先通过 public static function init () 初始化 smarty 对象,并设定好相关参数,因为在所有操作中都会先调用一下这个方法,所以实际上使用时是不用理会它的。

使用方式很简单,这里以一个实例来说明:
 

  1. /** 
  2.     * 获取联盟代码 
  3.     */ 
  4.     public function get_code() 
  5.     { 
  6.         $accctl = cls_access::get_instance(); 
  7.         if$accctl->fields['sta']==-1 ) 
  8.         { 
  9.             cls_access::show_message ('''你的帐号目前处于被冻结状态,系统暂时停止为你分配推广渠道。''-1', 3000); 
  10.             exit(); 
  11.         } 
  12.         $url = pub_users::get_url($accctl->fields['userid'], $accctl->fields['site']); 
  13.         if$accctl->fields['sta'] != 5  ) 
  14.         { 
  15.             tpl::display('index.get_code.wait.tpl'); 
  16.             exit(); 
  17.         } 
  18.         tpl::assign('un_url'$url ); 
  19.         tpl::display('index.get_code.tpl'); 
  20.         exit(); 
  21.     } 

实际上,我们大多数情况下使用到的都是只有 assign 和 display,至于一些调用范围较多的变量,并不建议直接 assign 而是通过smarty动态触发的插件来处理。
这里需注意的是

tpl::display('index.get_code.tpl');

就是这个模板文件名,在 index.php 没指定  $config_appname 的情况下,它是在 templates\template 这目录的,指定了的情况下是在 templates\template\$config_appname

不过如果要在模板内使用 include 标签,那么,include 指定的文件是相对于 templates\template 这目录的。

2、模板标签与约定
(1) 标签一律用 <{  }> 这种格式,而不是 { },这样可以防止HTML里出现css或js代码而不兼容。
(2) 自定义的插件均放在 smarty_plugins 这文件夹。
(3) 可以用 myblock.lurd_*.php 去定义一个自动返回二维数组,并进行foreach循环的插件,如:myblock.lurd_article.php
 

  1. <?php 
  2. /** 
  3.  * 新文章列表 
  4.  * 用法与foreach相同,区别在于不用传递 from 属性 
  5.  * 返回$datas 模板中的值为:item = array('r'=>当前栏目数据, 's'=>array(所有子栏目) ) 
  6.  *#例子:################################## 
  7.  <{lurd_article key=k item=v row='8' }> 
  8.      <a href='/?ac=show&aid=<{$v.aid}>'><{$v.title}></a><br/> 
  9.  <{/lurd_article}> 
  10.  *######################################### 
  11.  */ 
  12. function smarty_myblock_lurd_article($_params, &$compiler
  13.     $num = emptyempty($_params['num']) ? 8 : intval($_params['num']); 
  14.     $cid = emptyempty($_params['cid']) ? 0 : intval($_params['cid']); 
  15.     $sid = emptyempty($_params['sid']) ? 0 : intval($_params['sid']); 
  16.     $orderway = emptyempty($_params['orderway']) ? 'desc' : $_params['orderway']; 
  17.     $orderby = emptyempty($_params['orderby']) ? 'aid' : intval($_params['orderby']); 
  18.     $cond = ''
  19.     //文档排序 
  20.     if($orderby == 'hot'
  21.     { 
  22.         $i = 0; 
  23.         $cache_db = cls_cache_db::factory('archives'); 
  24.         ifemptyempty($cache_db->tables['archives']['datas'][0]) ) 
  25.         { 
  26.             return array(); 
  27.         } 
  28.         $sortlists = smarty_myblock_lurd_article_hot(); 
  29.         foreach($cache_db->tables['archives']['datas'][0] as $pri => $row
  30.         { 
  31.             if( isset($sortlists[$pri]) ) 
  32.             { 
  33.                 $sortlists[$pri][1][] = $row
  34.             } 
  35.         } 
  36.         $datas = array(); 
  37.         $cond = $sid > 0 ? 3 : ( $cid > 0 ? 2 : 1 ); 
  38.         foreach($sortlists as $k=>$v
  39.         { 
  40.             $arow = $v[1][0]; 
  41.             if($cond==3) 
  42.             { 
  43.                 if($arow['sid']==$sid) { 
  44.                     $arow['click'] = $v[0]; 
  45.                     $datas[] = $arow
  46.                     $i++; 
  47.                 } 
  48.             } 
  49.             else if($cond==2) 
  50.             { 
  51.                 if($arow['cid']==$cid) { 
  52.                     $arow['click'] = $v[0]; 
  53.                     $datas[] = $arow
  54.                     $i++; 
  55.                 } 
  56.             } 
  57.             else 
  58.             { 
  59.                $arow['click'] = $v[0]; 
  60.                $datas[] = $arow
  61.                $i++; 
  62.             } 
  63.             if$i>=$num ) 
  64.             { 
  65.                 break
  66.             } 
  67.         } 
  68.         return $datas
  69.     } 
  70.     //普通调用 
  71.     else 
  72.     { 
  73.         if$cid>0 ) { 
  74.             $cond = " @cid=$cid "
  75.         } 
  76.         if$sid>0 ) { 
  77.             $cond = " @sid=$sid "
  78.         } 
  79.         $sql = "Select * From archives where 1 $cond order by {$orderby} {$orderway} limit $num"
  80.         $datas = cls_cache_db::select_sql($sql); 
  81.         if( !is_array($datas) ) return array(); 
  82.     } 
  83.     return $datas
  84.  
  85. /** 
  86.  * 获得所有数据的反向排序记录 
  87.  */ 
  88. function smarty_myblock_lurd_article_hot() 
  89.     $datas = array(); 
  90.     $data = cls_cache_db::select_sql("Select * From tongji where 1 order by count desc limit 0"); 
  91.     foreach($data as $row
  92.     { 
  93.         $datas[$row['aid']][0] = $row['count']; 
  94.     } 
  95.     return $datas
  96.  
  97. ?> 
  98.   

1、定义模板变量或给模板变量赋值
tpl::assign ($tpl_var_name,  $value)

2、显示视图(显示解析运行后的模板
tpl::display ($tpl,  $is_debug_mt=true)
$is_debug_mt  是否调试内存(如果想要实时获得程序在某代码断使用了多少内存,可以用 test_debug_mt( msg ) 在该处调试,debug信息会显示出这些地方内存占用情况)

3、获取解析运行模板后的内容
tpl::fetch( $tpl )

$tpl 是相对于 templates/template 目录的,因此如果你的模板里有include其它子目录模板,应该加上目录名,如果应用在子目录,也可以在 index.php 用 $config_appname = 'appname' 指定目录名,那样$tpl可以省略目录名,但是如果是在smarty模板进行include的情况则是必须指定全名的。

 

...