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

396 lines
16 KiB
PHP
Raw 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
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
*/
namespace Admin\Model;
use Think\Model;
class ModelModel extends Model{
const modelTempPath = 'Data/modelTemp/'; //模型表单模板路径
const modelTempMemberPath = 'Data/modelTempMember/'; //会员模型表单模板路径
//自动验证
//array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间])
protected $_validate = array(
array('name','require','请填写模型名称!',1),
array('name', '', '该模型名称已经存在!', 0, 'unique', 1),
array('table_id','require','缺少table_id',1,0,self::MODEL_INSERT),
array('table_id','check_table','数据表不存在!',1,"callback",self::MODEL_INSERT),
);
//自动完成
protected $_auto = array (
array('table_name','get_table_name',self::MODEL_INSERT,'callback'), //表名
array('formtemp','get_formtemp',3,'callback'), //表单的form内容
);
//自动验证-table_id对应的信息是否存在
public function check_table($table_id){
if(M("table")->find($table_id)){
return true;
}else{
return false;
}
}
//自动完成-获取表名
public function get_table_name(){
$table_id=I("post.table_id",0,"int");
return M("table")->where(array("table_id"=>$table_id))->getField("table_name");
}
//自动完成-把数组转换为字符串便于存到数据里
public function arr2string($arr){
$str= implode(",", $arr);
if($str){
$str=",".$str.",";
}
return $str;
}
//自动完成-get_formtemp
//检查SQL文件是否存在
public function get_formtemp() {
$field_name=I("post.field_name");
$field=I("post.field");
$str="";
foreach($field as $key=>$v){
$str.=$field_name[$key]."<!--field-->".$field[$key]."\r\n";
}
return trim($str);
}
//保存模型 增加和修改都调用此方法
public function data_save(){
$data=$this->create();
$data["is_enter"]=$this->arr2string(I("post.is_enter"));
$data["is_contribute"]=$this->arr2string(I("post.is_contribute"));
$data["must_enter"]=$this->arr2string(I("post.must_enter"));
$data["is_list"]=$this->arr2string(I("post.is_list"));
$data["is_search"]=$this->arr2string(I("post.is_search"));
$data["is_sort"]=$this->arr2string(I("post.is_sort"));
//如果在新增模型的情况下设置栏目默认字段
if(!$data["modelid"]){
$data['cat_formtemp']="栏目名称<!--field-->name
缩略图<!--field-->thumb
每页显示<!--field-->lencord
是否为单面模式<!--field-->is_page
列表模板<!--field-->listtemp
内容模板<!--field-->viewtemp
状态<!--field-->status
SEO标题<!--field-->pagetitle
关键词<!--field-->keywords
描述<!--field-->description
";
$data['cat_is_enter']=",name,thumb,lencord,is_page,listtemp,viewtemp,status,pagetitle,keywords,description,";
$data['cat_must_enter']=",name,listtemp,viewtemp,status,";
}
if($data["modelid"]){
$this->save($data);
$modelid = $data["modelid"];
}else{
$modelid = $this->add($data);
$data["modelid"]=$modelid;
}
if ($modelid) {
$this->updateModelTemp($modelid);
$this->updateModelTempMember($modelid);
$this->updateCatModelTemp($modelid);//默认增加模型会勾选栏目模型字段
//更新缓存数据
$this->updateCache();
} else {
return false;
}
//
return $data;
}
//保存栏目模型
public function saveCatModel(){
$data["modelid"]=I("post.modelid");
$data["cat_is_enter"]=$this->arr2string(I("post.cat_is_enter"));
$data["cat_must_enter"]=$this->arr2string(I("post.cat_must_enter"));
//栏目模型字段
$field_name=I("post.field_name");
$field=I("post.field");
$str="";
foreach($field as $key=>$v){
$str.=$field_name[$key]."<!--field-->".$field[$key]."\r\n";
}
$data["cat_formtemp"]=$str;
$this->save($data);
//
$modelid = $data["modelid"];
if ($modelid) {
$this->updateCatModelTemp($modelid);
//更新缓存数据
$this->updateCache();
} else {
return false;
}
//
return $data;
}
//删除模型
public function data_delete($modelid) {
if (empty($modelid)){
$this->error = 'id不存在';
return false;
}
$data = $this->where(array("modelid" => $modelid))->find();
if (!$data) {
$this->error = '模型不存在!';
return false;
}
//检查该模型下是否有分类
$cat = M("cat")->where(array("modelid" => $modelid))->find();
if ($cat) {
$this->error = '该模型下有分类,请先删除分类!';
return false;
}
//删除模型数据
$this->where(array("modelid" => $modelid))->delete();
//更新缓存数据
$this->updateCache();
//删除模型表单文件
unlink(APP_PATH.self::modelTempPath.$modelid.".php");
unlink(APP_PATH.self::modelTempMemberPath.$modelid.".php");
return true;
}
/**
* 更新模型模板文件
* @param type $modelId 模型id
* @return boolean
*/
public function updateModelTemp($modelId){
$model=$this->find($modelId);
//将model里的is_enter is_contribute must_enter is_list is_search is_sort 依次拿出来和table_field对比如果不存在就删除防止因删除字段和修改字段名而造成model里的这些字段不更新导致的错误
$field=M("table_field")->field("field")->order("sort asc,field_id asc")->where(array("table_id"=>$model["table_id"]))->select();
$new["modelid"]=$modelId;
foreach($field as $v){
//录入项
if(strstr($model["is_enter"], ",".$v["field"].",")){
$new["is_enter"].=",".$v["field"];
}
//投稿
if(strstr($model["is_contribute"], ",".$v["field"].",")){
$new["is_contribute"].=",".$v["field"];
}
//必填项
if(strstr($model["must_enter"], ",".$v["field"].",")){
$new["must_enter"].=",".$v["field"];
}
//列表展示
if(strstr($model["is_list"], ",".$v["field"].",")){
$new["is_list"].=",".$v["field"];
}
//搜索项
if(strstr($model["is_search"], ",".$v["field"].",")){
$new["is_search"].=",".$v["field"];
}
//排序项
if(strstr($model["is_sort"], ",".$v["field"].",")){
$new["is_sort"].=",".$v["field"];
}
}
$new["is_enter"]=$new["is_enter"]?$new["is_enter"].",":"";
$new["is_contribute"]=$new["is_contribute"]?$new["is_contribute"].",":"";
$new["must_enter"]=$new["must_enter"]?$new["must_enter"].",":"";
$new["is_list"]=$new["is_list"]?$new["is_list"].",":"";
$new["is_search"]=$new["is_search"]?$new["is_search"].",":"";
$new["is_sort"]=$new["is_sort"]?$new["is_sort"].",":"";
$this->save($new);
//
$formtemp= explode("\r\n",$model["formtemp"]);
$modelTemp="";
foreach($formtemp as $key=>$v){
$f=explode("<!--field-->",$v);
if(!strstr($new["is_enter"], ",".$f[1].",")){
continue;;
}
$field=M("table_field")->where(array("table_id"=>$model["table_id"],"field"=>$f[1]))->find();
if($field){
$htmlcode=$field["htmlcode"];
$htmlcode= str_replace("{modelFieldTemp_name}", $f[0],$htmlcode);//名称替换
$modelTemp=$modelTemp."\r\n".$htmlcode;
}
}
//
$modelTemp=htmlspecialchars_decode($modelTemp);
file_put_contents(APP_PATH.self::modelTempPath.$modelId.".php",$modelTemp);
return true;
}
//
//获取批量导入excel模板用于用户在后台批量导入数据的
public function getExportExcelDemo($modelId,$cat_type){
$model=$this->find($modelId);
$formtemp= explode("\r\n",$model["formtemp"]);
foreach($formtemp as $key=>$v){
$f=explode("<!--field-->",$v);
if(!strstr($model["is_enter"], ",".$f[1].",")){
continue;;
}
$data[]=$f[0]."==".$f[1];
}
Vendor('PHPExcel.PHPExcel');
$objReader = \PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load(APP_PATH."Data/excelDemo/export_template.xls");
$sheet=$objPHPExcel->setActiveSheetIndex(0);
//设置第一列为栏目字段
if($cat_type=="catName"){
$sheet ->setCellValue("A1","栏目名称==catid");
$sheet->getColumnDimension("A")->setAutoSize(true);
}elseif($cat_type=="catId"){
$sheet ->setCellValue("A1","栏目ID==catid");
$sheet->getColumnDimension("A")->setAutoSize(true);
}else{
}
//
foreach($data as $key=>$v){
if($cat_type!="selfCheck"){
$key2=$key+1;
}else{
$key2=$key;
}
$no=IntToChr($key2);
$sheet ->setCellValue($no."1",$v);
$sheet->getColumnDimension($no)->setAutoSize(true);
}
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$model["name"].'-数据导入结构.xls"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
}
/**
* 更新模型模板文件(会员投稿表单)
* @param type $modelId 模型id
* @return boolean
*/
public function updateModelTempMember($modelId){
$model=$this->find($modelId);
//将model里的is_enter is_contribute must_enter is_list is_search is_sort 依次拿出来和table_field对比如果不存在就删除防止因删除字段和修改字段名而造成model里的这些字段不更新导致的错误
$field=M("table_field")->field("field")->order("sort asc,field_id asc")->where(array("table_id"=>$model["table_id"]))->select();
$new["modelid"]=$modelId;
foreach($field as $v){
//录入项
if(strstr($model["is_enter"], ",".$v["field"].",")){
$new["is_enter"].=",".$v["field"];
}
//投稿
if(strstr($model["is_contribute"], ",".$v["field"].",")){
$new["is_contribute"].=",".$v["field"];
}
//必填项
if(strstr($model["must_enter"], ",".$v["field"].",")){
$new["must_enter"].=",".$v["field"];
}
//列表展示
if(strstr($model["is_list"], ",".$v["field"].",")){
$new["is_list"].=",".$v["field"];
}
//搜索项
if(strstr($model["is_search"], ",".$v["field"].",")){
$new["is_search"].=",".$v["field"];
}
//排序项
if(strstr($model["is_sort"], ",".$v["field"].",")){
$new["is_sort"].=",".$v["field"];
}
}
$new["is_enter"]=$new["is_enter"]?$new["is_enter"].",":"";
$new["is_contribute"]=$new["is_contribute"]?$new["is_contribute"].",":"";
$new["must_enter"]=$new["must_enter"]?$new["must_enter"].",":"";
$new["is_list"]=$new["is_list"]?$new["is_list"].",":"";
$new["is_search"]=$new["is_search"]?$new["is_search"].",":"";
$new["is_sort"]=$new["is_sort"]?$new["is_sort"].",":"";
$this->save($new);
//
$formtemp= explode("\r\n",$model["formtemp"]);
$modelTemp="";
foreach($formtemp as $key=>$v){
$f=explode("<!--field-->",$v);
if(!strstr($new["is_contribute"], ",".$f[1].",")){
continue;;
}
$field=M("table_field")->where(array("table_id"=>$model["table_id"],"field"=>$f[1]))->find();
if($field){
$htmlcode=$field["memberhtmlcode"];
$htmlcode= str_replace("{modelFieldTemp_name}", $f[0],$htmlcode);//名称替换
$modelTemp=$modelTemp."\r\n".$htmlcode;
}
}
$modelTemp=htmlspecialchars_decode($modelTemp);
file_put_contents(APP_PATH.self::modelTempMemberPath.$modelId.".php",$modelTemp);
return true;
}
/**
* 更新模型模板文件
* @param type $modelId 模型id
* @return boolean
*/
public function updateCatModelTemp($modelId){
$model=$this->find($modelId);
//将model里的is_enter must_enter 依次拿出来和cat_field对比如果不存在就删除防止因删除字段和修改字段名而造成model里的这些字段不更新导致的错误
$field=M("cat_field")->field("field")->order("sort asc,field_id asc")->select();
$new["modelid"]=$modelId;
foreach($field as $v){
//录入项
if(strstr($model["cat_is_enter"], ",".$v["field"].",")){
$new["cat_is_enter"].=",".$v["field"];
}
//必填项
if(strstr($model["cat_must_enter"], ",".$v["field"].",")){
$new["cat_must_enter"].=",".$v["field"];
}
}
$new["cat_is_enter"]=$new["cat_is_enter"]?$new["cat_is_enter"].",":"";
$new["cat_must_enter"]=$new["cat_must_enter"]?$new["cat_must_enter"].",":"";
$this->save($new);
//
$formtemp= explode("\r\n",$model["cat_formtemp"]);
$modelTemp="";
foreach($formtemp as $key=>$v){
$f=explode("<!--field-->",$v);
if(!strstr($new["cat_is_enter"], ",".$f[1].",")){
continue;
}
$field=M("cat_field")->where(array("field"=>$f[1]))->find();
if($field){
$htmlcode=$field["htmlcode"];
$htmlcode= str_replace("{modelFieldTemp_name}", $f[0],$htmlcode);//名称替换
$modelTemp=$modelTemp."\r\n".$htmlcode;
}
}
$modelTemp=htmlspecialchars_decode($modelTemp);
file_put_contents(APP_PATH.self::modelTempPath.$modelId."_cat.php",$modelTemp);
return true;
}
//更新模型缓存
public function updateCache(){
$cat=$this->select();
$newcat=array();
foreach($cat as $v){
$newcat[$v["modelid"]]=$v;
}
$arr_str=var_export ($newcat,true);
$arr_str="<?php \r\n \$GLOBALS['model']=".$arr_str.";";
file_put_contents(C("IncCache_PATH")."model.php",$arr_str);
}
}