SearchController.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Http\Controllers\Account;
  3. use App\Models\Question;
  4. use App\Models\XsSearch;
  5. use Illuminate\Http\Request;
  6. use App\Http\Requests;
  7. use App\Http\Controllers\Controller;
  8. use Illuminate\Support\Facades\App;
  9. use Illuminate\Support\Facades\Validator;
  10. use Illuminate\Pagination\LengthAwarePaginator as Paginator;
  11. class SearchController extends Controller
  12. {
  13. public function show(Request $request){
  14. $word = trim($request->input('word'));
  15. $filter = trim($request->input('filter'));
  16. return view('theme::search.show')->with(compact('word','filter'));
  17. }
  18. /**
  19. * Display a listing of the resource.
  20. *
  21. * @return \Illuminate\Http\Response
  22. */
  23. public function index(Request $request,$filter='all')
  24. {
  25. $validator = Validator::make($request->all(), [
  26. 'word' => 'required|max:128',
  27. ]);
  28. if ($validator->fails())
  29. {
  30. return $this->error(route('auth.search.show'),'搜索关键词不能为空');
  31. }
  32. $word = trim($request->input('word'));
  33. if( Setting()->get('xunsearch_open',0) == 1 ){
  34. $pageSize = 15;
  35. $page = $request->query('page',1);
  36. $startIndex = ($page - 1) * $pageSize;
  37. $xsSearch = XsSearch::getSearch();
  38. if($filter !== 'all'){
  39. $model = App::make('App\Models\\'.ucfirst(str_singular($filter)));
  40. if($filter !== 'tags' ){
  41. $docs = $xsSearch->model($model)->addQuery($word)->setLimit($pageSize,$startIndex)->search();
  42. }else{
  43. $docs = $xsSearch->model($model)->addQuery($word)->addRange('status',0,null)->setLimit($pageSize,$startIndex)->search();
  44. }
  45. }else{
  46. $docs = $xsSearch->setFuzzy()->addQuery($word)->setLimit($pageSize,$startIndex)->search();
  47. }
  48. $dataList = [];
  49. foreach($docs as $doc){
  50. $data = [];
  51. $data['class_uid'] = $doc->class_uid;
  52. $data['id'] = $doc->id;
  53. $data['status'] = $doc->status;
  54. $data['subject'] = XsSearch::getSearch()->highlight($doc->subject);
  55. $data['content'] = XsSearch::getSearch()->highlight($doc->content);
  56. $dataList[] = $data;
  57. }
  58. $total = $xsSearch->count();
  59. $list = new Paginator($dataList, $total, $pageSize, $page,[
  60. 'path' => $request->url(),
  61. 'query' => $request->query()
  62. ]);
  63. }else{
  64. if($filter === 'all'){
  65. $filter = 'questions';
  66. }
  67. $model = App::make('App\Models\\'.ucfirst(str_singular($filter)));
  68. $list = $model::search($word);
  69. if($filter === 'questions'){
  70. $list->map(function($item) use ($word) {
  71. foreach (explode(" ", $word) as $k) {
  72. $item->title = $this->_highlight($k, $item->title);
  73. $item->description = $this->_highlight($k, $item->description);
  74. }
  75. });
  76. }
  77. }
  78. return view('theme::search.index')->with('word',$word)->with('filter',$filter)->with('list',$list);
  79. }
  80. private function _highlight($word,$subject){
  81. return str_ireplace("$word","<em>$word</em>",$subject);
  82. }
  83. }