Source of file SearchPageController.php
Size: 4,179 Bytes - Last Modified: 2021-12-23T10:57:20+00:00
/var/www/docs.ssmods.com/process/src/src/Pages/SearchPageController.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | <?php namespace Vulcan\Search\Pages; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\Config\Config; use SilverStripe\i18n\i18n; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBHTMLText; use SilverStripe\ORM\HasManyList; use SilverStripe\View\Requirements; use Vulcan\NzClassics\Models\Location; use Vulcan\Search\Models\SearchIndexEntry; use Vulcan\Search\Models\SearchTank; use Vulcan\Search\Models\SortFilter; /** * Class SearchPageController * @package Vulcan\Search\Pages * * @property int TankID * * @method SearchTank Tank * @method HasManyList Filters */ class SearchPageController extends \PageController { private static $allowed_actions = [ 'index' ]; public function init() { parent::init(); Requirements::javascript('/resources/vulcandigital/silverstripe-search/js/search.js'); } /** * @param HTTPRequest $request * * @return string */ public function index(HTTPRequest $request) { $q = $request->getVar('q'); if ($q) { return $this->getResults($request); } return $this->render(); } /** * @param HTTPRequest $request * * @return string */ public function getResults(HTTPRequest $request) { $q = $request->getVar('q'); $pageSize = $request->getVar('show') ?? 25; $filter = $request->getVar('filter') ?? null; $sort = $request->getVar('sort') ?? null; if ($sort) { /** @var SortFilter $sortFilter */ $sortFilter = SortFilter::get()->filter('Title', $sort)->first(); if ($sortFilter) { $sort = $sortFilter->SortSql; } } $classFilters = null; if ($filter) { $filters = explode(',', $filter); foreach ($filters as $key) { $class = $this->getFilterClassFromKey($key); if ($class) { if (!is_array($classFilters)) { $classFilters = []; } $classFilters[] = $class; } } } $term = new DBHTMLText(); $term->setValue($q); return $this->render([ 'Title' => $term . ' - ' ._t('VulcanSearch.SEARCH', 'Search'), 'SearchTerm' => $term, 'SearchResults' => SearchIndexEntry::paginatedSearch($q, $this->Tank(), $sort, $classFilters, $request, $pageSize) ]); } public function getSearchQuery() { return $this->getRequest()->getVar('q'); } /** * Dynamically generates a map used for filtering searched records based on which tank is currently active * * @return array */ public function filterClassMap() { $tankClasses = SearchTank::classesImplementTank($this->Tank()); $filterMap = []; foreach ($tankClasses as $class) { if (singleton($class) instanceof \Page) { $filterMap['pages'] = \Page::class; continue; } /** @var DataObject $singleton */ $singleton = singleton($class); $name = $singleton->i18n_plural_name(); $filterMap[$name] = $class; } return $filterMap; } /** * @return ArrayList */ public function FilterMap() { $map = []; $active = $this->getRequest()->getVar('filter'); foreach ($this->filterClassMap() as $key => $value) { $map[] = [ 'Key' => $key, 'Value' => ucwords($key), 'IsActive' => strstr($active, $key) ]; } return ArrayList::create($map); } /** * @param $key * * @return bool|mixed */ public function getFilterClassFromKey($key) { $map = $this->filterClassMap(); return $map[$key] ?? false; } /** * @return mixed */ public function getSortValue() { return $this->getRequest()->getVar('sort'); } } |