search.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. defined('IN_PHPCMS') or exit('No permission resources.');
  3. //模型缓存路径
  4. define('CACHE_MODEL_PATH',CACHE_PATH.'caches_model'.DIRECTORY_SEPARATOR.'caches_data'.DIRECTORY_SEPARATOR);
  5. pc_base::load_app_func('util','content');
  6. class search {
  7. private $db;
  8. function __construct() {
  9. $this->db = pc_base::load_model('content_model');
  10. }
  11. /**
  12. * 按照模型搜索
  13. */
  14. public function init() {
  15. $grouplist = getcache('grouplist','member');
  16. $_groupid = param::get_cookie('_groupid');
  17. if(!$_groupid) $_groupid = 8;
  18. if(!$grouplist[$_groupid]['allowsearch']) {
  19. if ($_groupid==8) showmessage(L('guest_not_allowsearch'));
  20. else showmessage('');
  21. }
  22. if(!isset($_GET['catid'])) showmessage(L('missing_part_parameters'));
  23. $catid = intval($_GET['catid']);
  24. $siteids = getcache('category_content','commons');
  25. $siteid = $siteids[$catid];
  26. $this->categorys = getcache('category_content_'.$siteid,'commons');
  27. if(!isset($this->categorys[$catid])) showmessage(L('missing_part_parameters'));
  28. if(isset($_GET['info']['catid']) && $_GET['info']['catid']) {
  29. $catid = intval($_GET['info']['catid']);
  30. } else {
  31. $_GET['info']['catid'] = 0;
  32. }
  33. $modelid = $this->categorys[$catid]['modelid'];
  34. $modelid = intval($modelid);
  35. if(!$modelid) showmessage(L('illegal_parameters'));
  36. //搜索间隔
  37. $minrefreshtime = getcache('common','commons');
  38. $minrefreshtime = intval($minrefreshtime['minrefreshtime']);
  39. $minrefreshtime = $minrefreshtime ? $minrefreshtime : 5;
  40. if(param::get_cookie('search_cookie') && param::get_cookie('search_cookie')>SYS_TIME-2) {
  41. showmessage(L('search_minrefreshtime',array('min'=>$minrefreshtime)),'index.php?m=content&c=search&catid='.$catid,$minrefreshtime*1280);
  42. } else {
  43. param::set_cookie('search_cookie',SYS_TIME+2);
  44. }
  45. //搜索间隔
  46. $CATEGORYS = $this->categorys;
  47. //产生表单
  48. pc_base::load_sys_class('form','',0);
  49. $fields = getcache('model_field_'.$modelid,'model');
  50. $forminfos = array();
  51. foreach ($fields as $field=>$r) {
  52. if($r['issearch']) {
  53. if($r['formtype']=='catid') {
  54. $r['form'] = form::select_category('',$_GET['info']['catid'],'name="info[catid]"',L('please_select_category'),$modelid,0,1);
  55. } elseif($r['formtype']=='number') {
  56. $r['form'] = "<input type='text' name='{$field}_start' id='{$field}_start' value='' size=5 class='input-text'/> - <input type='text' name='{$field}_end' id='{$field}_start' value='' size=5 class='input-text'/>";
  57. } elseif($r['formtype']=='datetime') {
  58. $r['form'] = form::date("info[$field]");
  59. } elseif($r['formtype']=='box') {
  60. $options = explode("\n",$r['options']);
  61. $option = array();
  62. foreach($options as $_k) {
  63. $v = explode("|",trim($_k));
  64. $option[$v[1]] = $v[0];
  65. }
  66. switch($r['boxtype']) {
  67. case 'radio':
  68. $string = form::radio($option,$value,"name='info[$field]' id='$field'");
  69. break;
  70. case 'checkbox':
  71. $string = form::radio($option,$value,"name='info[$field]' id='$field'");
  72. break;
  73. case 'select':
  74. $string = form::select($option,$value,"name='info[$field]' id='$field'");
  75. break;
  76. case 'multiple':
  77. $string = form::select($option,$value,"name='info[$field]' id='$field'");
  78. break;
  79. }
  80. $r['form'] = $string;
  81. } elseif($r['formtype']=='typeid') {
  82. $types = getcache('type_content','commons');
  83. $types_array = array(L('no_limit'));
  84. foreach ($types as $_k=>$_v) {
  85. if($modelid == $_v['modelid']) $types_array[$_k] = $_v['name'];
  86. }
  87. $r['form'] = form::select($types_array,0,"name='info[$field]' id='$field'");
  88. } elseif($r['formtype']=='linkage') {
  89. $setting = string2array($r['setting']);
  90. $value = $_GET['info'][$field];
  91. $r['form'] = menu_linkage($setting['linkageid'],$field,$value);
  92. } elseif(in_array($r['formtype'], array('text','keyword','textarea','editor','title','author','omnipotent'))) {
  93. $value = safe_replace($_GET['info'][$field]);
  94. $r['form'] = "<input type='text' name='info[$field]' id='$field' value='".$value."' class='input-text search-text'/>";
  95. } else {
  96. continue;
  97. }
  98. $forminfos[$field] = $r;
  99. }
  100. }
  101. //-----------
  102. if(isset($_GET['dosubmit'])) {
  103. $siteid = $this->categorys[$catid]['siteid'];
  104. $siteurl = siteurl($siteid);
  105. $this->db->set_model($modelid);
  106. $tablename = $this->db->table_name;
  107. $page = max(intval($_GET['page']), 1);
  108. $sql = "SELECT * FROM `{$tablename}` a,`{$tablename}_data` b WHERE a.id=b.id AND a.status=99";
  109. $sql_count = "SELECT COUNT(*) AS num FROM `{$tablename}` a,`{$tablename}_data` b WHERE a.id=b.id AND a.status=99";
  110. //构造搜索SQL
  111. $where = '';
  112. foreach ($fields as $field=>$r) {
  113. if($r['issearch']) {
  114. $table_nickname = $r['issystem'] ? 'a' : 'b';
  115. if($r['formtype']=='catid') {
  116. if($_GET['info']['catid']) $where .= " AND {$table_nickname}.catid='$catid'";
  117. } elseif($r['formtype']=='number') {
  118. $start = "{$field}_start";
  119. $end = "{$field}_end";
  120. if($_GET[$start]) {
  121. $start = intval($_GET[$start]);
  122. $where .= " AND {$table_nickname}.{$field}>'$start'";
  123. }
  124. if($_GET[$end]) {
  125. $end = intval($_GET[$end]);
  126. $where .= " AND {$table_nickname}.{$field}<'$end'";
  127. }
  128. } elseif($r['formtype']=='datetime') {
  129. if($_GET['info'][$field]) {
  130. $start = strtotime($_GET['info'][$field]);
  131. if($start) $where .= " AND {$table_nickname}.{$field}>'$start'";
  132. }
  133. } elseif($r['formtype']=='box') {
  134. if($_GET['info'][$field]) {
  135. $field_value = safe_replace($_GET['info'][$field]);
  136. switch($r['boxtype']) {
  137. case 'radio':
  138. $where .= " AND {$table_nickname}.`$field`='$field_value'";
  139. break;
  140. case 'checkbox':
  141. $where .= " AND {$table_nickname}.`$field` LIKE '%,$field_value,%'";
  142. break;
  143. case 'select':
  144. $where .= " AND {$table_nickname}.`$field`='$field_value'";
  145. break;
  146. case 'multiple':
  147. $where .= " AND {$table_nickname}.`$field` LIKE '%,$field_value,%'";
  148. break;
  149. }
  150. }
  151. } elseif($r['formtype']=='typeid') {
  152. if($_GET['info'][$field]) {
  153. $typeid = intval($_GET['info'][$field]);
  154. $where .= " AND {$table_nickname}.`$field`='$typeid'";
  155. }
  156. } elseif($r['formtype']=='linkage') {
  157. if($_GET['info'][$field]) {
  158. $linkage = intval($_GET['info'][$field]);
  159. $where .= " AND {$table_nickname}.`$field`='$linkage'";
  160. }
  161. } elseif(in_array($r['formtype'], array('text','keyword','textarea','editor','title','author','omnipotent'))) {
  162. if($_GET['info'][$field]) {
  163. $keywords = safe_replace($_GET['info'][$field]);
  164. $where .= " AND {$table_nickname}.`$field` LIKE '%$keywords%'";
  165. }
  166. } else {
  167. continue;
  168. }
  169. }
  170. }
  171. //-----------
  172. if($where=='') showmessage(L('please_enter_content_to_search'));
  173. $pagesize = 20;
  174. $offset = intval($pagesize*($page-1));
  175. $sql_count .= $where;
  176. $this->db->query($sql_count);
  177. $total = $this->db->fetch_array();
  178. $total = $total[0]['num'];
  179. if($total!=0) {
  180. $sql .= $where;
  181. $order = '';
  182. $order = $_GET['orderby']=='a.id DESC' ? 'a.id DESC' : 'a.id ASC';
  183. $sql .= ' ORDER BY '.$order;
  184. $sql .= " LIMIT $offset,$pagesize";
  185. $this->db->query($sql);
  186. $datas = $this->db->fetch_array();
  187. $pages = pages($total, $page, $pagesize);
  188. } else {
  189. $datas = array();
  190. $pages = '';
  191. }
  192. }
  193. $SEO = seo($siteid, $catid, $keywords);
  194. include template('content','search');
  195. }
  196. }
  197. ?>