qc.ifish7.com/Application/Admin/Model/TemplateModel.class.php

184 lines
7.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Admin\Model;
use Think\Model;
class TemplateModel extends Model{
//自动验证
//array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间])
protected $_validate = array(
array('name','require','请填写模板名称!',1),
array('type','require','缺少模板类型!',1),
array('myvar','checkmyvar','请填写变量名!',1,"callback"),
array('myvar','','变量名已经存在!',1,'unique'), // 在新增的时候验证name字段是否唯一
array('content','require','请填写模板代码!',1),
);
//当添加模板变量的时候必须填写myvar
public function checkmyvar(){
$type=I("type");
$myvar=I("myvar");
if($type=="public"&&!$myvar){
return false;
}else{
return true;
}
}
/*
* 模板替换
*/
public function replaceTemplate($content){
//转码
$content=htmlspecialchars_decode($content);
//公共模板替换
$content= preg_replace("/\[!--public.(.+?)--\]/","<include file='".C("CMS_TEMP_PATH")."\\1.html'/>",$content);
//变量替换
$content= preg_replace("/\[!--(.+?)--\]/","{\$\\1}",$content);
//万能标签替换
$content= $this->cmsinfo_replace($content);
return $content;
}
/*
万能标签替换
* */
public function cmsinfo_replace($content){
preg_match_all("/<cmsinfo(.+?)\"\s*>/",$content,$myvar);
if(count($myvar)){
foreach($myvar[0] as $v){
$cmsinfo=$v;
//
$str="<?php \r\n";//要替换后的str
preg_match_all('/\[(\w+)\]\s*=\s*"(.*?)"/',$cmsinfo,$m1);//匹配[字段] 带有中括号的字段名表示该字段是动态判断的,即存在就增加该条件,不存在删除该条件
preg_match_all('/(\w+)\s*=\s*"(.*?)"/',$cmsinfo,$m2);//匹配正常字段
$parameter1= array_combine($m1[1],$m1[2]);
$parameter2= array_combine($m2[1],$m2[2]);
$parameter=array_merge((array)$parameter1,(array)$parameter2);//这里要强制置换一下array否则当其中一个为null的时候返回为空出处https://blog.csdn.net/htmlgood/article/details/49557075
$parameter= array_filter($parameter);//过滤空数组
//sql方式
if($parameter["sql"]){
$str.='
$Model = new \Think\Model;
$result=$Model->query("'.$parameter["sql"].'");
';
}
//指定表方式
else if($parameter["table"]||$parameter["catid"]){
if(!$parameter["table"]){
//如果没有指定table则从catid里查询表名
$catid_arr=explode(",",$parameter["catid"]);
$cat=M("cat")->where(array("catid"=>$catid_arr[0]))->find();
$modelid=$cat["modelid"];
$table_name=$cat["table_name"];
$parameter["table"]="cms_".$table_name;
}
if($parameter["catid"]){
//如果是int形返回当前栏目和子栏目catid
if(is_numeric($parameter["catid"])){
$son=getSonCat($parameter["catid"]);
if(count($son)>1){
$parameter["catid"]=array("IN",$son);
}else{
$parameter["catid"]=$son[0];
}
}
//字符串形式的话返回array("IN","1,2,3")
else{
$catid_num=explode(",",$parameter["catid"]);
$parameter["catid"]=array("IN",$parameter["catid"]);
}
}
//
$where=$parameter;
unset($where["sql"]);
unset($where["table"]);
unset($where["limit"]);
unset($where["order"]);
unset($where["field"]);
unset($where["group"]);
unset($where["having"]);
unset($where["join"]);
unset($where["union"]);
unset($where["distinct"]);
$where = var_export($where,true);
$where= preg_replace("/'array\((.*)\)',/","array(\\1),", $where);//去掉数组外的单引号
$where= preg_replace("/=> '\\$(.+)',/U","=> $\\1,", $where);//如果数组里包含变更的话,去掉单引号
$where= stripslashes($where);//去掉转义字符
$str.='$mwhere='.$where.';';
preg_match_all('/ \[(\w+)\]=/',$cmsinfo,$autofield);
foreach($autofield[1] as $vv){
$str.='
if(!$mwhere[\''.$vv.'\']){
unset($mwhere[\''.$vv.'\']);
}
';
}
$str.='$result=M("'.$parameter["table"].'")';
//相关条件字段判断
if($where){
$str.='->where($mwhere)';
}
if($parameter["limit"]){
$str.='->limit('.$parameter["limit"].')';
}
if($parameter["order"]){
$str.='->order("'.$parameter["order"].'")';
}
if($parameter["field"]){
$str.='->field("'.$parameter["field"].'")';
}
if($parameter["group"]){
$str.='->group("'.$parameter["group"].'")';
}
if($parameter["having"]){
$str.='->having("'.$parameter["having"].'")';
}
if($parameter["join"]){
$str.='->join("'.$parameter["join"].'")';
}
if($parameter["union"]){
$str.='->union("'.$parameter["union"].'")';
}
if($parameter["distinct"]){
$str.='->distinct("'.$parameter["distinct"].'")';
}
$str.='->select();';
}
//PHP代码
$str.='
$no=1;
foreach($result as $key=>$v){
if($v[id]&&$v[catid]){
$v[titleurl]=titleurl($v);
}
if($v[catid]){
$cat=M("cat")->find($v[catid]);
$v[caturl]=caturl($cat[catid]);
}
?>';
//
$content=str_replace($cmsinfo,$str,$content);
}
}
$content=str_replace("</cmsinfo>",'<?php $no++; }?>',$content);
return $content;
}
//查询公共模板
public function getTempTemplate($myvar){
$template=$this->where(array("myvar"=>$myvar))->getField("content");
$template=htmlspecialchars_decode($template);
return $template;
}
//生成template文件
public function makeTemplateFile($template_id){
$template_r=$this->find($template_id);
$template_r["content"]=$this->replaceTemplate($template_r["content"]);
//如果模板类型是公共模板的话文件名以myvar的值命名
if($template_r["type"]=="public"){
file_put_contents(C("CMS_TEMP_PATH").$template_r["myvar"].".html",$template_r["content"]);
}else{
file_put_contents(C("CMS_TEMP_PATH").$template_id.".html",$template_r["content"]);
}
}
//删除模板文件
public function deleteTemplateFile($template_id){
unlink(C("CMS_TEMP_PATH").$template_id.".html");
}
}