formguide.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. pc_base::load_app_class('admin','admin',0);
  4. pc_base::load_sys_class('form', '', '');
  5. class formguide extends admin {
  6. private $db, $tablename, $m_db, $M;
  7. public function __construct() {
  8. parent::__construct();
  9. $this->tablename = '';
  10. $setting = new_html_special_chars(getcache('formguide', 'commons'));
  11. $this->M = $setting[$this->get_siteid()];
  12. $this->db = pc_base::load_model('sitemodel_model');
  13. }
  14. //表单向导列表
  15. public function init() {
  16. $page = max(intval($_GET['page']), 1);
  17. $data = $this->db->listinfo(array('type' => 3, 'siteid'=>$this->get_siteid()), '`modelid` DESC', $page);
  18. $big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=formguide&c=formguide&a=add\', title:\''.L('formguide_add').'\', width:\'700\', height:\'500\', 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('formguide_add'));
  19. include $this->admin_tpl('formguide_list');
  20. }
  21. /**
  22. * 添加表单向导
  23. */
  24. public function add() {
  25. if (isset($_POST['dosubmit'])) {
  26. if ($_POST['setting']['starttime']) {
  27. $_POST['setting']['starttime'] = strtotime($_POST['setting']['starttime']);
  28. }
  29. if ($_POST['setting']['endtime']) {
  30. $_POST['setting']['endtime'] = strtotime($_POST['setting']['endtime']);
  31. }
  32. $_POST['info'] = $this->check_info($_POST['info']);
  33. $_POST['info']['setting'] = array2string($_POST['setting']);
  34. $_POST['info']['siteid'] = $this->get_siteid();
  35. $_POST['info']['addtime'] = SYS_TIME;
  36. $_POST['info']['js_template'] = $_POST['info']['show_js_template'];
  37. $_POST['info']['type'] = 3;
  38. unset($_POST['info']['show_js_template']);
  39. $this->tablename = $_POST['info']['tablename'];
  40. $formid = $this->db->insert($_POST['info'], true);
  41. define('MODEL_PATH',PC_PATH.'modules'.DIRECTORY_SEPARATOR.'formguide'.DIRECTORY_SEPARATOR.'fields'.DIRECTORY_SEPARATOR);
  42. $create_sql = file_get_contents(MODEL_PATH.'create.sql');
  43. $this->m_db = pc_base::load_model('sitemodel_field_model');
  44. $this->sql_execute($create_sql);
  45. $form_public_field_array = getcache('form_public_field_array', 'model');
  46. if (is_array($form_public_field_array)) {
  47. foreach ($form_public_field_array as $k => $v) {
  48. $v['info']['modelid'] = $formid;
  49. $this->m_db->insert($v['info']);
  50. $sql = str_replace('formguide_table', $this->m_db->db_tablepre.'form_'.$_POST['info']['tablename'], $v['sql']);
  51. $this->m_db->query($sql);
  52. }
  53. }
  54. showmessage(L('add_success'), '?m=formguide&c=formguide_field&a=init&formid='.$formid, '', 'add');
  55. } else {
  56. $siteid = $this->get_siteid();
  57. $template_list = template_list($siteid, 0);
  58. $site = pc_base::load_app_class('sites','admin');
  59. $info = $site->get_by_id($siteid);
  60. foreach ($template_list as $k=>$v) {
  61. $template_list[$v['dirname']] = $v['name'] ? $v['name'] : $v['dirname'];
  62. unset($template_list[$k]);
  63. }
  64. $formid = intval($_GET['formid']);
  65. pc_base::load_sys_class('form', '', false);
  66. $show_header = $show_validator = $show_scroll = 1;
  67. include $this->admin_tpl('formguide_add');
  68. }
  69. }
  70. /**
  71. * 编辑表单向导
  72. */
  73. public function edit() {
  74. if (!isset($_GET['formid']) || empty($_GET['formid'])) {
  75. showmessage(L('illegal_operation'), HTTP_REFERER);
  76. }
  77. $formid = intval($_GET['formid']);
  78. if (isset($_POST['dosubmit'])) {
  79. if ($_POST['setting']['starttime']) {
  80. $_POST['setting']['starttime'] = strtotime($_POST['setting']['starttime']);
  81. }
  82. if ($_POST['setting']['endtime']) {
  83. $_POST['setting']['endtime'] = strtotime($_POST['setting']['endtime']);
  84. }
  85. $_POST['info'] = $this->check_info($_POST['info'], $formid);
  86. $_POST['info']['setting'] = array2string($_POST['setting']);
  87. $_POST['info']['js_template'] = $_POST['info']['show_js_template'];
  88. unset($_POST['info']['show_js_template']);
  89. $this->db->update($_POST['info'], array('modelid'=>$formid));
  90. showmessage(L('update_success'), '?m=formguide&c=formguide&a=init&formid='.$formid, '', 'edit');
  91. } else {
  92. $siteid = $this->get_siteid();
  93. $template_list = template_list($siteid, 0);
  94. $site = pc_base::load_app_class('sites','admin');
  95. $info = $site->get_by_id($siteid);
  96. foreach ($template_list as $k=>$v) {
  97. $template_list[$v['dirname']] = $v['name'] ? $v['name'] : $v['dirname'];
  98. unset($template_list[$k]);
  99. }
  100. $data = $this->db->get_one(array('modelid'=>$formid));
  101. $data['setting'] = string2array($data['setting']);
  102. pc_base::load_sys_class('form', '', false);
  103. $show_header = $show_validator = $show_scroll = 1;
  104. include $this->admin_tpl('formguide_edit');
  105. }
  106. }
  107. /**
  108. * 表单向导禁用、开启
  109. */
  110. public function disabled() {
  111. if (!isset($_GET['formid']) || empty($_GET['formid'])) {
  112. showmessage(L('illegal_operation'), HTTP_REFERER);
  113. }
  114. $formid = intval($_GET['formid']);
  115. $val = $_GET['val'] ? intval($_GET['val']) : 0;
  116. $this->db->update(array('disabled'=>$val), array('modelid'=>$formid, 'siteid'=>$this->get_siteid()));
  117. showmessage(L('operation_success'), HTTP_REFERER);
  118. }
  119. /**
  120. * 预览
  121. */
  122. public function public_preview() {
  123. if (!isset($_GET['formid']) || empty($_GET['formid'])) {
  124. showmessage(L('illegal_operation'), HTTP_REFERER);
  125. }
  126. $formid = intval($_GET['formid']);
  127. $f_info = $this->db->get_one(array('modelid'=>$formid, 'siteid'=>$this->get_siteid()), 'name');
  128. define('CACHE_MODEL_PATH',PHPCMS_PATH.'caches'.DIRECTORY_SEPARATOR.'caches_model'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR);
  129. require CACHE_MODEL_PATH.'formguide_form.class.php';
  130. $formguide_form = new formguide_form($formid);
  131. $forminfos_data = $formguide_form->get();
  132. $show_header = 1;
  133. include $this->admin_tpl('formguide_preview');
  134. }
  135. /**
  136. * ajax 检测表是重复
  137. */
  138. public function public_checktable() {
  139. if (isset($_GET['formid']) && !empty($_GET['formid'])) {
  140. $formid = intval($_GET['formid']);
  141. }
  142. $r = $this->db->get_one(array('tablename'=>$_GET['tablename']), 'tablename, modelid');
  143. if (!$r['modelid']) {
  144. exit('1');
  145. } elseif ($r['modelid'] && ($r['modelid']==$formid)) {
  146. exit('1');
  147. } else {
  148. exit('0');
  149. }
  150. }
  151. /**
  152. * 判断表单数据合法性
  153. * @param array $data 表单数组
  154. * @param intval $formid 表单id
  155. */
  156. private function check_info($data = array(), $formid = 0) {
  157. if (empty($data) || $data['name']=='') {
  158. showmessage(L('input_form_title'), HTTP_REFERER);
  159. }
  160. if ($data['tablename']=='') {
  161. showmessage(L('please_input_tallename'), HTTP_REFERER);
  162. }
  163. $r = $this->db->get_one(array('tablename'=>$data['tablename']), 'tablename, modelid');
  164. if ($r['modelid'] && (($r['modelid']!=$formid) || !$formid)) {
  165. showmessage(L('tablename_existed'), HTTP_REFERER);
  166. }
  167. return $data;
  168. }
  169. /**
  170. * 删除表单向导
  171. */
  172. public function delete() {
  173. $siteid = $this->get_siteid();
  174. if (isset($_GET['formid']) && !empty($_GET['formid'])) {
  175. $formid = intval($_GET['formid']);
  176. $m_db = pc_base::load_model('sitemodel_field_model');
  177. $m_db->delete(array('modelid'=>$formid, 'siteid'=>$siteid));
  178. $m_info = $this->db->get_one(array('modelid'=>$formid), 'tablename');
  179. $tablename = $m_db->db_tablepre.'form_'.$m_info['tablename'];
  180. $m_db->query("DROP TABLE `$tablename`");
  181. $this->db->delete(array('modelid'=>$formid, 'siteid'=>$siteid));
  182. showmessage(L('operation_success'), HTTP_REFERER);
  183. } elseif (isset($_POST['formid']) && !empty($_POST['formid'])) {
  184. $m_db = pc_base::load_model('sitemodel_field_model');
  185. $m_db->delete(array('modelid'=>$formid, 'siteid'=>$siteid));
  186. if (is_array($_POST['formid'])) {
  187. foreach ($_POST['formid'] as $fid) {
  188. $m_info = $this->db->get_one(array('modelid'=>$fid), 'tablename');
  189. $tablename = $m_db->db_tablepre.'form_'.$m_info['tablename'];
  190. $m_db->query("DROP TABLE `$tablename`");
  191. $this->db->delete(array('modelid'=>$fid, 'siteid'=>$siteid));
  192. }
  193. }
  194. showmessage(L('operation_success'), HTTP_REFERER);
  195. } else {
  196. showmessage(L('illegal_operation'), HTTP_REFERER);
  197. }
  198. }
  199. /**
  200. * 统计
  201. */
  202. public function stat() {
  203. if (!isset($_GET['formid']) || empty($_GET['formid'])) {
  204. showmessage(L('illegal_operation'), HTTP_REFERER);
  205. }
  206. $formid = intval($_GET['formid']);
  207. $fields = getcache('formguide_field_'.$formid, 'model');
  208. $f_info = $this->db->get_one(array('modelid'=>$formid, 'siteid'=>$this->get_siteid()), 'tablename');
  209. $tablename = 'form_'.$f_info['tablename'];
  210. $m_db = pc_base::load_model('sitemodel_field_model');
  211. $result = $m_db->select(array('modelid'=>$formid, 'formtype'=>'box'), 'field, setting');
  212. $m_db->change_table($tablename);
  213. $datas = $m_db->select(array(), '*');
  214. $total = count($datas);
  215. include $this->admin_tpl('formguide_stat');
  216. }
  217. /**
  218. * 模块配置
  219. */
  220. public function setting() {
  221. if (isset($_POST['dosubmit'])) {
  222. $setting = getcache('formguide', 'commons');
  223. $setting[$this->get_siteid()] = $_POST['setting'];
  224. setcache('formguide', $setting, 'commons'); //设置缓存
  225. $m_db = pc_base::load_model('module_model'); //调用模块数据模型
  226. $setting = array2string($_POST['setting']);
  227. $m_db->update(array('setting'=>$setting), array('module'=>ROUTE_M)); //将配置信息存入数据表中
  228. showmessage(L('setting_updates_successful'), HTTP_REFERER, '', 'setting');
  229. } else {
  230. @extract($this->M);
  231. include $this->admin_tpl('setting');
  232. }
  233. }
  234. /**
  235. * 执行sql文件,创建数据表等
  236. * @param string $sql sql语句
  237. */
  238. private function sql_execute($sql) {
  239. $sqls = $this->sql_split($sql);
  240. if (is_array($sqls)) {
  241. foreach ($sqls as $sql) {
  242. if (trim($sql) != '') {
  243. $this->m_db->query($sql);
  244. }
  245. }
  246. } else {
  247. $this->m_db->query($sqls);
  248. }
  249. return true;
  250. }
  251. /**
  252. * 处理sql语句,执行替换前缀都功能。
  253. * @param string $sql 原始的sql,将一些大众的部分替换成私有的
  254. */
  255. private function sql_split($sql) {
  256. $database = pc_base::load_config('database');
  257. $dbcharset = $database['default']['charset'];
  258. if($this->m_db->version() > '4.1' && $dbcharset) {
  259. $sql = preg_replace("/TYPE=(InnoDB|MyISAM|MEMORY)( DEFAULT CHARSET=[^; ]+)?/", "ENGINE=\\1 DEFAULT CHARSET=".$dbcharset, $sql);
  260. }
  261. $sql = str_replace("phpcms_form_table", $this->m_db->db_tablepre.'form_'.$this->tablename, $sql);
  262. $ret = array();
  263. $num = 0;
  264. $queriesarray = explode(";\n", trim($sql));
  265. unset($sql);
  266. foreach ($queriesarray as $query) {
  267. $ret[$num] = '';
  268. $queries = explode("\n", trim($query));
  269. $queries = array_filter($queries);
  270. foreach ($queries as $query) {
  271. $str1 = substr($query, 0, 1);
  272. if($str1 != '#' && $str1 != '-') $ret[$num] .= $query;
  273. }
  274. $num++;
  275. }
  276. return $ret;
  277. }
  278. }
  279. ?>