/** * Search all resources that current user has read access. * * NOTE: Even search results are asociated to an user they are persisted * using CACHE instead of COOKIE because too big search results may lead * to excesively big HTTP headers resulting in a web server error response. * When the user logs out an event handler will purge the search results * from cache. * * @return Response */ public function search(Request $request) { $user = $request->user(); $searchableModels = $this->getSearchableModels($user); // Validate form $this->validate($request, ['query' => 'required|min:1', 'sections' => 'required|array|in:' . implode(',', array_keys($searchableModels))]); // Remove unselected models $selectedModels = $request->input('sections', []); foreach ($searchableModels as $permission => $model) { if (!in_array($permission, $selectedModels)) { unset($searchableModels[$permission]); } } // Initializate results $query = addcslashes($request->input('query'), '%_'); // Sanitize for 'LIKE' searches $session = $request->session(); $currentRoute = $request->route()->getName(); $cacheId = 'adminSearchResults' . $user->getKey(); $results = collect(); $totalResults = 0; // Perform search for all searchable models foreach ($searchableModels as $model) { $collection = $model->search($query); if (!($count = $collection->count())) { continue; } $totalResults += $count; $modelName = class_basename($model); // Build results object $result = new \stdClass(); $result->label = $model->plural(); $result->route = replace_last_segment($currentRoute, strtolower(str_plural($modelName)) . '.show'); $result->collection = $collection; $results[$modelName] = $result; } // Results found if ($results->count()) { // Sort results showing first the models with smaller collections $results = $results->sort(function ($result1, $result2) { $count1 = $result1->collection->count(); $count2 = $result2->collection->count(); // Is same count order alphabetically if ($count1 === $count2) { return strcasecmp($result1->label, $result2->label); } return $count1 < $count2 ? -1 : 1; }); // Store results in the cache for 5 minutes Cache::put($cacheId, $results, 5); $session->flash('success', sprintf(_('%d results found'), $totalResults)); } else { Cache::forget($cacheId); $session->flash('error', _('No results found')); } return redirect()->route('admin')->withInput(); }
/** * Display a listing of the resource. * * @return Response */ public function index() { // Paginate resource resutls $results = $this->paginate(); // If results found add asset to make tables responsive $results->total(); // Create header links for sorting by column $links = (object) link_to_sort_by($this->resource->getVisibleLabels()); // Set the route for the return button $returnRouteName = replace_last_segment($this->prefix); // Add data to the view $view = view('resource.index', compact(['results', 'links', 'returnRouteName'])); // Add data to the layout $this->layout->title = $this->resource->plural(); $this->layout->subtitle = $results->lastPage() > 1 ? sprintf(_('Page %d/%d'), $results->currentPage(), $results->lastPage()) : _('Index'); // Return layout + view return $this->layout($view); }