widget 修改使用[3.2]

浏览:2926 发布日期:2013/08/11 分类:技术分享 关键字: widget
//3.2去掉了widget.class.php
//直接调用R()函数。


// Widget/PublicWidget.class.php
class PublicWidget extends Action{
    function editor($data){
        $this->assign($data);
        $this->display([模块/操作]);
    }
}
//页面调用
{:W('Public/editor',array('width'=>500,'name'=>'editor')}
//不同的模块调用Widget都得指定页面
//突然.....

//--------代码重构--------
//1、修改W()
function W($name, $data=array()) {
    $info   =   pathinfo($name);
    $action =   $info['basename'];
    $module =   $info['dirname'];
    $class = $module . 'Widget'[phone][/phone];
    require_cache(COMMON_PATH . 'Widget/' . $class . '.class.php');
    if (!class_exists($class))
        throw_exception(L('_CLASS_NOT_EXIST_') . ':' . $class);
    $widget = Think::instance($class);
    $widget->template = $action;
    $widget->$action($data);
}
//2、添加Widget.class.php 目录ThinkPHP/Lib/Core/Widget.class.php
// 别名加载中没有去掉widget,省掉一步。
// 附件下载
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// | Example: 调用  W('Public/editor',array('width'=>'500','name'=>'cnntent'))
// | ****     Widget比较集中放在一个地方。修改的时候也好改    ****
// | class PublicWidget extends Widget{  
// |     protected $tVar =   array();
// |     function editor($data){
// |         echo $data['width'].$data['name'];
// |         //$this->assign($data);
// |         //模版放在 COMMON_PATH /Widget/Public/editor.html
// |         //display方法不指定页面则为 方法名.html
// |         //$this->display([可以指定页面]);
// |     }
// | }
// +----------------------------------------------------------------------
/**
* ThinkPHP Widget类 抽象类
* @category Think
* @package Think
* @subpackage Core
* @author 
*/
abstract class Widget {

    // 使用的模板文件名称
    public $template = '';
    protected $tVar =   array();

    /**
     * 模板变量赋值
     * @access public
     * @param mixed $name
     * @param mixed $value
     */
    protected function assign($name,$value=''){
        if(is_array($name)) {
            $this->tVar   =  array_merge($this->tVar,$name);
        }else {
            $this->tVar[$name] = $value;
        }
    }

    /**
     * 渲染模板输出 
     * @access public
     * @param string $templateFile 模板文件
     * @param mixed $var 模板变量
     * @return string
     */
    protected function display($templateFile='') {
        layout(false);
        ob_start();
        ob_implicit_flush(0);
        if(!file_exists_case($templateFile)){
            // 自动定位模板文件
            $name = substr(get_class($this),0,-6);
            $filename = empty($templateFile)?$this->template:$templateFile;
            $templateFile = COMMON_PATH.'Widget/'.$name.'/'.$filename.C('TMPL_TEMPLATE_SUFFIX');
            if(!file_exists_case($templateFile))
                throw_exception(L('_TEMPLATE_NOT_EXIST_').'['.$templateFile.']');
        }
        
        if($this->checkCache($templateFile)) { // 缓存有效
            // 分解变量并载入模板缓存
            extract($this->tVar, EXTR_OVERWRITE);
            //载入模版缓存文件
            include C('CACHE_PATH').md5($templateFile).C('TMPL_CACHFILE_SUFFIX');
        }else{
            // 视图解析标签
            $params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>'','prefix'=>'');
            tag('view_parse',$params);
        }
        $content = ob_get_clean();
        tag('view_filter',$content);
        $charset = C('DEFAULT_CHARSET');
        $contentType = C('TMPL_CONTENT_TYPE');
        // 网页字符编码
        header('Content-Type:'.$contentType.'; charset='.$charset);
        header('Cache-control: '.C('HTTP_CACHE_CONTROL'));  // 页面缓存控制
        header('X-Powered-By:ThinkPHP');
        // 输出模板文件
        echo $content;
    }

    /**
     * 检查缓存文件是否有效
     * 如果无效则需要重新编译
     * @access public
     * @param string $tmplTemplateFile 模板文件名
     * @return boolen
     */
    protected function checkCache($tmplTemplateFile) {
        if (!C('TMPL_CACHE_ON')) // 优先对配置设定检测
            return false;
        $tmplCacheFile = C('CACHE_PATH').md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX');
        if(!is_file($tmplCacheFile)){
            return false;
        }elseif (filemtime($tmplTemplateFile) > filemtime($tmplCacheFile)) {
            // 模板文件如果有更新则缓存需要更新
            return false;
        }elseif (C('TMPL_CACHE_TIME') != 0 && time() > filemtime($tmplCacheFile)+C('TMPL_CACHE_TIME')) {
            // 缓存是否在有效期
            return false;
        }
        // 缓存有效
        return true;
    }
}

附件 Widget.class.rar ( 1.52 KB 下载:56 次 )

最佳答案
评论( 相关
后面还有条评论,点击查看>>