Search.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace addons\shop\controller;
  3. use addons\shop\model\SearchLog;
  4. use think\Config;
  5. use think\Session;
  6. /**
  7. * 搜索控制器
  8. * Class Search
  9. * @package addons\shop\controller
  10. */
  11. class Search extends Base
  12. {
  13. protected $noNeedLogin = '*';
  14. protected $noNeedRight = '*';
  15. public function _initialize()
  16. {
  17. parent::_initialize();
  18. }
  19. /**
  20. * 搜索首页
  21. */
  22. public function index()
  23. {
  24. $config = get_addon_config('shop');
  25. $search = $this->request->request("search", $this->request->request("q", ""));
  26. $search = mb_substr($search, 0, 100);
  27. if (!$search) {
  28. $this->error("关键字不能为空");
  29. }
  30. //禁止搜索过滤域名
  31. if (preg_match("/\.[a-z]{2,}/i", $search)) {
  32. $this->error("未找到相关记录");
  33. }
  34. //限制搜索字符长度
  35. if (mb_strlen($search) > 15) {
  36. $this->error("搜索关键字长度超出限制");
  37. }
  38. //搜索入库
  39. $token = $this->request->request("__searchtoken__");
  40. if ($search && $token && $token == Session::get("__searchtoken__")) {
  41. $log = SearchLog::getByKeywords($search);
  42. if ($log) {
  43. $log->setInc("nums");
  44. } else {
  45. SearchLog::create(['keywords' => $search, 'nums' => 1, 'status' => 'hidden']);
  46. }
  47. }
  48. //默认排序字段
  49. $orderList = [
  50. 'default' => ['title' => '默认排序', 'value' => 'weigh'],
  51. 'sales' => ['title' => '销量', 'value' => 'sales'],
  52. 'comments' => ['title' => '评价次数', 'value' => 'comments'],
  53. 'createtime' => ['title' => '发布时间', 'value' => 'createtime'],
  54. ];
  55. $orderby = $this->request->get('orderby', 'default');
  56. $orderway = $this->request->get('orderway', 'desc');
  57. $order = $orderList[$orderby] ?? $orderList['default'];
  58. $orderby = $order['value'];
  59. $orderway = $orderway == 'asc' ? 'asc' : 'desc';
  60. $searchList = \addons\shop\model\Goods::where('title|keywords', 'like', "%{$search}%")
  61. ->order($orderby, $orderway)
  62. ->paginate(20, false, [
  63. 'query' => $this->request->get()
  64. ]);
  65. $url = $this->request->url();
  66. foreach ($orderList as $key => &$item) {
  67. $params = ['q' => $search, 'orderby' => $key, 'orderway' => ($orderby == $item['value'] ? ($orderway == 'desc' ? 'asc' : 'desc') : 'desc')];
  68. $item['url'] = '?' . http_build_query($params);
  69. }
  70. $this->view->assign('orderby', $orderby);
  71. $this->view->assign('orderway', $orderway);
  72. $this->view->assign('orderList', $orderList);
  73. $this->view->assign('searchList', $searchList);
  74. $this->view->assign('keywords', $search);
  75. Config::set('shop.title', __('Search result'));
  76. return $this->view->fetch('/search');
  77. }
  78. }