sitemodel.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. //模型原型存储路径
  4. define('MODEL_PATH',PC_PATH.'modules'.DIRECTORY_SEPARATOR.'content'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR);
  5. //模型缓存路径
  6. define('CACHE_MODEL_PATH',CACHE_PATH.'caches_model'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR);
  7. pc_base::load_app_class('admin','admin',0);
  8. class sitemodel extends admin {
  9. private $db;
  10. public $siteid;
  11. function __construct() {
  12. parent::__construct();
  13. $this->db = pc_base::load_model('sitemodel_model');
  14. $this->siteid = $this->get_siteid();
  15. if(!$this->siteid) $this->siteid = 1;
  16. }
  17. public function init() {
  18. $categorys = getcache('category_content_'.$this->siteid,'commons');
  19. $datas = $this->db->listinfo(array('siteid'=>$this->siteid,'type'=>0),'',$_GET['page'],30);
  20. //模型文章数array('模型id'=>数量);
  21. $items = array();
  22. foreach ($datas as $k=>$r) {
  23. foreach ($categorys as $catid=>$cat) {
  24. if(intval($cat['modelid']) == intval($r['modelid'])) {
  25. $items[$r['modelid']] += intval($cat['items']);
  26. } else {
  27. $items[$r['modelid']] += 0;
  28. }
  29. }
  30. $datas[$k]['items'] = $items[$r['modelid']];
  31. }
  32. $pages = $this->db->pages;
  33. $this->public_cache();
  34. $big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=content&c=sitemodel&a=add\', title:\''.L('add_model').'\', width:\'580\', height:\'420\', lock:true}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('add_model'));
  35. include $this->admin_tpl('sitemodel_manage');
  36. }
  37. public function add() {
  38. if(isset($_POST['dosubmit'])) {
  39. $_POST['info']['siteid'] = $this->siteid;
  40. $_POST['info']['category_template'] = $_POST['setting']['category_template'];
  41. $_POST['info']['list_template'] = $_POST['setting']['list_template'];
  42. $_POST['info']['show_template'] = $_POST['setting']['show_template'];
  43. if (isset($_POST['other']) && $_POST['other']) {
  44. $_POST['info']['admin_list_template'] = $_POST['setting']['admin_list_template'];
  45. $_POST['info']['member_add_template'] = $_POST['setting']['member_add_template'];
  46. $_POST['info']['member_list_template'] = $_POST['setting']['member_list_template'];
  47. } else {
  48. unset($_POST['setting']['admin_list_template'], $_POST['setting']['member_add_template'], $_POST['setting']['member_list_template']);
  49. }
  50. $modelid = $this->db->insert($_POST['info'],1);
  51. $model_sql = file_get_contents(MODEL_PATH.'model.sql');
  52. $tablepre = $this->db->db_tablepre;
  53. $tablename = $_POST['info']['tablename'];
  54. $model_sql = str_replace('$basic_table', $tablepre.$tablename, $model_sql);
  55. $model_sql = str_replace('$table_data',$tablepre.$tablename.'_data', $model_sql);
  56. $model_sql = str_replace('$table_model_field',$tablepre.'model_field', $model_sql);
  57. $model_sql = str_replace('$modelid',$modelid,$model_sql);
  58. $model_sql = str_replace('$siteid',$this->siteid,$model_sql);
  59. $this->db->sql_execute($model_sql);
  60. $this->cache_field($modelid);
  61. //调用全站搜索类别接口
  62. $this->type_db = pc_base::load_model('type_model');
  63. $this->type_db->insert(array('name'=>$_POST['info']['name'],'module'=>'search','modelid'=>$modelid,'siteid'=>$this->siteid));
  64. $cache_api = pc_base::load_app_class('cache_api','admin');
  65. $cache_api->cache('type');
  66. $cache_api->search_type();
  67. showmessage(L('add_success'), '', '', 'add');
  68. } else {
  69. pc_base::load_sys_class('form','',0);
  70. $show_header = $show_validator = '';
  71. $style_list = template_list($this->siteid, 0);
  72. foreach ($style_list as $k=>$v) {
  73. $style_list[$v['dirname']] = $v['name'] ? $v['name'] : $v['dirname'];
  74. unset($style_list[$k]);
  75. }
  76. $admin_list_template = $this->admin_list_template('content_list', 'name="setting[admin_list_template]"');
  77. include $this->admin_tpl('sitemodel_add');
  78. }
  79. }
  80. public function edit() {
  81. if(isset($_POST['dosubmit'])) {
  82. $modelid = intval($_POST['modelid']);
  83. $_POST['info']['category_template'] = $_POST['setting']['category_template'];
  84. $_POST['info']['list_template'] = $_POST['setting']['list_template'];
  85. $_POST['info']['show_template'] = $_POST['setting']['show_template'];
  86. if (isset($_POST['other']) && $_POST['other']) {
  87. $_POST['info']['admin_list_template'] = $_POST['setting']['admin_list_template'];
  88. $_POST['info']['member_add_template'] = $_POST['setting']['member_add_template'];
  89. $_POST['info']['member_list_template'] = $_POST['setting']['member_list_template'];
  90. } else {
  91. unset($_POST['setting']['admin_list_template'], $_POST['setting']['member_add_template'], $_POST['setting']['member_list_template']);
  92. }
  93. $this->db->update($_POST['info'],array('modelid'=>$modelid,'siteid'=>$this->siteid));
  94. showmessage(L('update_success'), '', '', 'edit');
  95. } else {
  96. pc_base::load_sys_class('form','',0);
  97. $show_header = $show_validator = '';
  98. $style_list = template_list($this->siteid, 0);
  99. foreach ($style_list as $k=>$v) {
  100. $style_list[$v['dirname']] = $v['name'] ? $v['name'] : $v['dirname'];
  101. unset($style_list[$k]);
  102. }
  103. $modelid = intval($_GET['modelid']);
  104. $r = $this->db->get_one(array('modelid'=>$modelid));
  105. extract($r);
  106. $admin_list_template_f = $this->admin_list_template($admin_list_template, 'name="setting[admin_list_template]"');
  107. include $this->admin_tpl('sitemodel_edit');
  108. }
  109. }
  110. public function delete() {
  111. $this->sitemodel_field_db = pc_base::load_model('sitemodel_field_model');
  112. $modelid = intval($_GET['modelid']);
  113. $model_cache = getcache('model','commons');
  114. $model_table = $model_cache[$modelid]['tablename'];
  115. $this->sitemodel_field_db->delete(array('modelid'=>$modelid,'siteid'=>$this->siteid));
  116. $this->db->drop_table($model_table);
  117. $this->db->drop_table($model_table.'_data');
  118. $this->db->delete(array('modelid'=>$modelid,'siteid'=>$this->siteid));
  119. //删除全站搜索接口数据
  120. $this->type_db = pc_base::load_model('type_model');
  121. $this->type_db->delete(array('module'=>'search','modelid'=>$modelid,'siteid'=>$this->siteid));
  122. $cache_api = pc_base::load_app_class('cache_api','admin');
  123. $cache_api->cache('type');
  124. $cache_api->search_type();
  125. exit('1');
  126. }
  127. public function disabled() {
  128. $modelid = intval($_GET['modelid']);
  129. $r = $this->db->get_one(array('modelid'=>$modelid,'siteid'=>$this->siteid));
  130. $status = $r['disabled'] == '1' ? '0' : '1';
  131. $this->db->update(array('disabled'=>$status),array('modelid'=>$modelid,'siteid'=>$this->siteid));
  132. showmessage(L('update_success'), HTTP_REFERER);
  133. }
  134. /**
  135. * 更新模型缓存
  136. */
  137. public function public_cache() {
  138. require MODEL_PATH.'fields.inc.php';
  139. //更新内容模型类:表单生成、入库、更新、输出
  140. $classtypes = array('form','input','update','output');
  141. foreach($classtypes as $classtype) {
  142. $cache_data = file_get_contents(MODEL_PATH.'content_'.$classtype.'.class.php');
  143. $cache_data = str_replace('}?>','',$cache_data);
  144. foreach($fields as $field=>$fieldvalue) {
  145. if(file_exists(MODEL_PATH.$field.DIRECTORY_SEPARATOR.$classtype.'.inc.php')) {
  146. $cache_data .= file_get_contents(MODEL_PATH.$field.DIRECTORY_SEPARATOR.$classtype.'.inc.php');
  147. }
  148. }
  149. $cache_data .= "\r\n } \r\n?>";
  150. file_put_contents(CACHE_MODEL_PATH.'content_'.$classtype.'.class.php',$cache_data);
  151. @chmod(CACHE_MODEL_PATH.'content_'.$classtype.'.class.php',0777);
  152. }
  153. //更新模型数据缓存
  154. $model_array = array();
  155. $datas = $this->db->select(array('type'=>0));
  156. foreach ($datas as $r) {
  157. if(!$r['disabled']) $model_array[$r['modelid']] = $r;
  158. }
  159. setcache('model', $model_array, 'commons');
  160. return true;
  161. }
  162. /**
  163. * 导出模型
  164. */
  165. function export() {
  166. $modelid = isset($_GET['modelid']) ? $_GET['modelid'] : showmessage(L('illegal_parameters'), HTTP_REFERER);
  167. $modelarr = getcache('model', 'commons');
  168. //定义系统字段排除
  169. //$system_field = array('id','title','style','catid','url','listorder','status','userid','username','inputtime','updatetime','pages','readpoint','template','groupids_view','posids','content','keywords','description','thumb','typeid','relation','islink','allow_comment');
  170. $this->sitemodel_field_db = pc_base::load_model('sitemodel_field_model');
  171. $modelinfo = $this->sitemodel_field_db->select(array('modelid'=>$modelid));
  172. foreach($modelinfo as $k=>$v) {
  173. //if(in_array($v['field'],$system_field)) continue;
  174. $modelinfoarr[$k] = $v;
  175. $modelinfoarr[$k]['setting'] = string2array($v['setting']);
  176. }
  177. $res = var_export($modelinfoarr, TRUE);
  178. header('Content-Disposition: attachment; filename="'.$modelarr[$modelid]['tablename'].'.model"');
  179. echo $res;exit;
  180. }
  181. /**
  182. * 导入模型
  183. */
  184. function import(){
  185. if(isset($_POST['dosubmit'])) {
  186. $info = array();
  187. $info['name'] = $_POST['info']['modelname'];
  188. //主表表名
  189. $basic_table = $info['tablename'] = $_POST['info']['tablename'];
  190. //从表表名
  191. $table_data = $basic_table.'_data';
  192. $info['description'] = $_POST['info']['description'];
  193. $info['type'] = 0;
  194. $info['siteid'] = $this->siteid;
  195. $info['default_style'] = $_POST['default_style'];
  196. $info['category_template'] = $_POST['setting']['category_template'];
  197. $info['list_template'] = $_POST['setting']['list_template'];
  198. $info['show_template'] = $_POST['setting']['show_template'];
  199. if(!empty($_FILES['model_import']['tmp_name'])) {
  200. $model_import = @file_get_contents($_FILES['model_import']['tmp_name']);
  201. if(!empty($model_import)) {
  202. $model_import_data = string2array($model_import);
  203. }
  204. }
  205. $is_exists = $this->db->table_exists($basic_table);
  206. if($is_exists) showmessage(L('operation_failure'),'?m=content&c=sitemodel&a=init');
  207. $modelid = $this->db->insert($info, 1);
  208. if($modelid){
  209. $tablepre = $this->db->db_tablepre;
  210. //建立数据表
  211. $model_sql = file_get_contents(MODEL_PATH.'model.sql');
  212. $model_sql = str_replace('$basic_table', $tablepre.$basic_table, $model_sql);
  213. $model_sql = str_replace('$table_data',$tablepre.$table_data, $model_sql);
  214. $model_sql = str_replace('$table_model_field',$tablepre.'model_field', $model_sql);
  215. $model_sql = str_replace('$modelid',$modelid,$model_sql);
  216. $model_sql = str_replace('$siteid',$this->siteid,$model_sql);
  217. $this->db->sql_execute($model_sql);
  218. if(!empty($model_import_data)) {
  219. $this->sitemodel_field_db = pc_base::load_model('sitemodel_field_model');
  220. $system_field = array('title','style','catid','url','listorder','status','userid','username','inputtime','updatetime','pages','readpoint','template','groupids_view','posids','content','keywords','description','thumb','typeid','relation','islink','allow_comment');
  221. foreach($model_import_data as $v) {
  222. $field = $v['field'];
  223. if(in_array($field,$system_field)) {
  224. $v['siteid'] = $this->siteid;
  225. unset($v['fieldid'],$v['modelid'],$v['field']);
  226. $v = new_addslashes($v);
  227. $v['setting'] = array2string($v['setting']);
  228. $this->sitemodel_field_db->update($v,array('modelid'=>$modelid,'field'=>$field));
  229. } else {
  230. $tablename = $v['issystem'] ? $tablepre.$basic_table : $tablepre.$table_data;
  231. //重组模型表字段属性
  232. $minlength = $v['minlength'] ? $v['minlength'] : 0;
  233. $maxlength = $v['maxlength'] ? $v['maxlength'] : 0;
  234. $field_type = $v['formtype'];
  235. require MODEL_PATH.$field_type.DIRECTORY_SEPARATOR.'config.inc.php';
  236. if(isset($v['setting']['fieldtype'])) {
  237. $field_type = $v['setting']['fieldtype'];
  238. }
  239. require MODEL_PATH.'add.sql.php';
  240. $v['tips'] = addslashes($v['tips']);
  241. $v['formattribute'] = addslashes($v['formattribute']);
  242. $v['setting'] = array2string($v['setting']);
  243. $v['modelid'] = $modelid;
  244. $v['siteid'] = $this->siteid;
  245. unset($v['fieldid']);
  246. $this->sitemodel_field_db->insert($v);
  247. }
  248. }
  249. }
  250. $this->public_cache();
  251. showmessage(L('operation_success'),'?m=content&c=sitemodel&a=init');
  252. }
  253. } else {
  254. pc_base::load_sys_class('form','',0);
  255. $show_validator = '';
  256. $style_list = template_list($this->siteid, 0);
  257. foreach ($style_list as $k=>$v) {
  258. $style_list[$v['dirname']] = $v['name'] ? $v['name'] : $v['dirname'];
  259. unset($style_list[$k]);
  260. }
  261. $big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=content&c=sitemodel&a=add\', title:\''.L('add_model').'\', width:\'580\', height:\'400\', lock:true}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('add_model'));
  262. include $this->admin_tpl('sitemodel_import');
  263. }
  264. }
  265. /**
  266. * 检查表是否存在
  267. */
  268. public function public_check_tablename() {
  269. $r = $this->db->table_exists(strip_tags($_GET['tablename']));
  270. if(!$r) echo '1';
  271. }
  272. /**
  273. * 更新指定模型字段缓存
  274. *
  275. * @param $modelid 模型id
  276. */
  277. public function cache_field($modelid = 0) {
  278. $this->field_db = pc_base::load_model('sitemodel_field_model');
  279. $field_array = array();
  280. $fields = $this->field_db->select(array('modelid'=>$modelid,'disabled'=>$disabled),'*',100,'listorder ASC');
  281. foreach($fields as $_value) {
  282. $setting = string2array($_value['setting']);
  283. $_value = array_merge($_value,$setting);
  284. $field_array[$_value['field']] = $_value;
  285. }
  286. setcache('model_field_'.$modelid,$field_array,'model');
  287. return true;
  288. }
  289. }
  290. ?>