CodeIgniter使用phpcms模板引擎_php实例
CodeIgniter很适合小站点应用开发,但是它自带的view功能可能会给不懂PHP的前端人员带来麻烦。 相比之下phpcms的view模板解析就强大多了,所以这里就把PHPCMS的模板解析功能剥离出来,加到PHPCMS上。
首先在CodeIgniter libraries中 增加 template_cache.php
/**
* 模板解析缓存
*/
final class template_cache {
public $cache_path;
public function __construct()
{
//$CI =& get_instance();
$this->cache_path = APPPATH.'views';
}
/**
* 编译模板
*
* @param $module 模块名称
* @param $template 模板文件名
* @param $istag 是否为标签模板
* @return unknown
*/
public function template_compile($module, $template, $style = 'default') {
$tplfile= APPPATH.'views'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.'.php';
if (! file_exists ( $tplfile )) {
show_error($tplfile , 500 , 'Template does not exist(1)');
}
$content = @file_get_contents ( $tplfile );
$filepath = $this->cache_path.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR;
if(!is_dir($filepath)) {
mkdir($filepath, 0777, true);
}
$compiledtplfile = $filepath.$template.'.php';
$content = $this->template_parse($content);
$strlen = file_put_contents ( $compiledtplfile, $content );
chmod ( $compiledtplfile, 0777 );
return $strlen;
}
/**
* 更新模板缓存
*
* @param $tplfile 模板原文件路径
* @param $compiledtplfile 编译完成后,写入文件名
* @return $strlen 长度
*/
public function template_refresh($tplfile, $compiledtplfile) {
$str = @file_get_contents ($tplfile);
$str = $this->template_parse ($str);
$strlen = file_put_contents ($compiledtplfile, $str );
chmod ($compiledtplfile, 0777);
return $strlen;
}
/**
* 解析模板
*
* @param $str 模板内容
* @return ture
*/
public function template_parse($str) {
$str = preg_replace ( "/\{template\s+(.+)\}/", "", $str );
$str = preg_replace ( "/\{include\s+(.+)\}/", "", $str );
$str = preg_replace ( "/\{view\s+(.+)\}/", "load->view(\\1); ?>", $str );
$str = preg_replace ( "/\{php\s+(.+)\}/", "", $str );
//alex fix
$str = preg_replace ( "/\{{if\s+(.+?)\}}/", "``if \\1``", $str );
$str = preg_replace ( "/\{{else\}}/", "``else``", $str );
$str = preg_replace ( "/\{{\/if\}}/", "``/if``", $str );
$str = preg_replace ( "/\{if\s+(.+?)\}/", "", $str );
$str = preg_replace ( "/\{else\}/", "", $str );
$str = preg_replace ( "/\{elseif\s+(.+?)\}/", "", $str );
$str = preg_replace ( "/\{\/if\}/", "", $str );
//for 循环
$str = preg_replace("/\{for\s+(.+?)\}/","",$str);
$str = preg_replace("/\{\/for\}/","",$str);
//++ --
$str = preg_replace("/\{\+\+(.+?)\}/","",$str);
$str = preg_replace("/\{\-\-(.+?)\}/","",$str);
$str = preg_replace("/\{(.+?)\+\+\}/","",$str);
$str = preg_replace("/\{(.+?)\-\-\}/","",$str);
//alex fix
$str = preg_replace ( "/\``if\s+(.+?)\``/", "{{if \\1}}", $str );
$str = preg_replace ( "/\``else``/", "{{else}}", $str );
$str = preg_replace ( "/\``\/if\``/", "{{/if}}", $str );
$str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/", "", $str );
$str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", " \\3) { ?>", $str );
$str = preg_replace ( "/\{\/loop\}/", "", $str );
$str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "", $str );
$str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "", $str );
$str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "", $str );
$str = preg_replace("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "\$this->addquote('')",$str);
$str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "", $str );
$str = preg_replace("/\{pc:(\w+)\s+([^}]+)\}/ie", "self::pc_tag('$1','$2', '$0')", $str);
$str = preg_replace("/\{\/pc\}/ie", "self::end_pc_tag()", $str);
$str = "" . $str;
return $str;
}
/**
* 转义 // 为 /
*
* @param $var 转义的字符
* @return 转义后的字符
*/
public function addquote($var) {
return str_replace ( "\\\"", "\"", preg_replace ( "/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var ) );
}
/**
* 解析PC标签
* @param string $op 操作方式
* @param string $data 参数
* @param string $html 匹配到的所有的HTML代码
*/
public static function pc_tag($op, $data, $html) {
preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i", stripslashes($data), $matches, PREG_SET_ORDER);
$arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start','setpages');
$tools = array('json', 'xml', 'block', 'get');
$datas = array();
$tag_id = md5(stripslashes($html));
//可视化条件
$str_datas = 'op='.$op.'&tag_md5='.$tag_id;
foreach ($matches as $v) {
$str_datas .= $str_datas ? "&$v[1]=".($op == 'block' && strpos($v[2], '$') === 0 ? $v[2] : urlencode($v[2])) : "$v[1]=".(strpos($v[2], '$') === 0 ? $v[2] : urlencode($v[2]));
if(in_array($v[1], $arr)) {
$$v[1] = $v[2];
continue;
}
$datas[$v[1]] = $v[2];
}
$str = '';
$setpages = isset($setpages) && intval($setpages) ? intval($setpages) : 10;
$num = isset($num) && intval($num) ? intval($num) : 20;
$cache = isset($cache) && intval($cache) ? intval($cache) : 0;
$return = isset($return) && trim($return) ? trim($return) : 'data';
if (!isset($urlrule)) $urlrule = '';
if (!empty($cache) && !isset($page)) {
$str .= '$tag_cache_name = md5(implode(\'&\','.self::arr_to_html($datas).').\''.$tag_id.'\');if(!$'.$return.' = tpl_cache($tag_cache_name,'.$cache.')){';
}
if (in_array($op,$tools)) {
switch ($op) {
case 'json':
if (isset($datas['url']) && !empty($datas['url'])) {
$str .= '$json = @file_get_contents(\''.$datas['url'].'\');';
$str .= '$'.$return.' = json_decode($json, true);';
}
break;
case 'block':
$str .= '$block_tag = pc_base::load_app_class(\'block_tag\', \'block\');';
$str .= 'echo $block_tag->pc_tag('.self::arr_to_html($datas).');';
break;
}
} else {
if (!isset($action) || empty($action)) return false;
if ( file_exists(APPPATH.'libraries'.DIRECTORY_SEPARATOR.$op.'_tag.php')) {
$str .= 'if(!isset($CI))$CI =& get_instance();$CI->load->library("'.$op.'_tag");if (method_exists($CI->'.$op.'_tag, \''.$action.'\')) {';
if (isset($start) && intval($start)) {
$datas['limit'] = intval($start).','.$num;
} else {
$datas['limit'] = $num;
}
if (isset($page)) {
$str .= '$pagesize = '.$num.';';
$str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page $str .= '$offset = ($page - 1) * $pagesize;$urlrule="'.$urlrule.'";';
$datas['limit'] = '$offset.",".$pagesize';
$datas['action'] = $action;
$str .= '$'.$op.'_total = $CI->'.$op.'_tag->count('.self::arr_to_html($datas).');';
$str .= 'if($'.$op.'_total>$pagesize){ $pages = pages($'.$op.'_total, $page, $pagesize, $urlrule); } else { $pages="" ;}';
}
$str .= '$'.$return.' = $CI->'.$op.'_tag->'.$action.'('.self::arr_to_html($datas).');';
$str .= '}';
}
}
if (!empty($cache) && !isset($page)) {
$str .= 'if(!empty($'.$return.')){setcache($tag_cache_name, $'.$return.', \'tpl_data\');}';
$str .= '}';
}
return "";
}
/**
* PC标签结束
*/
static private function end_pc_tag() {
return '\';}?>';
}
/**
* 转换数据为HTML代码
* @param array $data 数组
*/
private static function arr_to_html($data) {
if (is_array($data)) {
$str = 'array(';
foreach ($data as $key=>$val) {
if (is_array($val)) {
$str .= "'$key'=>".self::arr_to_html($val).",";
} else {
if (strpos($val, '$')===0) {
$str .= "'$key'=>$val,";
} else {
$str .= "'$key'=>'".self::new_addslashes($val)."',";
}
}
}
return $str.')';
}
return false;
}
/**
* 返回经addslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_addslashes($string){
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
}
然后在global_helper中增加一个 template函数
if ( ! function_exists('template'))
{
/**
* 模板调用
*
* @param $module
* @param $template
* @param $istag
* @return unknown_type
*/
function template($module = 'expatree', $template = 'index', $style = 'expatree',$return_full_path=true) {
global $CI;
if(!isset($CI))$CI =& get_instance();
if(!$style) $style = 'default';
$CI->load->library('template_cache','template_cache');
$template_cache = $CI->template_cache;
//编译模板生成地址
$compiledtplfile = $template_cache->cache_path.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.EXT;
//视图文件
$tplfile= APPPATH.'views'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.EXT;
if(file_exists($tplfile)) {
if(!file_exists($compiledtplfile) || (@filemtime($tplfile) > @filemtime($compiledtplfile))) {
$template_cache->template_compile($module, $template, $style);
}
} else {
//如果没有就调取默认风格模板
$compiledtplfile = $template_cache->cache_path.DIRECTORY_SEPARATOR.'caches_template'.DIRECTORY_SEPARATOR.'default'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template.EXT;
if(!file_exists($compiledtplfile) || (file_exists($tplfile) && filemtime($tplfile) > filemtime($compiledtplfile))) {
$template_cache->template_compile($module, $template, 'default');
} elseif (!file_exists($tplfile)) {
show_error($tplfile , 500 , 'Template does not exist(0)');
}
}
if($return_full_path)
return $compiledtplfile;
else
return 'caches_template'.DIRECTORY_SEPARATOR.$style.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$template;
}
}
然后在MY_Controller.php,增加一个方法
/**
* 自动模板调用
*
* @param $module
* @param $template
* @param $istag
* @return unknown_type
*/
protected function view($view_file,$page_data=false,$cache=false)
{
$view_file=$this->template($this->page_data['controller_name'].$this->page_data['module_name'],$view_file);
$this->load->view($view_file,$page_data);
}
这样基本上完成了,可以直接phpcms模板语法了。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara melaksanakan middleware tersuai dalam CodeIgniter Pengenalan: Dalam pembangunan web moden, middleware memainkan peranan penting dalam aplikasi. Ia boleh digunakan untuk melaksanakan beberapa logik pemprosesan yang dikongsi sebelum atau selepas permintaan sampai kepada pengawal. CodeIgniter, sebagai rangka kerja PHP yang popular, juga menyokong penggunaan middleware. Artikel ini akan memperkenalkan cara untuk melaksanakan perisian tengah tersuai dalam CodeIgniter dan memberikan contoh kod mudah. Gambaran keseluruhan Middleware: Middleware ialah sejenis permintaan

CodeIgniter Middleware: Mempercepatkan Responsif Aplikasi dan Gambaran Keseluruhan Pemberian Halaman: Memandangkan aplikasi web terus berkembang dalam kerumitan dan interaktiviti, pembangun perlu menggunakan penyelesaian yang lebih cekap dan berskala untuk meningkatkan prestasi dan responsif aplikasi. CodeIgniter (CI) ialah rangka kerja berasaskan PHP ringan yang menyediakan banyak ciri berguna, salah satunya ialah perisian tengah. Middleware ialah satu siri tugasan yang dilakukan sebelum atau selepas permintaan sampai kepada pengawal. Artikel ini akan memperkenalkan cara menggunakan

Pengenalan kepada kaedah menggunakan pembina pertanyaan pangkalan data (QueryBuilder) dalam rangka kerja CodeIgniter: CodeIgniter ialah rangka kerja PHP ringan yang menyediakan banyak alat dan perpustakaan yang berkuasa untuk memudahkan pembangun dalam pembangunan aplikasi web. Salah satu ciri yang paling mengagumkan ialah pembina pertanyaan pangkalan data (QueryBuilder), yang menyediakan cara ringkas dan berkuasa untuk membina dan melaksanakan pernyataan pertanyaan pangkalan data. Artikel ini akan memperkenalkan cara menggunakan Co

Memandangkan aplikasi web terus berkembang, adalah penting untuk membangunkan aplikasi dengan lebih cepat dan cekap. Dan, memandangkan API RESTful digunakan secara meluas dalam aplikasi web, pembangun perlu memahami cara mencipta dan melaksanakan API RESTful. Dalam artikel ini, kita akan membincangkan cara untuk melaksanakan corak MVC dan API RESTful menggunakan rangka kerja CodeIgniter. Pengenalan kepada corak MVC MVC (Model-Vie

PHP CMS ialah sistem pengurusan kandungan sumber terbuka berasaskan PHP untuk mengurus kandungan tapak web Ciri-cirinya termasuk kemudahan penggunaan, kefungsian berkuasa, berskala, keselamatan tinggi dan sumber terbuka percuma. Ia boleh menjimatkan masa, meningkatkan kualiti laman web, meningkatkan kerjasama dan mengurangkan kos pembangunan, dan digunakan secara meluas dalam pelbagai laman web seperti laman web berita, blog, laman web korporat, laman web e-dagang dan forum komuniti.

Perisian tengah CodeIgniter: Menyediakan fungsi muat naik dan muat turun fail yang selamat Pengenalan: Dalam proses pembangunan aplikasi web, muat naik dan muat turun fail adalah fungsi yang sangat biasa. Walau bagaimanapun, atas sebab keselamatan, pengendalian muat naik dan muat turun fail selalunya memerlukan langkah keselamatan tambahan. CodeIgniter ialah rangka kerja PHP popular yang menyediakan pelbagai alatan dan perpustakaan untuk menyokong pembangun dalam membina aplikasi web yang selamat dan boleh dipercayai. Artikel ini akan memperkenalkan cara menggunakan perisian tengah CodeIgniter untuk melaksanakan fail selamat

Dengan perkembangan Internet mudah alih, pemesejan segera telah menjadi lebih penting dan popular. Bagi kebanyakan syarikat, sembang langsung lebih seperti perkhidmatan komunikasi, menyediakan kaedah komunikasi yang mudah yang boleh menyelesaikan masalah perniagaan dengan cepat dan berkesan. Berdasarkan ini, artikel ini akan memperkenalkan cara menggunakan rangka kerja PHP CodeIgniter untuk membangunkan aplikasi sembang masa nyata. Fahami rangka kerja CodeIgniter CodeIgniter ialah rangka kerja PHP ringan yang menyediakan satu siri alat dan perpustakaan mudah untuk membantu pembangun dengan cepat

Dalam era Internet hari ini, tapak web yang disukai oleh pengguna mesti mempunyai antara muka bahagian hadapan yang ringkas dan jelas serta sistem pengurusan bahagian belakang yang berkuasa, dan rangka kerja PHP CodeIgniter ialah rangka kerja yang sangat baik yang membolehkan pembangun membina bahagian belakang dengan cepat. sistem pengurusan. CodeIgniter mempunyai ciri-ciri ringan, kecekapan tinggi, dan pengembangan yang mudah Artikel ini akan ditujukan kepada pemula dan menerangkan secara terperinci cara membina sistem pengurusan bahagian belakang dengan cepat melalui rangka kerja ini. 1. Pemasangan dan konfigurasi Pemasangan PHPCodeIgniter adalah berasaskan PHP
