search.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. /**
  3. * 商品列表
  4. *
  5. **by 好商城V3 www.33hao.com 运营版*/
  6. defined('InShopNC') or exit('Access Invalid!');
  7. class searchControl extends BaseHomeControl {
  8. //每页显示商品数
  9. const PAGESIZE = 24;
  10. //模型对象
  11. private $_model_search;
  12. public function indexOp() {
  13. Language::read('home_goods_class_index');
  14. $this->_model_search = Model('search');
  15. //显示左侧分类
  16. //默认分类,从而显示相应的属性和品牌
  17. $default_classid = intval($_GET['cate_id']);
  18. if (intval($_GET['cate_id']) > 0) {
  19. $goods_class_array = $this->_model_search->getLeftCategory(array($_GET['cate_id']));
  20. } elseif ($_GET['keyword'] != '') {
  21. //从TAG中查找分类
  22. $goods_class_array = $this->_model_search->getTagCategory($_GET['keyword']);
  23. //取出第一个分类作为默认分类,从而显示相应的属性和品牌
  24. $default_classid = $goods_class_array[0];
  25. $goods_class_array = $this->_model_search->getLeftCategory($goods_class_array, 1);;
  26. }
  27. Tpl::output('goods_class_array', $goods_class_array);
  28. Tpl::output('default_classid', $default_classid);
  29. //优先从全文索引库里查找
  30. list($indexer_ids,$indexer_count) = $this->_model_search->indexerSearch($_GET,self::PAGESIZE);
  31. //获得经过属性过滤的商品信息
  32. list($goods_param, $brand_array, $attr_array, $checked_brand, $checked_attr) = $this->_model_search->getAttr($_GET, $default_classid);
  33. Tpl::output('brand_array', $brand_array);
  34. Tpl::output('attr_array', $attr_array);
  35. Tpl::output('checked_brand', $checked_brand);
  36. Tpl::output('checked_attr', $checked_attr);
  37. //处理排序
  38. $order = 'is_own_shop desc,goods_id desc';
  39. if (in_array($_GET['key'],array('1','2','3'))) {
  40. $sequence = $_GET['order'] == '1' ? 'asc' : 'desc';
  41. $order = str_replace(array('1','2','3'), array('goods_salenum','goods_click','goods_promotion_price'), $_GET['key']);
  42. $order .= ' '.$sequence;
  43. }
  44. $model_goods = Model('goods');
  45. // 字段
  46. $fields = "goods_id,goods_commonid,goods_name,goods_jingle,gc_id,store_id,store_name,goods_price,goods_promotion_price,goods_promotion_type,goods_marketprice,goods_storage,goods_image,goods_freight,goods_salenum,color_id,evaluation_good_star,evaluation_count,is_virtual,is_fcode,is_appoint,is_presell,have_gift";
  47. $condition = array();
  48. if (is_array($indexer_ids)) {
  49. //商品主键搜索
  50. $condition['goods_id'] = array('in',$indexer_ids);
  51. $goods_list = $model_goods->getGoodsOnlineList($condition, $fields, 0, $order, self::PAGESIZE, null, false);
  52. //如果有商品下架等情况,则删除下架商品的搜索索引信息
  53. if (count($goods_list) != count($indexer_ids)) {
  54. $this->_model_search->delInvalidGoods($goods_list, $indexer_ids);
  55. }
  56. pagecmd('setEachNum',self::PAGESIZE);
  57. pagecmd('setTotalNum',$indexer_count);
  58. } else {
  59. //执行正常搜索
  60. if (isset($goods_param['class'])) {
  61. $condition['gc_id_'.$goods_param['class']['depth']] = $goods_param['class']['gc_id'];
  62. }
  63. if (intval($_GET['b_id']) > 0) {
  64. $condition['brand_id'] = intval($_GET['b_id']);
  65. }
  66. if ($_GET['keyword'] != '') {
  67. $condition['goods_name|goods_jingle'] = array('like', '%' . $_GET['keyword'] . '%');
  68. }
  69. if (intval($_GET['area_id']) > 0) {
  70. $condition['areaid_1'] = intval($_GET['area_id']);
  71. }
  72. if ($_GET['type'] == 1) {
  73. $condition['is_own_shop'] = 1;
  74. }
  75. if ($_GET['gift'] == 1) {
  76. $condition['have_gift'] = 1;
  77. }
  78. if (isset($goods_param['goodsid_array'])){
  79. $condition['goods_id'] = array('in', $goods_param['goodsid_array']);
  80. }
  81. $goods_list = $model_goods->getGoodsListByColorDistinct($condition, $fields, $order, self::PAGESIZE);
  82. }
  83. Tpl::output('show_page1', $model_goods->showpage(4));
  84. Tpl::output('show_page', $model_goods->showpage(5));
  85. // 商品多图
  86. if (!empty($goods_list)) {
  87. $commonid_array = array(); // 商品公共id数组
  88. $storeid_array = array(); // 店铺id数组
  89. foreach ($goods_list as $value) {
  90. $commonid_array[] = $value['goods_commonid'];
  91. $storeid_array[] = $value['store_id'];
  92. }
  93. $commonid_array = array_unique($commonid_array);
  94. $storeid_array = array_unique($storeid_array);
  95. // 商品多图
  96. $goodsimage_more = Model('goods')->getGoodsImageList(array('goods_commonid' => array('in', $commonid_array)));
  97. // 店铺
  98. $store_list = Model('store')->getStoreMemberIDList($storeid_array);
  99. //搜索的关键字
  100. $search_keyword = trim($_GET['keyword']);
  101. foreach ($goods_list as $key => $value) {
  102. // 商品多图
  103. //v3-b11 商品列表主图限制不越过5个
  104. $n=0;
  105. foreach ($goodsimage_more as $v) {
  106. if ($value['goods_commonid'] == $v['goods_commonid'] && $value['store_id'] == $v['store_id'] && $value['color_id'] == $v['color_id']) {
  107. $n++;
  108. $goods_list[$key]['image'][] = $v;
  109. if($n>=5)break;
  110. }
  111. }
  112. // 店铺的开店会员编号
  113. $store_id = $value['store_id'];
  114. $goods_list[$key]['member_id'] = $store_list[$store_id]['member_id'];
  115. $goods_list[$key]['store_domain'] = $store_list[$store_id]['store_domain'];
  116. //将关键字置红
  117. if ($search_keyword){
  118. $goods_list[$key]['goods_name_highlight'] = str_replace($search_keyword,'<font style="color:#f00;">'.$search_keyword.'</font>',$value['goods_name']);
  119. } else {
  120. $goods_list[$key]['goods_name_highlight'] = $value['goods_name'];
  121. }
  122. }
  123. }
  124. Tpl::output('goods_list', $goods_list);
  125. if ($_GET['keyword'] != ''){
  126. Tpl::output('show_keyword', $_GET['keyword']);
  127. } else {
  128. Tpl::output('show_keyword', $goods_param['class']['gc_name']);
  129. }
  130. $model_goods_class = Model('goods_class');
  131. // SEO
  132. if ($_GET['keyword'] == '') {
  133. $seo_class_name = $goods_param['class']['gc_name'];
  134. if (is_numeric($_GET['cate_id']) && empty($_GET['keyword'])) {
  135. $seo_info = $model_goods_class->getKeyWords(intval($_GET['cate_id']));
  136. if (empty($seo_info[1])) {
  137. $seo_info[1] = C('site_name') . ' - ' . $seo_class_name;
  138. }
  139. Model('seo')->type($seo_info)->param(array('name' => $seo_class_name))->show();
  140. }
  141. } elseif ($_GET['keyword'] != '') {
  142. Tpl::output('html_title', (empty($_GET['keyword']) ? '' : $_GET['keyword'] . ' - ') . C('site_name') . L('nc_common_search'));
  143. }
  144. // 当前位置导航
  145. $nav_link_list = $model_goods_class->getGoodsClassNav(intval($_GET['cate_id']));
  146. Tpl::output('nav_link_list', $nav_link_list );
  147. // 得到自定义导航信息
  148. $nav_id = intval($_GET['nav_id']) ? intval($_GET['nav_id']) : 0;
  149. Tpl::output('index_sign', $nav_id);
  150. // 地区
  151. $province_array = Model('area')->getTopLevelAreas();
  152. Tpl::output('province_array', $province_array);
  153. loadfunc('search');
  154. // 浏览过的商品
  155. $viewed_goods = Model('goods_browse')->getViewedGoodsList($_SESSION['member_id'],20);
  156. Tpl::output('viewed_goods',$viewed_goods);
  157. Tpl::showpage('search');
  158. }
  159. /**
  160. * 获得推荐商品
  161. */
  162. public function get_booth_goodsOp() {
  163. $gc_id = $_GET['cate_id'];
  164. if ($gc_id <= 0) {
  165. return false;
  166. }
  167. // 获取分类id及其所有子集分类id
  168. $goods_class = Model('goods_class')->getGoodsClassForCacheModel();
  169. if (empty($goods_class[$gc_id])) {
  170. return false;
  171. }
  172. $child = (!empty($goods_class[$gc_id]['child'])) ? explode(',', $goods_class[$gc_id]['child']) : array();
  173. $childchild = (!empty($goods_class[$gc_id]['childchild'])) ? explode(',', $goods_class[$gc_id]['childchild']) : array();
  174. $gcid_array = array_merge(array($gc_id), $child, $childchild);
  175. // 查询添加到推荐展位中的商品id
  176. $boothgoods_list = Model('p_booth')->getBoothGoodsList(array('gc_id' => array('in', $gcid_array)), 'goods_id', 0, 4, 'rand()');
  177. if (empty($boothgoods_list)) {
  178. return false;
  179. }
  180. $goodsid_array = array();
  181. foreach ($boothgoods_list as $val) {
  182. $goodsid_array[] = $val['goods_id'];
  183. }
  184. $fieldstr = "goods_id,goods_commonid,goods_name,goods_jingle,store_id,store_name,goods_price,goods_promotion_price,goods_promotion_type,goods_marketprice,goods_storage,goods_image,goods_freight,goods_salenum,color_id,evaluation_count";
  185. $goods_list = Model('goods')->getGoodsOnlineList(array('goods_id' => array('in', $goodsid_array)), $fieldstr);
  186. if (empty($goods_list)) {
  187. return false;
  188. }
  189. Tpl::output('goods_list', $goods_list);
  190. Tpl::showpage('goods.booth', 'null_layout');
  191. }
  192. public function auto_completeOp() {
  193. try {
  194. require(BASE_DATA_PATH.'/api/xs/lib/XS.php');
  195. $obj_doc = new XSDocument();
  196. $obj_xs = new XS(C('fullindexer.appname'));
  197. $obj_index = $obj_xs->index;
  198. $obj_search = $obj_xs->search;
  199. $obj_search->setCharset(CHARSET);
  200. $corrected = $obj_search->getExpandedQuery($_GET['term']);
  201. if (count($corrected) !== 0) {
  202. $data = array();
  203. foreach ($corrected as $word)
  204. {
  205. $row['id'] = $word;
  206. $row['label'] = $word;
  207. $row['value'] = $word;
  208. $data[] = $row;
  209. }
  210. exit(json_encode($data));
  211. }
  212. } catch (XSException $e) {
  213. if (is_object($obj_index)) {
  214. $obj_index->flushIndex();
  215. }
  216. // Log::record('search\auto_complete'.$e->getMessage(),Log::RUN);
  217. }
  218. }
  219. /**
  220. * 获得猜你喜欢
  221. */
  222. public function get_guesslikeOp(){
  223. $goodslist = Model('goods_browse')->getGuessLikeGoods($_SESSION['member_id'], 20);
  224. Tpl::output('goodslist',$goodslist);
  225. Tpl::showpage('goods_guesslike','null_layout');
  226. }
  227. }