Source of file SearchResultsPageController.php
Size: 4,731 Bytes - Last Modified: 2021-12-24T05:19:21+00:00
/var/www/docs.ssmods.com/process/src/src/SearchResultsPageController.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | <?php namespace IQnection\SearchResultsPage; use SilverStripe\ORM\DB; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\ArrayList; use SilverStripe\View\ArrayData; use SilverStripe\ORM\FieldType; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\ORM\PaginatedList; use SilverStripe\Versioned\Versioned; use SilverStripe\ORM\Queries\SQLSelect; use SilverStripe\ORM\Connect\MySQLDatabase; use SilverStripe\View\Requirements; use SilverStripe\Core\Injector\Injector; class SearchResultsPageController extends \PageController { private static $allowed_actions = array( "results" ); protected function init() { parent::init(); Requirements::css('iqnection-pages/searchresultspage:client/css/SearchResultsPage.css'); } public function results() { $db = new MySQLDatabase(); $db->setConnector(DB::get_connector()); $s1 = trim($this->getRequest()->requestVar("s")); $s2 = str_replace(' ','+',$s1); $search_query = $db->quoteString($s2); // collect all indexes named SearchFields $schema = DataObject::getSchema(); $indexedTables = []; foreach($schema->getTableNames() as $tableName) { $class = $schema->tableClass($tableName); $tableIndexes = $schema->databaseIndexes($class, false); $singleton = Injector::inst()->create($class); if ( (isset($tableIndexes['SearchFields'])) && ( ($singleton->hasMethod('getPage')) || ($singleton instanceof SiteTree) ) ) { $indexedTables[] = [ 'tableName' => $tableName, 'class' => $schema->tableClass($tableName), 'indexes' => $tableIndexes['SearchFields'], 'columns' => $schema->databaseFields($class), 'singleton' => $singleton ]; } } $arrayList = ArrayList::create(); // search each table on the index SearchFields foreach($indexedTables as $indexedTable) { $sql = new SQLSelect(); $singleton = $indexedTable['singleton']; $tableName = $indexedTable['tableName']; $columns = $indexedTable['columns']; $class = $indexedTable['class']; // if the DataObject is versioned, search the _Live table instead if ($singleton->hasExtension(Versioned::class)) { $tableName .= '_Live'; } $sql->setFrom($tableName); $sql->selectField('( MATCH ("'.implode('","', $indexedTable['indexes']['columns']).'") AGAINST ('.$search_query.') )', 'score'); if (array_key_exists('ShowInSearch', $columns)) { $sql->addWhere('"ShowInSearch" = 1'); } $sql->addHaving('score > 0'); $sqlStatement = $sql->sql(); $queryResults = $db->query($sqlStatement); foreach($queryResults as $queryResult) { if ($dbObject = $class::get_by_id($queryResult['ID'])) { $page = $dbObject; if (!($page instanceof SiteTree)) { if (!$page = $dbObject->getPage()) { continue; } } if ($page->Content) { $content = $page->dbObject('Content'); } elseif ( (class_exists('\\DNADesign\\Elemental\\Extensions\\ElementalPageExtension')) && ($page->hasExtension(\DNADesign\Elemental\Extensions\ElementalPageExtension::class)) ) { $content = $page->ElementalArea()->forTemplate(); } $plainContent = FieldType\DBField::create_field(FieldType\DBHTMLText::class, strip_tags($content->forTemplate())); $searchSummary = $plainContent->ContextSummary(300, $s1, true); $page->extend('updateSearchSummary', $content, $s1); $arrayList->push(ArrayData::create([ 'Page' => $page, 'Summary' => $searchSummary, 'Score' => $queryResult['score'], ])); } } } $arrayList = $arrayList->Sort('score', 'DESC'); $data = []; $data['PaginatedResults'] = PaginatedList::create($arrayList,$this->getRequest()); $data['Query'] = $s1; return $this->Customise($data); } } |