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
随便收藏,请保留本文地址!