`

FleaPHP中FLEA_View_Simple的bug 和 本人的修正版本

阅读更多

不知道是否是官方的忽略,这里有个很明显的bug.

function FLEA_View_Simple($path = null) {
        log_message('Construction FLEA_View_Simple', 'debug');
        $this->path = $path;
        $this->cacheLifetime = 900;
        $this->enableCache = TRUE;
        $this->cacheDir = './cache';
  $viewConfig = (array)FLEA::getAppInf('viewConfig');
        $keys = array(
            'templateDir', 'cacheDir', 'cacheLifeTime', 'enableCache',
        );
        foreach ($keys as $key) {
            if (!empty($viewConfig[$key])) {
                $this->{$key} = $viewConfig[$key];
                dump($this->{$key});
            }
        }
    }



$viewConfig = (array)FLEA::getAppInf('viewConfig');
        $keys = array(
            'templateDir', 'cacheDir', 'cacheLifeTime', 'enableCache',
        );
        foreach ($keys as $key) {
            if (!empty($viewConfig[$key])) {
                $this->{$key} = $viewConfig[$key];
                dump($this->{$key});
            }
        }

 

我在外面的配置文件如下:

 

$viewTplInf = array(
    'view' => 'FLEA_View_Simple',
    'viewConfig' => array(
        'templateDir'   => 'exap-tpl/TplEngine/tpl', 
        'cacheDir'      => 'exap-tpl/TplEngine/cache',
        'cacheLifetime' => 600 ,
        'enableCache'   => FALSE
    )
);

 

写道
if (!empty($viewConfig[$key]))

因为 empty方法,对布尔型的 false 也认为 空
所以 'enableCache' => FALSE,这个根本就传不进去

 

这个是我改正的,由于不好在源代码上做更改,我建了一个新的类..

 

<?php
/**
* TplEngine 实现了一个简单的、使用 PHP 自身作为模版语言,
* 带有缓存功能的模版引擎
*/
class TplEngine
{
    var $templateDir; //模板文件所在路径

    var $cacheLifetime; //缓存过期时间

    var $enableCache; //指示是否使用 cache

    var $cacheDir; //缓存文件保存位置

    var $vars = array(); //模板变量

    var $cacheState = array(); //保存各个缓存内容的缓存状态
    
    function config($viewTplInf = null){
            $keys = array(
            'templateDir', 'cacheDir', 'cacheLifeTime', 'enableCache',
        );
        foreach ($keys as $key) {
                if (array_key_exists($key,$viewTplInf))
                        $this->{$key} = $viewTplInf[$key];
        }
    }
    /**
     * @param string $path 模板文件所在路径
     *
     * @return Simple_View_Engine
     */
    function TplEngine() {
            $this->templateDir = './tpl' ;
        $this->cacheLifetime = 900;
        $this->enableCache = 1;
        $this->cacheDir = './cache';
    }

    /**
     * 设置模板变量
     *
     * @param mixed $name 模板变量名称
     * @param mixed $value 变量内容
     */
    function assign($name, $value = null) {
        if (is_array($name) && is_null($value)) {
            $this->vars = array_merge($this->vars, $name);
        } else {
            $this->vars[$name] = $value;
        }
    }

    /**
     * 构造模板输出内容
     *
     * @param string $file 模板文件名
     * @param string $cacheId 缓存 ID,如果指定该值则会使用该内容的缓存输出
     *
     * @return string
     */
    function fetch($file, $cacheId = null) {
        if ($this->enableCache) {
            $cacheFile = $this->_getCacheFile($file, $cacheId);
            if ($this->isCached($file, $cacheId)) {
                return file_get_contents($cacheFile);
            }
        }

        // 生成输出内容并缓存
        extract($this->vars);
        ob_start();

        include($this->templateDir . '/' . $file);
        $contents = ob_get_contents();
        ob_end_clean();

        if ($this->enableCache) {
            // 缓存输出内容,并保存缓存状态
            $this->cacheState[$cacheFile] = file_put_contents($cacheFile, $contents) > 0;
        }

        return $contents;
    }

    /**
     * 显示指定模版的内容
     *
     * @param string $file 模板文件名
     * @param string $cacheId 缓存 ID,如果指定该值则会使用该内容的缓存输出
     */
    function display($file, $cacheId = null) {
        echo $this->fetch($file, $cacheId);
    }

    /**
     * 检查内容是否已经被缓存
     *
     * @param string $file 模板文件名
     * @param string $cacheId 缓存 ID
     *
     * @return boolean
     */
    function isCached($file, $cacheId = null) {
        // 如果禁用缓存则返回 false
        if (!$this->enableCache) { return false; }

        // 如果缓存标志有效返回 true
        $cacheFile = $this->_getCacheFile($file, $cacheId);
        if (isset($this->cacheState[$cacheFile]) && $this->cacheState[$cacheFile]) {
            return true;
        }

        // 检查缓存文件是否存在
        if (!is_readable($cacheFile)) { return false; }

        // 检查缓存文件是否已经过期
        $mtime = filemtime($cacheFile);
        if ($mtime == false) { return false; }
        if (($mtime + $this->cacheLifetime) < time()) {
            $this->cacheState[$cacheFile] = false;
            @unlink($cacheFile);
            return false;
        }

        $this->cacheState[$cacheFile] = true;
        return true;
    }

    /**
     * 清除指定的缓存
     *
     * @param string $file 模板资源名
     * @param string $cacheId 缓存 ID
     */
    function cleanCache($file, $cacheId = null) {
        @unlink($this->_getCacheFile($file, $cacheId));
    }

    /**
     * 清除所有缓存
     */
    function cleanAllCache() {
        foreach (glob($this->cacheDir . '/' . "*.html") as $filename) {
            @unlink($filename);
        }
    }

    /**
     * 返回缓存文件名
     *
     * @param string $file
     * @param string $cacheId
     *
     * @return string
     */
    function _getCacheFile($file, $cacheId) {        
        return $this->cacheDir . '/' . rawurlencode($file . '-' . $cacheId) . '.html';
    }
}

 

例子:

$GLOBALS['viewTplInf'] = array(
   'templateDir'   => 'exap-tpl/TplEngine/tpl', 
   'cacheDir'      => 'exap-tpl/TplEngine/cache',
   'cacheLifeTime' => 600 ,
   'enableCache'   => true
);

 

$viewTpl = FLEA::getSingleton('TplEngine');
$viewTpl->config($GLOBALS['viewTplInf']);
dump($viewTpl);

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 xieye 2009-03-27  
还是4.0的语法。。

相关推荐

    fleaphp中文手册详细版

    Fleaphp的轻量级特性使其在小型项目中表现出色,同时,其灵活的配置和丰富的功能也适用于中大型项目。 二、路由系统 Fleaphp的路由系统允许开发者定义URL到控制器方法的映射,这样可以根据URL请求动态地执行相应的...

    Fleaphp 常用方法.doc

    在FleaPHP开源应用程序开发框架中,有几个关键的系统方法,它们是开发高效Web应用的基础。下面我们将详细探讨这些方法: 1. **FLEA::initWebControls()**: 这个函数用于初始化WebControls,它返回一个`FLEA_...

    fleaphp1.7.1524

    2. **MVC架构**:Fleaphp遵循Model-View-Controller(模型-视图-控制器)的设计模式,这是一种常见于Web开发中的架构模式。Model处理数据,View负责显示,而Controller协调这两者之间的交互,帮助开发者实现业务逻辑...

    fleaphp核心完整代码

    8. **错误处理**:Fleaphp有完善的错误处理和日志记录功能,能帮助开发者在开发过程中快速定位和解决问题。它还支持自定义错误页面,提升用户体验。 9. **安全特性**:Fleaphp关注应用的安全性,内置了防止SQL注入...

    FleaPHP 框架学习教程.pdf

    ### FleaPHP框架学习教程知识点概述 #### 一、FleaPHP框架简介 - **特点**:FleaPHP是一款轻量级的PHP框架,旨在帮助开发者快速、轻松地创建应用程序。该框架简单易懂,拥有丰富的示例和中文文档,支持PHP4和PHP5...

    fleaphp中文手册

    2. **MVC模式**:遵循Model-View-Controller(MVC)设计模式,FleaPHP将业务逻辑、数据处理和用户界面分离,使得代码结构清晰,易于维护和扩展。 3. **路由系统**:FleaPHP拥有强大的路由机制,支持基于URL的动态...

    Fleaphp框架使用规范收集.pdf

    MVC模式是软件工程中的一种设计模式,用于组织代码、分离关注点,它包含模型(Model)、视图(View)和控制器(Controller)三个核心组件。 - Model(模型):负责数据和业务逻辑,与数据库交互,封装数据。 - View...

    php框架fleaphp

    - **运行与调试**:启动服务器,访问应用,利用Fleaphp提供的错误和日志机制进行调试。 4. **拓展与优化** - **插件与扩展**:Fleaphp允许开发者编写插件,扩展框架功能,或集成第三方服务。 - **性能优化**:...

    fleaphp框架附实例(最新版)

    1. **框架结构**:Fleaphp遵循MVC(Model-View-Controller)设计模式,将业务逻辑、数据模型和用户界面分离开来,使得代码组织有序,便于理解和维护。了解框架的基本目录结构和各部分的作用至关重要,例如`app`目录...

    Fleaphp常见函数功能与用法示例

    在本文中,我们将深入探讨Fleaphp框架中的常见函数,这些函数对于理解和操作数据库至关重要。Fleaphp是一个PHP开发框架,它提供了一系列方便的数据操作接口,使得开发者能够更高效地处理数据。 1. `FLEA_Db_Table...

    fleaphp 框架实例以及详细使用方法说明

    Fleaphp框架采用MVC(Model-View-Controller)设计模式,使得业务逻辑、数据处理和用户界面分离,提高了代码的可维护性和复用性。在项目根目录下,你会找到`config`文件夹,其中包含各种配置文件,如`database.php`...

    fleaphp框架

    2. **MVC模式**:Model-View-Controller(模型-视图-控制器)是FleaPHP的基础设计模式,它将业务逻辑、数据处理和用户界面分离,提高了代码的可读性和可维护性。 3. **路由系统**:FleaPHP拥有灵活的路由规则,可以...

    FleaPHP的单入口文件详解

    4. **路由处理**:根据解析后的URL和配置中的路由规则,FleaPHP会确定应执行的控制器和方法。路由可以是预定义的,也可以动态生成,以支持RESTful API或其他高级路由策略。 5. **执行控制器**:找到对应的控制器后...

    FleaPHP 开发指南

    在FleaPHP框架中,单一入口应用程序是一个核心概念,它意味着整个应用程序的所有功能都通过一个单一的入口文件来调用和执行。这种设计模式有利于控制应用程序的流程,提高安全性和可维护性。单一入口应用程序在PHP...

    fleaphp常用方法分页之Pager使用方法

    在PHP开发中,FleaPHP是一个轻量级的框架,提供了很多实用的工具和功能,其中就包括方便的分页助手`FLEA_Helper_Pager`。本文将深入讲解FleaPHP分页辅助类`FLEA_Helper_Pager`的使用方法以及相关参数。 `FLEA_...

    FleaPHP 框架学习教程.zip

    FleaPHP采用MVC(Model-View-Controller)架构模式,这是一种广泛应用于Web应用开发的设计模式,它将数据处理、业务逻辑和用户界面分离,提高了代码的可读性和可维护性。在FleaPHP中,模型负责处理数据,视图负责...

    fleaphp手册

    fleaphp.chm手册

    FleaPHP+开发指南

    fleaphp框架,国产最好php开发框架

    FleaPHP中文API手册 chm格式

    学习FleaPHP必备,强烈推荐!

    FleaPHP分页方法讲解

    在FleaPHP中,分页功能主要由`WebControls`组件提供,这个组件包含了处理分页所需的工具和方法。 要使用FleaPHP的分页功能,首先你需要引入`WebControls`组件。在代码中,你可以通过以下方式加载: ```php require...

Global site tag (gtag.js) - Google Analytics