SmartyZip,一个Smarty的装载类
<?php
// 设定参数[设置项]Smarty的Zip文件下载地址
SmartyZip::$zip_url = 'http://www.smarty.net/distributions/Smarty-2.6.26.zip';
//[设置项]Smarty的Zip文件缓存位置
SmartyZip::$zip_file = sys_get_temp_dir().preg_replace('/^.*\/(Smarty-.*.zip)$/i', 'smarty/$1', SmartyZip::$zip_url);
SmartyZip::$entry_dir = preg_replace('/^.*\/(Smarty-.*).zip$/i', '$1/libs', SmartyZip::$zip_file);
//[设置项]Smarty程序文件缓存位置
SmartyZip::$extract_dir = sys_get_temp_dir().'smarty/' . SmartyZip::$entry_dir;
//[设置项]Smarty模板文件 所在位置
SmartyZip::$template_dir = dirname(realpath(__FILE__));
//[设置项]Smarty编译文件缓存位置
SmartyZip::$compile_dir = sys_get_temp_dir().'smarty/template_c/'.md5(SmartyZip::$template_dir);
// 注册协议
if (!in_array('SmartyZip', stream_get_wrappers())) {
stream_wrapper_register('SmartyZip', 'SmartyZip');
}
// 定义常量
if (!defined('SMARTY_DIR')) {
define('SMARTY_DIR', 'SmartyZip://');
}
// 包含程序
require_once (SMARTY_DIR . 'Smarty.class.php');
// $smarty = SmartyZip::init(new Smarty); // [选择项]引用即定义$smarty
// return SmartyZip::init(new Smarty); // [选择项]引用即返回$smarty,注意只可引用一次。
/**
* SmartyZip类定义
*/
class SmartyZip {
/**
* Smarty变量
*/
public static $zip_url;
public static $zip_file;
public static $entry_dir;
public static $extract_dir;
public static $template_dir;
public static $compile_dir;
/**
* Stream变量
*/
private $handle;
public $context;
/**
* Smarty函数组
*/
/**
* init
* @param Smarty &$smarty
* @return Smarty
*/
public static function init(&$smarty) {
$smarty->template_dir = self::$template_dir;
if (!is_dir(self::$compile_dir)) {
if (mkdir(self::$compile_dir, 0777, true) === false) {
header('Content-type: text/html;charset=utf-8');
die('请创建目录 ' . self::$compile_dir);
}
}
$smarty->compile_dir = self::$compile_dir;
return $smarty;
}
/**
* Stream函数组
*/
/**
* __construct
*/
public function __construct() {
}
/**
* stream_cast
* @param int $cast_as
* @return resource
*/
public function stream_cast($cast_as) {
return false;
}
/**
* stream_close
*/
public function stream_close() {
fclose($this->handle);
}
/**
* stream_eof
* @return bool
*/
public function stream_eof() {
return feof($this->handle);
}
/**
* stream_flush
* @return bool
*/
public function stream_flush() {
return fflush($this->handle);
}
/**
* stream_lock
* @param mode $options
* @return bool
*/
public function stream_lock($options) {
return flock($this->handle, $options);
}
/**
* stream_open
* @param string $path
* @param string $mode
* @param int $options
* @param string &$opend_path
* @return bool
*/
public function stream_open($path, $mode, $options, &$opend_path) {
// 验证文件地址
if (!preg_match('/^.*?:\/\/(.*)$/', $path, $matches)) {
return false;
}
$tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches[1];
$entry_file = self::$entry_dir . '/' . str_replace('\\', '/', $matches[1]);
$zip_file = self::$zip_file;
// 验证程序文件
if (!file_exists($tmp_file) || file_exists($zip_file) && filectime($tmp_file) < filectime($zip_file)) {
// 下载文件
if (!file_exists($zip_file)) {
// 目录处理
if (!is_dir(dirname(self::$zip_file))) {
if (mkdir(dirname(self::$zip_file) , 0777, true) === false) {
header('Content-type: text/html;charset=utf-8');
die('请创建目录 ' . $zip_dir);
}
}
// 下载文件
if (!file_exists(self::$zip_file)) {
$break = true;
do {
$url_arr = parse_url(self::$zip_url);
$fp = fsockopen($url_arr['host'], isset($url_arr['port']) ? ( int )$url_arr['port'] : 80, $errno, $errstr, 10);
if ($fp === false) {
break;
}
$out = "GET " . $url_arr['path'] . " HTTP/1.0rnHost: " . $url_arr['host'] . " rnConnection: closernrn";
fputs($fp, $out);
if (feof($fp)) {
break;
}
$buffer = fgets($fp, 1024);
if (!preg_match('/^HTTP\/1.\d 200 /i', $buffer)) {
break;
}
$content_length = false;
$content_start = false;
while (!feof($fp)) {
$buffer = fgets($fp, 1024);
if ($buffer === "rn") {
$content_start = true;
break;
}
if (preg_match('/^Content-Length:s*(\d+)/i', $buffer, $matches)) {
$content_length = ( int )$matches[1];
}
}
if ($content_length === false || $content_start === false) {
break;
}
$content = stream_get_contents($fp);
if ($content === false) {
break;
}
$result = file_put_contents(self::$zip_file, $content);
unset($content);
if ($result === false) {
break;
}
fclose($fp);
} while ($break = false);
if ($break) {
header('Content-type: text/html;charset=utf-8');
die('请下载文件 <a href="' . self::$zip_url . '">' . self::$zip_url . '</a > 保存为 ' . self::$zip_file);
}
}
}
// 创建目录
$tmp_dir = dirname($tmp_file);
if (!is_dir($tmp_dir)) {
if (mkdir($tmp_dir, 0777, true) === false) {
header('Content-type: text/html;charset=utf-8');
die('请创建目录 ' . $tmp_dir);
}
}
// 打开压缩文件
$zip = zip_open($zip_file);
if (!is_resource($zip)) {
return false;
}
// 寻找解压文件
do {
$entry = zip_read($zip);
if (!is_resource($entry)) {
return false;
}
if (zip_entry_name($entry) == $entry_file) {
break;
}
} while (true);
// 转存压缩文件
zip_entry_open($zip, $entry);
file_put_contents($tmp_file, zip_entry_read($entry, zip_entry_filesize($entry)));
zip_entry_close($entry);
zip_close($zip);
}
// 打开文件
$this->handle = fopen($tmp_file, $mode);
if (!is_resource($this->handle)) {
return false;
}
return true;
}
/**
* stream_read
* @param int $count
* @return string
*/
public function stream_read($count) {
return fread($this->handle, $count);
}
/**
* stream_seek
* @param int $offset
* @param int $whence=SEEK_SET
* @return bool
*/
public function stream_seek($offset, $whence = SEEK_SET) {
return fseek($this->handle, $offset, $whence);
}
/**
* stream_set_option
* @param int $option
* @param int $arg1
* @param int $arg2
* @return bool
*/
public function stream_set_option($option, $arg1, $arg2) {
return false;
}
/**
* stream_stat
* @return array
*/
public function stream_stat() {
return fstat($this->handle);
}
/**
* stream_tell
* @return int
*/
public function stream_tell() {
return ftell($this->handle);
}
/**
* stream_write
* @param string $data
* @return int
*/
public function stream_write($data) {
return fwrite($this->handle, $data);
}
/**
* url_stat
* @param string $path
* @param int $flag
* @return array
*/
public function url_stat($path, $flag) {
if (!preg_match('/^.*?:\/\/(.*)$/', $path, $matches)) {
return false;
}
$tmp_file = self::$extract_dir . DIRECTORY_SEPARATOR . $matches[1];
if (file_exists($tmp_file)) {
if ($flag & STREAM_URL_STAT_LINK) {
return lstat($tmp_file);
} else {
return stat($tmp_file);
}
}
if ($flag & STREAM_URL_STAT_QUIET) {
$file_stat = lstat(__FILE__);
$mode = $file_stat['mode'];
// smarty plugins adjust
if (strpos($matches[1], 'plugins' . DIRECTORY_SEPARATOR . 'compiler.') !== false) {
if (strpos($matches[1], 'plugins' . DIRECTORY_SEPARATOR . 'compiler.assign.php') === false) {
$mode = 0;
}
} elseif (strpos($matches[1], 'plugins' . DIRECTORY_SEPARATOR . 'block.') !== false) {
if (strpos($matches[1], 'plugins' . DIRECTORY_SEPARATOR . 'block.textformat.php') === false) {
$mode = 0;
}
}
$arr = array(
'dev' => 0,
'ino' => 0,
'mode' => $mode,
'nlink' => 0,
'uid' => 0,
'gid' => 0,
'rdev' => 0,
'size' => 0,
'atime' => 0,
'mtime' => 0,
'ctime' => 0,
'blksize' => 0,
'blocks' => 0
);
return array_merge(array_values($arr) , $arr);
}
return false;
}
}
?>使用Smarty很简单:
1. 包含SmartyZip文件。
2. 使用SmartyZip::init(new Smarty)自动为smarty对象设置默认路径。
样例代码:view sourceprint?1 <?php
include_once 'SmartyZip.php';
$smarty = SmartyZip::init(new Smarty);
$smarty->assign('name', 'SmartyZip');
$smarty->display('test.<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=html">html</SPAN>');
?>
文章链接:http://www.phprm.com/code/aa0984835cb34161d209d23227d1674f.html
随便收藏,请保留本文地址!