喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
     
标题: [原创] 给 smarty include file 加扩展  
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 533
帖子 669
金钱 523 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
给 smarty include file 加扩展

最近再写一个东西,需要不同的用户加载不同的模板,这样就有一个问题,如果这个用户的某些东西,没有生成静态缓存,或者我们后期给用户添加一个块的静态缓存怎么办? 难道再不断的去判断这个文件是否存在不存在,怎么样,建立一个空的,等等,这样如果后期修改了很多的话,那这个初始化的程序就会特别的大,而且不好维护,我们既然使用了smarty作为我们的表现层,那我们扩展下表现层,来让smarty支持,我们的这个方法,如果加载的文件不存在那么加载一个默认的文件就可以了,这样就算我们文件不存在也没关系,当文件存在的时候自然就加载那个存在的文件去了。

关于smarty的 那个indeclude file有这样的一种用法 来自手册

<?php
{* windows absolute filepath (MUST use "file:" prefix) *}
{include 
file="file:C:/www/pub/templates/header.tpl"}

{* include 
from template resource named "db" *}
{include 
file="db:header.tpl"}
?>
那么好吧,我们只需要扩展一个我们自己的文件类型就可以了

我们叫load,也就是说,如果文件不存在我们就自动加载一个我们默认的文件

再使用上我们将这样使用

<?php
{% include file="load:commont_formaaa.tpl" %}
?>
那么好我们现在看下如何扩展smarty

1,首先找到Smarty.class.php

然后继续

2,我们会修改 function _parse_resource_name(&$params) 这个函数,基本再 1621行左右

我们修改成

<?php
function _parse_resource_name(&$params)
    {
        
// split tpl_path by the first colon
        
$_resource_name_parts explode(':'$params['resource_name'], 2);

        if (
count($_resource_name_parts) == 1) {
            
// no resource type given
            
$params['resource_type'] = $this->default_resource_type;
            
$params['resource_name'] = $_resource_name_parts[0];
        } else {
            if(
strlen($_resource_name_parts[0]) == 1) {
                
// 1 char is not resource type, but part of filepath
                
$params['resource_type'] = $this->default_resource_type;
                
$params['resource_name'] = $params['resource_name'];
            } else {
                
$params['resource_type'] = $_resource_name_parts[0];
                
$params['resource_name'] = $_resource_name_parts[1];
            }
        }
        
//sanshi edit start 2008-2-13 old /* if ($params['resource_type'] == 'file') */
        
if ($params['resource_type'] == 'file' || $params['resource_type'] == 'load' ) {
        
//sanshi edit end  2008-2-13 
            
if (!preg_match('/^([/\]|[a-zA-Z]:[/\])/'$params['resource_name'])) {
                
// relative pathname to $params['resource_base_path']
                // use the first directory where the file is found
                
foreach ((array)$params['resource_base_path'] as $_curr_path) {
                    
$_fullpath $_curr_path DIRECTORY_SEPARATOR $params['resource_name'];
                    if (
file_exists($_fullpath) && is_file($_fullpath)) {
                        
$params['resource_name'] = $_fullpath;
                        return 
true;
                    }
                    
// didn't find the file, try include_path
                    
$_params = array('file_path' => $_fullpath);
                    require_once(
SMARTY_CORE_DIR 'core.get_include_path.php');
                    if(
smarty_core_get_include_path($_params$this)) {
                        
$params['resource_name'] = $_params['new_file_path'];
                        return 
true;
                    }else{
                        
//sanshi add start 2008-2-13
                        
if($params['resource_type'] == 'load')
                        {
                            
$params['resource_name'] = $params['resource_base_path']."not_file.tpl";
                            return 
true;
                        }
                        
//sanshi add end 2008-2-13
                    
}
                }
                return 
false;
            } else {
                
/* absolute path */
                
return file_exists($params['resource_name']);
            }
        } elseif (empty(
$this->_plugins['resource'][$params['resource_type']])) {
            
$_params = array('type' => $params['resource_type']);
            require_once(
SMARTY_CORE_DIR 'core.load_resource_plugin.php');
            
smarty_core_load_resource_plugin($_params$this);
        }

        return 
true;
    }
?>
其他的地方就不用修改了,就实现了,不存在就加载的功能,不过需要注意的是

$params['resource_base_path']."not_file.tpl"; 这个文件要存在,当然您可以修改成您自己的,我的这个是在 templates 目录下,有一个 not_file.tpl 这样的一个文件作为我的默认加载文件,这个扩展就算完事了。

作者 叁石  sanshi0815
mail sanshi0815@tom.com

blog : http://blog.csdn.net/sanshi0815
2008-2-14 10:07 AM#1
查看资料  Blog  发短消息  QQ  顶部
 
三叶草
新手上路
Rank: 1



UID 73879
精华 0
积分 0
帖子 19
金钱 0 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2006-5-23
状态 离线
[推荐阅读] select 语句,请教
学习了哦!
2008-2-19 10:06 AM#2
查看资料  发短消息  顶部
 
八月樱桃
新手上路
Rank: 1


UID 97617
精华 0
积分 8
帖子 19
金钱 8 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-8-28
来自 北京
状态 离线
[推荐阅读] php项目外包论坛启动,招版主(跟村子侧重不同,不产生冲突,版主误删,谢谢合作)
老整让我这么迷糊的东西,还不给我讲~~~

我不明白的话,就没有办法到处宣扬你的才华了啊。。。

你这么个这么油菜花的人~~~




今天比昨天好,这就是希望……
2008-3-5 09:55 AM#3
查看资料  发短消息  QQ  顶部
 
奶瓶 (NP博士)
版主
Rank: 7Rank: 7Rank: 7
老仙


UID 52707
精华 4
积分 5354
帖子 5861
金钱 5304 喜悦币
威望 50
人脉 0
阅读权限 100
注册 2004-11-22
来自 北大中文系
状态 在线
[推荐阅读] 有套网站程序需优化!
人家已经已婚了




图片包子,注册送100包子!
2008-3-5 01:49 PM#4
查看资料  访问主页  Blog  发短消息  QQ  ICQ 状态  Yahoo!  顶部
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 533
帖子 669
金钱 523 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
[推荐阅读] 招聘不写工作时间,工作待遇的--一个字:滚
我没结婚,暂时单身,诽谤的k掉
2008-3-6 01:17 PM#5
查看资料  Blog  发短消息  QQ  顶部
 
dreamblaze
高级会员
Rank: 4
administrator


UID 78956
精华 0
积分 989
帖子 1003
金钱 863 喜悦币
威望 0
人脉 126
阅读权限 50
注册 2006-8-24
来自 福州
状态 离线
[推荐阅读] [北京]ZEND 框架开发人员2-3名 春节后上班(包吃住 税后5K-7K)
BS处男。



天下流氓数吾乡
吾乡流氓数吾庄
吾庄流氓数吾弟
吾教吾弟耍流氓   
2008-3-7 05:27 PM#6
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
无喱头 (无喱头)
论坛元老
Rank: 8Rank: 8
扯蛋仙


UID 24846
精华 3
积分 5957
帖子 1146
金钱 5893 喜悦币
威望 30
人脉 34
阅读权限 90
注册 2003-11-26
状态 离线
[推荐阅读] PhpCms/Wap项目应用技术小组
胖三嘛时抱儿子?



扯吧,一年又一年。。。
2008-3-11 08:39 PM#7
查看资料  Blog  发短消息  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.029113 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP