From e0b0bc5dc88125d50186b9c0bb032bb57d14804b Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 8 Sep 2020 09:13:14 +1200 Subject: [PATCH 01/41] Add table name to join query --- src/SearchPageController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/SearchPageController.php b/src/SearchPageController.php index 71afb00..e1ac8b9 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -427,6 +427,7 @@ public function PerformSearch(){ $filter_join = $filter['JoinTables'][$type['Key']]; $joins.= "LEFT JOIN \"".$filter_join['Table']."\" ON \"".$type['Table']."\".\"ID\" = \"".$filter_join['Column']."\""; + $joins.= "LEFT JOIN \"".$filter_join['Table']."\" ON \"".$type['Table']."\".\"ID\" = \"".$filter_join['Table']."\".\"".$filter_join['Column']."\""; if (is_array($filter['Value'])){ $ids = ''; @@ -440,6 +441,9 @@ public function PerformSearch(){ $ids = $filter['Value']; } + if ($relations_sql !== ''){ + $relations_sql.= " AND "; + } $relations_sql.= "\"".$filter_join['Table']."\".\"".$filter['Table']."ID\" IN (". $ids .")"; } From 96f134abd447a75083a52e11111b207a87b80fc4 Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 8 Sep 2020 09:19:32 +1200 Subject: [PATCH 02/41] Update naming of package --- composer.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 4cf5edc..09e3cd7 100755 --- a/composer.json +++ b/composer.json @@ -1,8 +1,8 @@ { - "name": "jaedb/search", + "name": "plasticstudio/search", "type": "silverstripe-vendormodule", "description": "SilverStripe search engine", - "homepage": "http://jamesbarnsley.co.nz", + "homepage": "https://psdigital.co.nz", "keywords": ["silverstripe"], "license": "BSD-3-Clause", "authors": [ @@ -13,7 +13,7 @@ } ], "support": { - "issues": "http://github.com/jaedb/search/issues" + "issues": "http://github.com/plasticstudio/search/issues" }, "extra": { "expose": [ diff --git a/package.json b/package.json index a3647d9..231671f 100755 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.1.0", "author": "James Barnsley", "description": "SilverStripe Search Engine", - "repository": "https://github.com/jaedb/search", + "repository": "https://github.com/plasticstudio/search", "licenses": { "type": "Apache License", "url": "http://www.apache.org/licenses/LICENSE-2.0.txt" From 9b560f8f63d2857ccbced7abcd489ffd1c33fdef Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 8 Sep 2020 09:35:55 +1200 Subject: [PATCH 03/41] Update namespacing to plasticstudio --- README.md | 2 +- _config/config.yml | 4 ++-- src/SearchControllerExtension.php | 2 +- src/SearchPage.php | 2 +- src/SearchPageController.php | 8 ++++---- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e506df9..c17adf1 100755 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Name: search Before: - '#site' --- -Jaedb\Search\SearchPageController: +PlasticStudio\Search\SearchPageController: types: docs: Label: 'Documents' diff --git a/_config/config.yml b/_config/config.yml index e3ed9d8..32fd984 100755 --- a/_config/config.yml +++ b/_config/config.yml @@ -5,8 +5,8 @@ Before: --- SilverStripe\Control\Controller: extensions: - - Jaedb\Search\SearchControllerExtension -Jaedb\Search\SearchPageController: + - PlasticStudio\Search\SearchControllerExtension +PlasticStudio\Search\SearchPageController: # types: # docs: # Label: 'Documents' diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 31c5f3f..4e87711 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -1,6 +1,6 @@ get('Jaedb\Search\SearchPageController', 'types'); + $types = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'types'); $array = []; if ($types){ @@ -73,7 +73,7 @@ public static function get_types_available(){ } public static function get_filters_available(){ - $filters = Config::inst()->get('Jaedb\Search\SearchPageController', 'filters'); + $filters = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'filters'); $array = []; if ($filters){ @@ -87,7 +87,7 @@ public static function get_filters_available(){ } public static function get_sorts_available(){ - $sorts = Config::inst()->get('Jaedb\Search\SearchPageController', 'sorts'); + $sorts = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'sorts'); $array = []; if ($sorts){ From 6cc25ad14d29878838a3aa0918e0796a21bd449d Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 8 Sep 2020 10:44:35 +1200 Subject: [PATCH 04/41] Repair sort issue, remove duplicates --- src/SearchPageController.php | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/SearchPageController.php b/src/SearchPageController.php index 2f8b008..f3c30d0 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -22,11 +22,11 @@ class SearchPageController extends PageController { public function index($request){ if (Director::isLive()){ - Requirements::css('/resources/jaedb/search/client/Search.min.css'); - Requirements::javascript('/resources/jaedb/search/client/Search.min.js'); + Requirements::css('/resources/plasticstudio/search/client/Search.min.css'); + Requirements::javascript('/resources/plasticstudio/search/client/Search.min.js'); } else { - Requirements::css('/resources/jaedb/search/client/Search.css'); - Requirements::javascript('/resources/jaedb/search/client/Search.js'); + Requirements::css('/resources/plasticstudio/search/client/Search.css'); + Requirements::javascript('/resources/plasticstudio/search/client/Search.js'); } // get the parameters and variables of this request (ie the query and filters) @@ -327,7 +327,7 @@ public function PerformSearch(){ $tables_to_check[] = $type['Table']; foreach ($tables_to_check as $table_to_check){ - $column_exists_query = DB::query( "SHOW COLUMNS FROM \"".$table_to_check."\" LIKE '".$filter['Column']."'" ); + $column_exists_query = DB::query( "SHOW COLUMNS FROM \"".$table_to_check."\" LIKE '".$filter['Column']."'" ); foreach ($column_exists_query as $column){ $table_with_column = $table_to_check; @@ -426,9 +426,8 @@ public function PerformSearch(){ $filter_join = $filter['JoinTables'][$type['Key']]; - $joins.= "LEFT JOIN \"".$filter_join['Table']."\" ON \"".$type['Table']."\".\"ID\" = \"".$filter_join['Column']."\""; $joins.= "LEFT JOIN \"".$filter_join['Table']."\" ON \"".$type['Table']."\".\"ID\" = \"".$filter_join['Table']."\".\"".$filter_join['Column']."\""; - + if (is_array($filter['Value'])){ $ids = ''; foreach ($filter['Value'] as $id){ @@ -463,7 +462,7 @@ public function PerformSearch(){ $sql.= $where; // Debugging - //echo '

'.$sql.'

'; + //echo '

'.str_replace('"', '`', $sql).'

'; // Eexecutioner enter stage left $results = DB::query($sql); @@ -486,14 +485,18 @@ public function PerformSearch(){ } // Apply sorting - $sort = self::get_mapped_sort()['Sort']; - $sort = str_replace("'", "\'", $sort); - $sort = str_replace('"', '\"', $sort); - $sort = str_replace('`', '\`', $sort); + if(isset(self::get_mapped_sort()['Sort'])){ + $sort = self::get_mapped_sort()['Sort']; + $sort = str_replace("'", "\'", $sort); + $sort = str_replace('"', '\"', $sort); + $sort = str_replace('`', '\`', $sort); + }else{ + $sort = 'Title ASC'; + } $allResults = $allResults->Sort($sort); // Remove duplicates - //$allResults->removeDuplicates('ID'); + $allResults->removeDuplicates('ID'); // load into a paginated list. To change the items per page, set via the template (ie Results.setPageLength(20)) $paginatedItems = PaginatedList::create($allResults, $this->request); From 2ddada933c81f525fffb36f0e27e3e5095de3877 Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 8 Sep 2020 14:39:55 +1200 Subject: [PATCH 05/41] Add extra info --- README.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c17adf1..b31dd02 100755 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ The built-in SilverStripe search form is a very simple search engine. This plugi # Usage * Create a `SearchPage` instance (typically at the root of your website). This page only is used to display results, so please refrain from creating multiple instances. -* Configure your website's `_config/config.yml` to define search parameters. -* Run `dev/build` to instansiate your new configuration +* Configure your website's `_config/config.yml` (or add `_config/search.yml`) to define search parameters. +* Run `dev/build` to instansiate your new configuration. # Configuration @@ -23,15 +23,15 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * `Filters`: a list of filters to apply pre-search (maps to `DataList->Filter(key => value)`) * `Columns`: columns to search for query string matches (format `Table.Column`) * `filters`: associative list of filter options - * `Structure`: defines the filter's relational structure (must be one of `db`, `has_one` or `has_many`) + * `Structure`: defines the filter's relational structure (must be one of `db`, `has_one` or `many_many`) * `Label`: front-end field label * `Table`: relational subject's table * `Column`: column to filter on - * `Operator`: SQL filter operator (ie `>`, `=`) + * `Operator`: SQL filter operator (ie `>`, `<`, `=`) * `JoinTables`: associative list of relationship mappings (use the `key` from the `types` array) * `Table`: relational join table * `Column`: column to join by - * `sorts`: associative list of sort options + * `sorts`: associative list of sort options (if `sorts` are not defined, results will be sorted by default to `Title ASC`) * `Label`: front-end field label * `Sort`: SQL sort string @@ -53,6 +53,7 @@ PlasticStudio\Search\SearchPageController: ClassNameShort: 'File' Filters: File_Live.ShowInSearch: '1' + File_Live.ClassName: '''Silverstripe\\Assets\\File''' # You need to TRIPLE-ESCAPE in order to pass this as a string to the query Columns: ['File_Live.Title','File_Live.Description','File_Live.Name'] pages: Label: 'Pages' @@ -86,6 +87,15 @@ PlasticStudio\Search\SearchPageController: pages: Table: 'Page_Tags' Column: 'PageID' + authors: + Structure: 'many_many' + Label: 'Authors' + ClassName: 'Member' + Table: 'Member' + JoinTables: + pages: + Table: 'Page_Authors' + Column: 'PageID' sorts: title_asc: Label: 'Title (A-Z)' From 54815da42b6e12abe6cb0ad141fca91b034a4f91 Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 8 Sep 2020 15:45:11 +1200 Subject: [PATCH 06/41] Update composer with author details etc --- composer.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 09e3cd7..d7904db 100755 --- a/composer.json +++ b/composer.json @@ -1,15 +1,20 @@ { "name": "plasticstudio/search", "type": "silverstripe-vendormodule", - "description": "SilverStripe search engine", + "description": "Search engine for Silverstripe websites - forked from jaedb/search", "homepage": "https://psdigital.co.nz", - "keywords": ["silverstripe"], + "keywords": ["silverstripe","silverstripesearch"], "license": "BSD-3-Clause", "authors": [ { "name": "James Barnsley", - "homepage": "http://jamesbarnsley.co.nz", + "homepage": "https://jamesbarnsley.co.nz", "email": "james@barnsley.co.nz" + }, + { + "name": "Jeremy Cole", + "homepage": "https://psdigital.co.nz", + "email": "jeremy@psdigital.co.nz" } ], "support": { From 73507a524ce27767f541d6a30bb32dae804c2ae1 Mon Sep 17 00:00:00 2001 From: psdigital Date: Thu, 10 Sep 2020 09:56:26 +1200 Subject: [PATCH 07/41] Add default sorting --- README.md | 3 ++ src/SearchPageController.php | 101 +++++++++++++++++++++++++---------- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index b31dd02..7957188 100755 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * `sorts`: associative list of sort options (if `sorts` are not defined, results will be sorted by default to `Title ASC`) * `Label`: front-end field label * `Sort`: SQL sort string +* `defaults`: Default attributes or settings, as opposed to those submitted through the search form (currently only configured to use `sort`). # Example configuration @@ -109,4 +110,6 @@ PlasticStudio\Search\SearchPageController: published_desc: Label: 'Publish date (oldest first)' Sort: 'DatePublished ASC' + defaults: + sort: 'Title ASC' ``` diff --git a/src/SearchPageController.php b/src/SearchPageController.php index f3c30d0..c3537a7 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -17,6 +17,7 @@ class SearchPageController extends PageController { private static $types; private static $filters; private static $sort; + private static $defaults; private static $results; public function index($request){ @@ -99,6 +100,19 @@ public static function get_sorts_available(){ return $array; } + + public static function get_defaults_available(){ + $defaults = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'defaults'); + $array = []; + + if ($defaults){ + foreach ($defaults as $key => $value){ + $array[$key] = $value; + } + } + + return $array; + } public static function get_types(){ return self::$types; @@ -163,6 +177,10 @@ public static function get_sort(){ return self::$sort; } + public static function set_sort($sort){ + self::$sort = $sort; + } + public static function get_mapped_sort(){ $sorts_available = self::get_sorts_available(); $sort = self::get_sort(); @@ -175,8 +193,24 @@ public static function get_mapped_sort(){ } } - public static function set_sort($sort){ - self::$sort = $sort; + public static function get_defaults(){ + return self::$defaults; + } + + public static function set_defaults($defaults){ + self::$defaults = $defaults; + } + + public static function get_mapped_defaults(){ + $defaults_available = self::get_defaults_available(); + $defaults = self::get_defaults(); + + // If no sort, assume the first item + if (!$defaults){ + return reset($defaults_available); + } else { + return $defaults_available[$defaults]; + } } public static function get_results(){ @@ -401,18 +435,20 @@ public function PerformSearch(){ // join the relationship table to our record(s) $joins.= "LEFT JOIN \"".$filter['Table']."\" ON \"".$filter['Table']."\".\"ID\" = \"".$table_with_column."\".\"".$filter['Column']."\""; - if (is_array($filter['Value'])){ - $ids = ''; - foreach ($filter['Value'] as $id){ - if ($ids != ''){ - $ids.= ','; + if(!empty($filter['Value'])){ + if (is_array($filter['Value'])){ + $ids = ''; + foreach ($filter['Value'] as $id){ + if ($ids != ''){ + $ids.= ','; + } + $ids.= "'".$id."'"; } - $ids.= "'".$id."'"; + } else { + $ids = $filter['Value']; } - } else { - $ids = $filter['Value']; + $where.= ' AND ('."\"".$table_with_column."\".\"".$filter['Column']."\" IN (". $ids .")".')'; } - $where.= ' AND ('."\"".$table_with_column."\".\"".$filter['Column']."\" IN (". $ids .")".')'; break; @@ -427,23 +463,25 @@ public function PerformSearch(){ $filter_join = $filter['JoinTables'][$type['Key']]; $joins.= "LEFT JOIN \"".$filter_join['Table']."\" ON \"".$type['Table']."\".\"ID\" = \"".$filter_join['Table']."\".\"".$filter_join['Column']."\""; - - if (is_array($filter['Value'])){ - $ids = ''; - foreach ($filter['Value'] as $id){ - if ($ids != ''){ - $ids.= ','; + + if(!empty($filter['Value'])){ + if (is_array($filter['Value'])){ + $ids = ''; + foreach ($filter['Value'] as $id){ + if ($ids != ''){ + $ids.= ','; + } + $ids.= "'".$id."'"; } - $ids.= "'".$id."'"; + } else { + $ids = $filter['Value']; } - } else { - $ids = $filter['Value']; - } - if ($relations_sql !== ''){ - $relations_sql.= " AND "; + if ($relations_sql !== ''){ + $relations_sql.= " AND "; + } + $relations_sql.= "\"".$filter_join['Table']."\".\"".$filter['Table']."ID\" IN (". $ids .")"; } - $relations_sql.= "\"".$filter_join['Table']."\".\"".$filter['Table']."ID\" IN (". $ids .")"; } break; @@ -483,17 +521,22 @@ public function PerformSearch(){ $allResults->merge($resultObjects); } } - - // Apply sorting + + $sort = false; + // Sorting applied throug form submission if(isset(self::get_mapped_sort()['Sort'])){ $sort = self::get_mapped_sort()['Sort']; $sort = str_replace("'", "\'", $sort); $sort = str_replace('"', '\"', $sort); $sort = str_replace('`', '\`', $sort); - }else{ - $sort = 'Title ASC'; } - $allResults = $allResults->Sort($sort); + // Default sort defined in config + elseif(isset(self::get_mapped_defaults()['sort'])){ + $sort = self::get_mapped_defaults()['sort']; + } + if($sort){ + $allResults = $allResults->Sort($sort); + } // Remove duplicates $allResults->removeDuplicates('ID'); From 826f718f02f71d52e5d66912a28e2a3885df6aa9 Mon Sep 17 00:00:00 2001 From: psdigital Date: Tue, 15 Sep 2020 11:37:43 +1200 Subject: [PATCH 08/41] Simplify get_mapped_defaults function --- src/SearchPageController.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/SearchPageController.php b/src/SearchPageController.php index c3537a7..6ef1c50 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -202,15 +202,7 @@ public static function set_defaults($defaults){ } public static function get_mapped_defaults(){ - $defaults_available = self::get_defaults_available(); - $defaults = self::get_defaults(); - - // If no sort, assume the first item - if (!$defaults){ - return reset($defaults_available); - } else { - return $defaults_available[$defaults]; - } + return self::get_defaults_available(); } public static function get_results(){ From a211553405cde96868b5880856ff397c84a7c8c6 Mon Sep 17 00:00:00 2001 From: callan-stretton Date: Thu, 1 Oct 2020 15:29:43 +1300 Subject: [PATCH 09/41] changed filtering style from listboxfield to checkboxsetfield --- src/SearchControllerExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 4e87711..bbb8435 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -147,7 +147,7 @@ public function AdvancedSearchForm(){ $source = $source->filter($filter['Filters']); } - $fields->push(ListboxField::create($key, $filter['Label'], $source->map('ID','Title','All'), explode(',',$value))->addExtraClass('chosen-select')); + $fields->push(CheckboxSetField::create($key, $filter['Label'], $source->map('ID','Title','All'), explode(',',$value))->addExtraClass('chosen-select')); break; } From bb9085dce265874db4b43a8c1b34cbb8cbe4e775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Bmma?= Date: Thu, 18 Mar 2021 10:09:29 +1300 Subject: [PATCH 10/41] fix config line not commented out, template folder rename, missing class include --- _config/config.yml | 2 +- src/SearchPage.php | 1 + src/SearchPageController.php | 8 ++++---- .../{Jaedb => PlasticStudio}/Search/Layout/SearchPage.ss | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) rename templates/{Jaedb => PlasticStudio}/Search/Layout/SearchPage.ss (99%) mode change 100755 => 100644 diff --git a/_config/config.yml b/_config/config.yml index 32fd984..2ce2f7f 100755 --- a/_config/config.yml +++ b/_config/config.yml @@ -6,7 +6,7 @@ Before: SilverStripe\Control\Controller: extensions: - PlasticStudio\Search\SearchControllerExtension -PlasticStudio\Search\SearchPageController: +# PlasticStudio\Search\SearchPageController: # types: # docs: # Label: 'Documents' diff --git a/src/SearchPage.php b/src/SearchPage.php index 44d4908..ccef5db 100755 --- a/src/SearchPage.php +++ b/src/SearchPage.php @@ -3,6 +3,7 @@ namespace PlasticStudio\Search; use Page; +use SilverStripe\ORM\DB; class SearchPage extends Page { private static $description = "Search engine and results page. You only need one of these page types."; diff --git a/src/SearchPageController.php b/src/SearchPageController.php index 6ef1c50..800ae76 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -23,11 +23,11 @@ class SearchPageController extends PageController { public function index($request){ if (Director::isLive()){ - Requirements::css('/resources/plasticstudio/search/client/Search.min.css'); - Requirements::javascript('/resources/plasticstudio/search/client/Search.min.js'); + Requirements::css('plasticstudio/search:client/Search.min.css'); + Requirements::javascript('plasticstudio/search:client/Search.min.js'); } else { - Requirements::css('/resources/plasticstudio/search/client/Search.css'); - Requirements::javascript('/resources/plasticstudio/search/client/Search.js'); + Requirements::css('plasticstudio/search:client/Search.css'); + Requirements::javascript('plasticstudio/search:client/Search.js'); } // get the parameters and variables of this request (ie the query and filters) diff --git a/templates/Jaedb/Search/Layout/SearchPage.ss b/templates/PlasticStudio/Search/Layout/SearchPage.ss old mode 100755 new mode 100644 similarity index 99% rename from templates/Jaedb/Search/Layout/SearchPage.ss rename to templates/PlasticStudio/Search/Layout/SearchPage.ss index e596c04..426d767 --- a/templates/Jaedb/Search/Layout/SearchPage.ss +++ b/templates/PlasticStudio/Search/Layout/SearchPage.ss @@ -1,4 +1,3 @@ -
$AdvancedSearchForm From 820d8b0d43158d42fe40bf107eef642fdeb2f917 Mon Sep 17 00:00:00 2001 From: psdigital Date: Thu, 18 Mar 2021 12:36:07 +1300 Subject: [PATCH 11/41] Update requireDefaultRecords for SearchPage --- src/SearchPage.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/SearchPage.php b/src/SearchPage.php index ccef5db..e402e10 100755 --- a/src/SearchPage.php +++ b/src/SearchPage.php @@ -4,22 +4,33 @@ use Page; use SilverStripe\ORM\DB; +use SilverStripe\Versioned\Versioned; class SearchPage extends Page { + private static $description = "Search engine and results page. You only need one of these page types."; + private static $defaults = [ + 'ShowInMenus' => 0, + 'ShowInSearch' => 0 + ]; + /** * We need to have a SearchPage to use it */ - public function requireDefaultRecords() { + public function requireDefaultRecords() + { parent::requireDefaultRecords(); if (static::class == self::class && $this->config()->create_default_pages) { - if (!SearchPage::get()){ + if (count(SearchPage::get()) < 1) { $page = SearchPage::create(); $page->Title = 'Search'; $page->Content = ''; + $page->ShowInMenus = false; + $page->ShowInSearch = false; $page->write(); + $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page->flushCache(); DB::alteration_message('Search page created', 'created'); } From 7d0af075a0c027aefb342db3e6ed1b8dc4e02034 Mon Sep 17 00:00:00 2001 From: psdigital Date: Thu, 18 Mar 2021 14:33:29 +1300 Subject: [PATCH 12/41] filter results list by canView() --- src/SearchPageController.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SearchPageController.php b/src/SearchPageController.php index 800ae76..a272502 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -532,6 +532,11 @@ public function PerformSearch(){ // Remove duplicates $allResults->removeDuplicates('ID'); + + // filter by permission + if($allResults) foreach($allResults as $result) { + if(!$result->canView()) $allResults->remove($result); + } // load into a paginated list. To change the items per page, set via the template (ie Results.setPageLength(20)) $paginatedItems = PaginatedList::create($allResults, $this->request); From 3ff12461ac5642c8c90416148cbf0a3a3f628a00 Mon Sep 17 00:00:00 2001 From: psdigital Date: Thu, 18 Mar 2021 15:54:04 +1300 Subject: [PATCH 13/41] Update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7957188..1acfc8c 100755 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * Create a `SearchPage` instance (typically at the root of your website). This page only is used to display results, so please refrain from creating multiple instances. * Configure your website's `_config/config.yml` (or add `_config/search.yml`) to define search parameters. -* Run `dev/build` to instansiate your new configuration. +* Run `dev/build` to instansiate your new configuration (this will also automatically create an instance of `SearchPage` if one does not exist). +* To overwrite the default `SearchPage` tmeplate, add a template file to your application: `templates/PlasticStudio/Search/Layout/SearchPage.ss` # Configuration From 6b57344227a0055e4ff7c3124f22273e9ce756ff Mon Sep 17 00:00:00 2001 From: psdigital Date: Thu, 25 Mar 2021 16:29:30 +1300 Subject: [PATCH 14/41] Add configurable submit_button_text --- README.md | 2 ++ src/SearchControllerExtension.php | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1acfc8c..46167cf 100755 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * `Label`: front-end field label * `Sort`: SQL sort string * `defaults`: Default attributes or settings, as opposed to those submitted through the search form (currently only configured to use `sort`). +* `submit_button_text`: Text to use on search form submit button (defaults to "Search") # Example configuration @@ -113,4 +114,5 @@ PlasticStudio\Search\SearchPageController: Sort: 'DatePublished ASC' defaults: sort: 'Title ASC' + submit_button_text: 'Go' ``` diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index bbb8435..331cfdc 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -13,6 +13,7 @@ use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\HiddenField; use SilverStripe\View\Requirements; +use SilverStripe\Core\Config\Config; class SearchControllerExtension extends DataExtension { @@ -36,8 +37,12 @@ public function SearchForm(){ $fields->push( TextField::create('query','',SearchPageController::get_query())->addExtraClass('query')->setAttribute('placeholder', 'Keywords') ); // create the form actions (we only need a submit button) + $submit_button_text = 'Search'; + if (Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text')) { + $submit_button_text = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text'); + } $actions = FieldList::create( - FormAction::create("doSearchForm")->setTitle("Search") + FormAction::create("doSearchForm")->setTitle($submit_button_text) ); // now build the actual form object @@ -169,8 +174,12 @@ public function AdvancedSearchForm(){ } // create the form actions (we only need a submit button) + $submit_button_text = 'Search'; + if (Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text')) { + $submit_button_text = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text'); + } $actions = FieldList::create( - FormAction::create("doSearchForm")->setTitle("Search") + FormAction::create("doSearchForm")->setTitle($submit_button_text) ); // now build the actual form object From 2ab6b5ecd68086ff1a1fd18c4b719ceb4b5ea185 Mon Sep 17 00:00:00 2001 From: psdigital Date: Fri, 26 Mar 2021 09:49:14 +1300 Subject: [PATCH 15/41] Update readme around sorts and defaults --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 46167cf..a046736 100755 --- a/README.md +++ b/README.md @@ -32,12 +32,13 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * `JoinTables`: associative list of relationship mappings (use the `key` from the `types` array) * `Table`: relational join table * `Column`: column to join by - * `sorts`: associative list of sort options (if `sorts` are not defined, results will be sorted by default to `Title ASC`) + * `sorts`: associative list of sort options. These are used to popoulate a "Sort by" dropdown field in the Advanced Search Form. Sort order of search results will default to the top item in this list. * `Label`: front-end field label * `Sort`: SQL sort string -* `defaults`: Default attributes or settings, as opposed to those submitted through the search form (currently only configured to use `sort`). * `submit_button_text`: Text to use on search form submit button (defaults to "Search") +TODO: `defaults`: Default attributes or settings, as opposed to those submitted through the search form. + # Example configuration @@ -112,7 +113,8 @@ PlasticStudio\Search\SearchPageController: published_desc: Label: 'Publish date (oldest first)' Sort: 'DatePublished ASC' - defaults: - sort: 'Title ASC' submit_button_text: 'Go' + ## TODO: + ## defaults: + ## sort: 'Title ASC' ``` From 7a177279e2aa85b83b6a193c5fdded0cb92e64aa Mon Sep 17 00:00:00 2001 From: ebakernz Date: Mon, 29 Nov 2021 15:23:21 +1300 Subject: [PATCH 16/41] add config for placeholder text in SearchForm --- src/SearchControllerExtension.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 331cfdc..30f971a 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -33,8 +33,11 @@ public function SearchForm(){ // create our search form fields $fields = FieldList::create(); - // search keywords - $fields->push( TextField::create('query','',SearchPageController::get_query())->addExtraClass('query')->setAttribute('placeholder', 'Keywords') ); + $placeholder_text = 'Keywords'; + if (Config::inst()->get('PlasticStudio\Search\SearchPageController', 'search_form_placeholder_text')) { + $placeholder_text = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'search_form_placeholder_text'); + } + $fields->push( TextField::create('query','',SearchPageController::get_query())->addExtraClass('query')->setAttribute('placeholder', $placeholder_text) ); // create the form actions (we only need a submit button) $submit_button_text = 'Search'; From 2ace9e9eb173eb0129939584df21194185099876 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Mon, 6 Dec 2021 10:38:23 +1300 Subject: [PATCH 17/41] remove security token to stop timeout error --- src/SearchControllerExtension.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 30f971a..2008037 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -54,7 +54,8 @@ public function SearchForm(){ $name = 'SearchForm', $fields = $fields, $actions = $actions - )->addExtraClass('search-form'); + )->addExtraClass('search-form') + ->disableSecurityToken(); return $form; } @@ -191,7 +192,8 @@ public function AdvancedSearchForm(){ $name = 'AdvancedSearchForm', $fields = $fields, $actions = $actions - )->addExtraClass('search-form advanced-search-form'); + )->addExtraClass('search-form advanced-search-form') + ->disableSecurityToken(); return $form; } From 2fbf78357aa29c3d2837a8dc32090cad1dd7d583 Mon Sep 17 00:00:00 2001 From: josephlewisnz Date: Thu, 10 Feb 2022 10:05:11 +1300 Subject: [PATCH 18/41] elemental work --- README.md | 10 ++- _config/config.yml | 5 +- _config/elemental.yml | 9 +++ src/ElementalSearchExtension.php | 23 +++++++ src/SiteTreeSearchExtension.php | 115 +++++++++++++++++++++++++++++++ 5 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 _config/elemental.yml create mode 100644 src/ElementalSearchExtension.php create mode 100644 src/SiteTreeSearchExtension.php diff --git a/README.md b/README.md index a046736..32709b3 100755 --- a/README.md +++ b/README.md @@ -15,6 +15,14 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * To overwrite the default `SearchPage` tmeplate, add a template file to your application: `templates/PlasticStudio/Search/Layout/SearchPage.ss` +# Elemental + +* Elemental search is included +* On page or Element save, all content from all Elements is saved to a field called `ElementalSearchContent` on sitetree. +* Simpley include `'SiteTree_Live.ElementalSearchContent'` to the list of page columns +* Currently there is no way to exclude individual elements from being included. + + # Configuration * `types`: associative list of types to search * `Label`: front-end field label @@ -67,7 +75,7 @@ PlasticStudio\Search\SearchPageController: Filters: SiteTree_Live.ShowInSearch: '1' JoinTables: ['SiteTree_Live'] - Columns: ['SiteTree_Live.Title','SiteTree_Live.MenuTitle','SiteTree_Live.Content'] + Columns: ['SiteTree_Live.Title','SiteTree_Live.MenuTitle','SiteTree_Live.Content', 'SiteTree_Live.ElementalSearchContent'] filters: updated_before: Structure: 'db' diff --git a/_config/config.yml b/_config/config.yml index 2ce2f7f..641ad16 100755 --- a/_config/config.yml +++ b/_config/config.yml @@ -1,11 +1,14 @@ --- -Name: search +Name: ps-search Before: - '#site' --- SilverStripe\Control\Controller: extensions: - PlasticStudio\Search\SearchControllerExtension +SilverStripe\CMS\Model\SiteTree: + extensions: + - PlasticStudio\Search\SiteTreeSearchExtension # PlasticStudio\Search\SearchPageController: # types: # docs: diff --git a/_config/elemental.yml b/_config/elemental.yml new file mode 100644 index 0000000..d44fa5d --- /dev/null +++ b/_config/elemental.yml @@ -0,0 +1,9 @@ +--- +Name: 'ps-search-elemental' +After: '#ps-search' +Only: + moduleexists: 'dnadesign/silverstripe-elemental' +--- +DNADesign\Elemental\Models\BaseElement: + extensions: + - PlasticStudio\Search\ElementalSearchExtension \ No newline at end of file diff --git a/src/ElementalSearchExtension.php b/src/ElementalSearchExtension.php new file mode 100644 index 0000000..481ce9b --- /dev/null +++ b/src/ElementalSearchExtension.php @@ -0,0 +1,23 @@ +getOwner()->getPage(); + if ($parent && $parent->hasExtension(SiteTreeSearchExtension::class)) { + $parent->updateSearchContent(); + } + } +} \ No newline at end of file diff --git a/src/SiteTreeSearchExtension.php b/src/SiteTreeSearchExtension.php new file mode 100644 index 0000000..a874450 --- /dev/null +++ b/src/SiteTreeSearchExtension.php @@ -0,0 +1,115 @@ + 'Text', + ]; + + public function updateCMSFields(FieldList $fields) + { + // $fields->addFieldToTab('Root.test', TextField::create('ElementalSearchContent', 'ElementalSearchContent')); + } + + public function onBeforeWrite() + { + + parent::onBeforeWrite(); + + //generate search content from elements and save to our search field + $this->owner->ElementalSearchContent = $this->collateSearchContent(); + } + + /** + * Trigger page writes so that we trigger the onBefore write + */ + public function updateSearchContent(){ + + //if the page is page is published then make sure it stays published otherwise wrrite draft + if($this->owner->isInDB() && !$this->owner->isOnDraft() && $this->owner->isPublished()){ + $this->owner->write(); + $this->owner->publishSingle(); + } + else{ + $this->owner->write(); + } + } + + /** + * Generate the search content to use for the searchable object + * + * We just retrieve it from the templates. + */ + private function collateSearchContent(): string + { + // Get the page + /** @var SiteTree $page */ + $page = $this->getOwner(); + + $content = ''; + + if (self::isElementalPage($page)) { + // Get the page's elemental content + $content .= $this->collateSearchContentFromElements(); + } + + return $content; + } + + + /** + * @param SiteTree $page + * @return bool + */ + private static function isElementalPage($page) + { + return $page::has_extension("DNADesign\Elemental\Extensions\ElementalPageExtension"); + } + + /** + * @return string|string[]|null + */ + private function collateSearchContentFromElements() + { + // Get the original theme + $originalThemes = SSViewer::get_themes(); + + // Init content + $content = ''; + + try { + // Enable frontend themes in order to correctly render the elements as they would be for the frontend + Config::nest(); + SSViewer::set_themes(SSViewer::config()->get('themes')); + + // Get the elements content + $content .= $this->getOwner()->getElementsForSearch(); + + // Clean up the content + $content = preg_replace('/\s+/', ' ', $content); + + // Return themes back for the CMS + Config::unnest(); + } finally { + // Restore themes + SSViewer::set_themes($originalThemes); + } + + return $content; + } + + +} \ No newline at end of file From ae191cc205b4264a5e3ff482a906875a4d80e51f Mon Sep 17 00:00:00 2001 From: ebakernz Date: Fri, 25 Feb 2022 13:04:35 +1300 Subject: [PATCH 19/41] index task; --- src/IndexPageContentForSearchTask.php | 123 ++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/IndexPageContentForSearchTask.php diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php new file mode 100644 index 0000000..55dc7e8 --- /dev/null +++ b/src/IndexPageContentForSearchTask.php @@ -0,0 +1,123 @@ +filter(['ElementalSearchContent' => NULL])->limit(5); + + //********************************************************************************** + // TODO REMOVE LIMIT WHEN READY FOR LIVE + //********************************************************************************** + + foreach($items as $item) { + + // Debug::show($item->Title); + + // get the page content as plain content string + $content = $this->collateSearchContent($item); + + // Debug::show($content); + + // Update this item in db + $update = SQLUpdate::create(); + $update->setTable('"SiteTree"'); + $update->addWhere(['ID' => $item->ID]); + $update->addAssignments([ + '"ElementalSearchContent"' => $content + ]); + $update->execute(); + + // Debug::show($item->isPublished()); + + // IF page is published, update the live table + if ($item->isPublished()) { + $update = SQLUpdate::create(); + $update->setTable('"SiteTree_Live"'); + $update->addWhere(['ID' => $item->ID]); + $update->addAssignments([ + '"ElementalSearchContent"' => $content + ]); + $update->execute(); + } + } + } + + /** + * Generate the search content to use for the searchable object + * + * We just retrieve it from the templates. + */ + private function collateSearchContent($page): string + { + // Get the page + /** @var SiteTree $page */ + // $page = $this->getOwner(); + + $content = ''; + + if (self::isElementalPage($page)) { + // Get the page's elemental content + $content .= $this->collateSearchContentFromElements($page); + } + + return $content; + } + + + /** + * @param SiteTree $page + * @return bool + */ + private static function isElementalPage($page) + { + return $page::has_extension("DNADesign\Elemental\Extensions\ElementalPageExtension"); + } + + /** + * @return string|string[]|null + */ + private function collateSearchContentFromElements($page) + { + // Get the original theme + $originalThemes = SSViewer::get_themes(); + + // Init content + $content = ''; + + try { + // Enable frontend themes in order to correctly render the elements as they would be for the frontend + Config::nest(); + SSViewer::set_themes(SSViewer::config()->get('themes')); + + // Get the elements content + $content .= $page->getOwner()->getElementsForSearch(); + + // Clean up the content + $content = preg_replace('/\s+/', ' ', $content); + + // Return themes back for the CMS + Config::unnest(); + } finally { + // Restore themes + SSViewer::set_themes($originalThemes); + } + + return $content; + } + +} \ No newline at end of file From 399313744de12fcf65491b033c27827dd1b487f5 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Fri, 25 Feb 2022 13:08:48 +1300 Subject: [PATCH 20/41] fix label --- src/IndexPageContentForSearchTask.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index 55dc7e8..60baa61 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -10,9 +10,9 @@ class IndexPageContentForSearchTask extends BuildTask { - protected $title = 'Collate Page Content Task'; + protected $title = 'Index Page Content for Search'; - protected $description = 'Collate Page Content Task'; + protected $description = 'Collate all page content from elements and save to a field for search.'; public function run($request) { From 7e4365b35b9082ac742132419ce2982d5eb40b4a Mon Sep 17 00:00:00 2001 From: ebakernz Date: Fri, 25 Feb 2022 15:02:17 +1300 Subject: [PATCH 21/41] 404 error pg fix --- src/IndexPageContentForSearchTask.php | 2 +- src/SearchControllerExtension.php | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index 60baa61..a0d6538 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -18,7 +18,7 @@ public function run($request) { // Select all sitetree items without search content - $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL])->limit(5); + $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL])->limit(100); //********************************************************************************** // TODO REMOVE LIMIT WHEN READY FOR LIVE diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 2008037..ae4ff7a 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -44,18 +44,21 @@ public function SearchForm(){ if (Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text')) { $submit_button_text = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text'); } - $actions = FieldList::create( - FormAction::create("doSearchForm")->setTitle($submit_button_text) - ); + // $actions = FieldList::create( + // FormAction::create("doSearchForm")->setTitle($submit_button_text) + // ); // now build the actual form object $form = Form::create( $controller = $this->owner, $name = 'SearchForm', $fields = $fields, - $actions = $actions + // $actions = $actions )->addExtraClass('search-form') ->disableSecurityToken(); + + $page = SearchPage::get()->first(); + $form->setFormAction($page->Link()); return $form; } From a33889370a627b5b5a711ce219e5a3e14184852b Mon Sep 17 00:00:00 2001 From: ebakernz Date: Fri, 25 Feb 2022 15:02:38 +1300 Subject: [PATCH 22/41] 404 error pg fix --- src/SearchControllerExtension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index ae4ff7a..410f730 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -44,6 +44,7 @@ public function SearchForm(){ if (Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text')) { $submit_button_text = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text'); } + // don't do action here, set below for 404 error page fix // $actions = FieldList::create( // FormAction::create("doSearchForm")->setTitle($submit_button_text) // ); From 850d078cf05b332a21fef2b9c616a5144fdc1c35 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Mon, 28 Feb 2022 11:34:59 +1300 Subject: [PATCH 23/41] write to sql updates --- src/SiteTreeSearchExtension.php | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/SiteTreeSearchExtension.php b/src/SiteTreeSearchExtension.php index a874450..b44237d 100644 --- a/src/SiteTreeSearchExtension.php +++ b/src/SiteTreeSearchExtension.php @@ -8,6 +8,8 @@ use SilverStripe\Forms\TextField; use SilverStripe\ORM\DataExtension; use SilverStripe\View\SSViewer; +use SilverStripe\Versioned\Versioned; +use SilverStripe\ORM\Queries\SQLUpdate; class SiteTreeSearchExtension extends DataExtension { @@ -30,7 +32,7 @@ public function onBeforeWrite() parent::onBeforeWrite(); //generate search content from elements and save to our search field - $this->owner->ElementalSearchContent = $this->collateSearchContent(); + $this->collateSearchContent(); } /** @@ -38,13 +40,20 @@ public function onBeforeWrite() */ public function updateSearchContent(){ - //if the page is page is published then make sure it stays published otherwise wrrite draft + $content = $this->collateSearchContent(); + + $update = SQLUpdate::create(); + $update->setTable('"SiteTree"'); + $update->addWhere(['ID' => $this->owner->ID]); + $update->addAssignments([ + '"ElementalSearchContent"' => $content + ]); + $update->execute(); + if($this->owner->isInDB() && !$this->owner->isOnDraft() && $this->owner->isPublished()){ - $this->owner->write(); - $this->owner->publishSingle(); - } - else{ - $this->owner->write(); + + $this->owner->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE, true); + } } From 0e18b52fe0f172d2821af26f5f01d17c4391f81f Mon Sep 17 00:00:00 2001 From: ebakernz Date: Mon, 28 Feb 2022 15:12:57 +1300 Subject: [PATCH 24/41] update task --- src/IndexPageContentForSearchTask.php | 50 +++++++++++++++++---------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index a0d6538..f9ff816 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -17,42 +17,54 @@ class IndexPageContentForSearchTask extends BuildTask public function run($request) { + echo 'Running...
'; + // Select all sitetree items without search content - $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL])->limit(100); + // $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL]); + $items = SiteTree::get()->limit(100); + //********************************************************************************** // TODO REMOVE LIMIT WHEN READY FOR LIVE //********************************************************************************** - foreach($items as $item) { - - // Debug::show($item->Title); - // get the page content as plain content string - $content = $this->collateSearchContent($item); + if(!$items->count()) { + echo 'No items to update.
'; + } else { - // Debug::show($content); + foreach ($items as $item) { + echo $item->Title . '
'; + // Debug::show($item->Title); - // Update this item in db - $update = SQLUpdate::create(); - $update->setTable('"SiteTree"'); - $update->addWhere(['ID' => $item->ID]); - $update->addAssignments([ - '"ElementalSearchContent"' => $content - ]); - $update->execute(); + // get the page content as plain content string + $content = $this->collateSearchContent($item); - // Debug::show($item->isPublished()); + // Debug::show($content); - // IF page is published, update the live table - if ($item->isPublished()) { + // Update this item in db $update = SQLUpdate::create(); - $update->setTable('"SiteTree_Live"'); + $update->setTable('"SiteTree"'); $update->addWhere(['ID' => $item->ID]); $update->addAssignments([ '"ElementalSearchContent"' => $content ]); $update->execute(); + + echo 'Published ' . $item->isPublished() . '
'; + + // IF page is published, update the live table + if ($item->isPublished()) { + $update = SQLUpdate::create(); + $update->setTable('"SiteTree_Live"'); + $update->addWhere(['ID' => $item->ID]); + $update->addAssignments([ + '"ElementalSearchContent"' => $content + ]); + $update->execute(); + } + + echo 'Save to live' . '
'; } } } From be95ac54278c2afc753569c34cafb75acd7a6cec Mon Sep 17 00:00:00 2001 From: ebakernz Date: Mon, 28 Feb 2022 16:44:28 +1300 Subject: [PATCH 25/41] update task --- src/IndexPageContentForSearchTask.php | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index f9ff816..e9ba3a2 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -20,28 +20,17 @@ public function run($request) echo 'Running...
'; // Select all sitetree items without search content - // $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL]); - $items = SiteTree::get()->limit(100); - - - //********************************************************************************** - // TODO REMOVE LIMIT WHEN READY FOR LIVE - //********************************************************************************** - + $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL]); if(!$items->count()) { echo 'No items to update.
'; } else { foreach ($items as $item) { - echo $item->Title . '
'; - // Debug::show($item->Title); - + // get the page content as plain content string $content = $this->collateSearchContent($item); - // Debug::show($content); - // Update this item in db $update = SQLUpdate::create(); $update->setTable('"SiteTree"'); @@ -51,8 +40,6 @@ public function run($request) ]); $update->execute(); - echo 'Published ' . $item->isPublished() . '
'; - // IF page is published, update the live table if ($item->isPublished()) { $update = SQLUpdate::create(); @@ -64,7 +51,7 @@ public function run($request) $update->execute(); } - echo 'Save to live' . '
'; + echo '

Page ' . $item->Title . ' indexed.

' . "/PHP_EOL"; } } } From ed66ee010b086dd37144352f4c258d0b54fc2b37 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 10:17:23 +1300 Subject: [PATCH 26/41] delete elemnet, remove isondraft --- src/ElementalSearchExtension.php | 12 ++++++++++++ src/SiteTreeSearchExtension.php | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/ElementalSearchExtension.php b/src/ElementalSearchExtension.php index 481ce9b..a7dbfbd 100644 --- a/src/ElementalSearchExtension.php +++ b/src/ElementalSearchExtension.php @@ -20,4 +20,16 @@ public function onAfterPublish(&$original) $parent->updateSearchContent(); } } + + /** + * Force a re-index of the parent page on archive of element + * @param Versioned $original + */ + public function onAfterDelete(&$original) + { + $parent = $this->getOwner()->getPage(); + if ($parent && $parent->hasExtension(SiteTreeSearchExtension::class)) { + $parent->updateSearchContent(); + } + } } \ No newline at end of file diff --git a/src/SiteTreeSearchExtension.php b/src/SiteTreeSearchExtension.php index b44237d..74e839c 100644 --- a/src/SiteTreeSearchExtension.php +++ b/src/SiteTreeSearchExtension.php @@ -50,10 +50,10 @@ public function updateSearchContent(){ ]); $update->execute(); - if($this->owner->isInDB() && !$this->owner->isOnDraft() && $this->owner->isPublished()){ + if($this->owner->isInDB() && $this->owner->isPublished()){ $this->owner->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE, true); - + } } From 149ab714590aa4e6c1080ab90b7b294e9f3435a9 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 10:25:32 +1300 Subject: [PATCH 27/41] add option to reindex all search content --- src/IndexPageContentForSearchTask.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index e9ba3a2..1c226fe 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -17,10 +17,15 @@ class IndexPageContentForSearchTask extends BuildTask public function run($request) { - echo 'Running...
'; - - // Select all sitetree items without search content - $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL]); + if($request->getVar('reindex') == 'true') { + echo 'Running - reindex all...
'; + // select all sitetree items + $items = SiteTree::get(); + } else { + // Select all sitetree items without search content + $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL]); + echo 'Running - index where ElementalSearchContent is NULL...
'; + } if(!$items->count()) { echo 'No items to update.
'; From bb7979ef9ceb2c947d998bd2eaca054abb555276 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 11:22:24 +1300 Subject: [PATCH 28/41] update description --- src/IndexPageContentForSearchTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index 1c226fe..c9f314d 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -12,7 +12,7 @@ class IndexPageContentForSearchTask extends BuildTask { protected $title = 'Index Page Content for Search'; - protected $description = 'Collate all page content from elements and save to a field for search.'; + protected $description = 'Collate all page content from elements and save to a field for search. Add optional query string, "reindex=true" to reindex all pages.'; public function run($request) { From 9c9c295d8a2f804cc26b781fd7a6bce75771b17c Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 12:03:37 +1300 Subject: [PATCH 29/41] add limit for task --- src/IndexPageContentForSearchTask.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index c9f314d..56a1b6c 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -16,15 +16,28 @@ class IndexPageContentForSearchTask extends BuildTask public function run($request) { + $reindex = $request->getVar('reindex'); + $offset = $request->getVar('offset'); + $limit = $request->getVar('limit'); - if($request->getVar('reindex') == 'true') { + if($reindex == 'true') { echo 'Running - reindex all...
'; // select all sitetree items $items = SiteTree::get(); - } else { + + } + + if($offset && $limit) { + $items = SiteTree::get()->limit($limit, $offset); + echo 'Running - partial: ' . $offset . ' to ' . $limit . '...
'; + + } + + if($request->getVars() == null) { // Select all sitetree items without search content - $items = SiteTree::get()->filter(['ElementalSearchContent' => NULL]); + $items = SiteTree::get()->filter(['ElementalSearchContent' => null]); echo 'Running - index where ElementalSearchContent is NULL...
'; + } if(!$items->count()) { From 06273266a103bb6f226017819f356a73cf30ad25 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 12:10:01 +1300 Subject: [PATCH 30/41] update eol --- src/IndexPageContentForSearchTask.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index 56a1b6c..b236844 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -69,7 +69,7 @@ public function run($request) $update->execute(); } - echo '

Page ' . $item->Title . ' indexed.

' . "/PHP_EOL"; + echo '

Page ' . $item->Title . ' indexed.

' . PHP_EOL; } } } From 795b3c8d220eaad44714e19b1cb7770ad71b04e1 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 12:51:17 +1300 Subject: [PATCH 31/41] limit --- src/IndexPageContentForSearchTask.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index b236844..2f3585e 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -27,9 +27,15 @@ public function run($request) } - if($offset && $limit) { + if($limit && !$offset) { + $items = SiteTree::get()->limit($limit); + echo 'Running - partial: limit to ' . $limit . '...
'; + + } + + if($limit && $offset) { $items = SiteTree::get()->limit($limit, $offset); - echo 'Running - partial: ' . $offset . ' to ' . $limit . '...
'; + echo 'Running - partial: offset ' . $offset . ' limit ' . $limit . '...
'; } From 40999c1636faef23e347a53b01df6b1f9c98d283 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Tue, 1 Mar 2022 13:20:29 +1300 Subject: [PATCH 32/41] change task --- src/IndexPageContentForSearchTask.php | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index 2f3585e..ab551a5 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -20,31 +20,33 @@ public function run($request) $offset = $request->getVar('offset'); $limit = $request->getVar('limit'); - if($reindex == 'true') { - echo 'Running - reindex all...
'; - // select all sitetree items - $items = SiteTree::get(); + // select all sitetree items + $items = SiteTree::get(); + echo 'Running...
'; + if($reindex != 'true') { + $items->filter(['ElementalSearchContent' => null]); + echo 'Running - index where ElementalSearchContent is NULL...
'; } if($limit && !$offset) { - $items = SiteTree::get()->limit($limit); + $items->limit($limit); echo 'Running - partial: limit to ' . $limit . '...
'; } if($limit && $offset) { - $items = SiteTree::get()->limit($limit, $offset); + $items->limit($limit, $offset); echo 'Running - partial: offset ' . $offset . ' limit ' . $limit . '...
'; } - if($request->getVars() == null) { - // Select all sitetree items without search content - $items = SiteTree::get()->filter(['ElementalSearchContent' => null]); - echo 'Running - index where ElementalSearchContent is NULL...
'; + // if($request->getVars() == null) { + // // Select all sitetree items without search content + // $items = SiteTree::get()->filter(['ElementalSearchContent' => null]); + - } + // } if(!$items->count()) { echo 'No items to update.
'; From 4a98210d0ebf327de38435d69159814f2ea84da6 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Wed, 2 Mar 2022 10:15:06 +1300 Subject: [PATCH 33/41] task update --- src/IndexPageContentForSearchTask.php | 34 +++++++-------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/src/IndexPageContentForSearchTask.php b/src/IndexPageContentForSearchTask.php index ab551a5..fde4af4 100644 --- a/src/IndexPageContentForSearchTask.php +++ b/src/IndexPageContentForSearchTask.php @@ -17,36 +17,20 @@ class IndexPageContentForSearchTask extends BuildTask public function run($request) { $reindex = $request->getVar('reindex'); - $offset = $request->getVar('offset'); - $limit = $request->getVar('limit'); + $offset = $request->getVar('offset') ? $request->getVar('offset') : NULL; + $limit = $request->getVar('limit') ? $request->getVar('limit') : 10; // select all sitetree items - $items = SiteTree::get(); + $items = SiteTree::get()->limit($limit, $offset); echo 'Running...
'; + echo 'limit: ' . $limit . '
'; + echo 'offset: ' . $offset . '
'; + // echo 'count ' . $items->Count(). '
'; - if($reindex != 'true') { - $items->filter(['ElementalSearchContent' => null]); - echo 'Running - index where ElementalSearchContent is NULL...
'; + if(!$reindex) { + $items = $items->filter(['ElementalSearchContent' => null]); + echo 'Running - generating first index...
'; } - - if($limit && !$offset) { - $items->limit($limit); - echo 'Running - partial: limit to ' . $limit . '...
'; - - } - - if($limit && $offset) { - $items->limit($limit, $offset); - echo 'Running - partial: offset ' . $offset . ' limit ' . $limit . '...
'; - - } - - // if($request->getVars() == null) { - // // Select all sitetree items without search content - // $items = SiteTree::get()->filter(['ElementalSearchContent' => null]); - - - // } if(!$items->count()) { echo 'No items to update.
'; From 95fdd8826edbe4c42c619b53c3072532d80484b1 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Fri, 11 Mar 2022 11:04:02 +1300 Subject: [PATCH 34/41] form action url working --- src/SearchControllerExtension.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 410f730..01fa63e 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -13,6 +13,7 @@ use SilverStripe\Forms\DropdownField; use SilverStripe\Forms\HiddenField; use SilverStripe\View\Requirements; +use SilverStripe\Control\Controller; use SilverStripe\Core\Config\Config; class SearchControllerExtension extends DataExtension { @@ -59,6 +60,21 @@ public function SearchForm(){ ->disableSecurityToken(); $page = SearchPage::get()->first(); + + $link = Controller::join_links( + $page->Link(), + SearchPageController::get_query() + + + // $school->URLSegment, + // $aoi->URLSegment, + // $this->URLSegment, + // '/' + ); + + echo $link; + die(); + $form->setFormAction($page->Link()); return $form; From 48fa76f3543b8cd30eb2c75c59490a06b901790d Mon Sep 17 00:00:00 2001 From: ebakernz Date: Wed, 16 Mar 2022 09:26:08 +1300 Subject: [PATCH 35/41] revert 404 form action fix --- src/SearchControllerExtension.php | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 01fa63e..7a2797f 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -46,9 +46,10 @@ public function SearchForm(){ $submit_button_text = Config::inst()->get('PlasticStudio\Search\SearchPageController', 'submit_button_text'); } // don't do action here, set below for 404 error page fix - // $actions = FieldList::create( - // FormAction::create("doSearchForm")->setTitle($submit_button_text) - // ); + // fix breaks pagination, reinstating + $actions = FieldList::create( + FormAction::create("doSearchForm")->setTitle($submit_button_text) + ); // now build the actual form object $form = Form::create( @@ -59,23 +60,8 @@ public function SearchForm(){ )->addExtraClass('search-form') ->disableSecurityToken(); - $page = SearchPage::get()->first(); - - $link = Controller::join_links( - $page->Link(), - SearchPageController::get_query() - - - // $school->URLSegment, - // $aoi->URLSegment, - // $this->URLSegment, - // '/' - ); - - echo $link; - die(); - - $form->setFormAction($page->Link()); + // $page = SearchPage::get()->first(); + // $form->setFormAction($page->Link()); return $form; } From 9f5917be79abc4a18bc523a40ff7893feb0477e0 Mon Sep 17 00:00:00 2001 From: ebakernz Date: Wed, 16 Mar 2022 09:36:20 +1300 Subject: [PATCH 36/41] form action --- src/SearchControllerExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 7a2797f..35a91a7 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -56,7 +56,7 @@ public function SearchForm(){ $controller = $this->owner, $name = 'SearchForm', $fields = $fields, - // $actions = $actions + $actions = $actions )->addExtraClass('search-form') ->disableSecurityToken(); From e0cd8acf01ab46cec2b32d7b48bb2dd96671f61a Mon Sep 17 00:00:00 2001 From: ebakernz Date: Fri, 25 Mar 2022 08:43:38 +1300 Subject: [PATCH 37/41] update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 32709b3..53ef71a 100755 --- a/README.md +++ b/README.md @@ -19,8 +19,9 @@ The built-in SilverStripe search form is a very simple search engine. This plugi * Elemental search is included * On page or Element save, all content from all Elements is saved to a field called `ElementalSearchContent` on sitetree. -* Simpley include `'SiteTree_Live.ElementalSearchContent'` to the list of page columns +* Simply include `'SiteTree_Live.ElementalSearchContent'` to the list of page columns * Currently there is no way to exclude individual elements from being included. +* Run IndexPageContentForSearchTask to index element content # Configuration From af054e20b53fa538b90c96e7d599c2e5f2168d0a Mon Sep 17 00:00:00 2001 From: josephlewisnz <57464168+josephlewisnz@users.noreply.github.com> Date: Tue, 10 May 2022 13:40:14 +1200 Subject: [PATCH 38/41] Feature/double draft bug (#17) * fixed versioned bug in indexing * tweak to params in extension * updated live parent page var * showing for debugging on uat * hide indexed --- src/ElementalSearchExtension.php | 23 +++++++++++++++++------ src/SiteTreeSearchExtension.php | 29 +++++++++++------------------ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/ElementalSearchExtension.php b/src/ElementalSearchExtension.php index a7dbfbd..9a78457 100644 --- a/src/ElementalSearchExtension.php +++ b/src/ElementalSearchExtension.php @@ -15,10 +15,7 @@ class ElementalSearchExtension extends Extension */ public function onAfterPublish(&$original) { - $parent = $this->getOwner()->getPage(); - if ($parent && $parent->hasExtension(SiteTreeSearchExtension::class)) { - $parent->updateSearchContent(); - } + $this->updateSearchContent(); } /** @@ -26,10 +23,24 @@ public function onAfterPublish(&$original) * @param Versioned $original */ public function onAfterDelete(&$original) + { + $this->updateSearchContent(); + } + /** + * Force a re-index of the parent page on un-publish of element + */ + public function onAfterUnpublish() + { + $this->updateSearchContent(); + } + + public function updateSearchContent() { $parent = $this->getOwner()->getPage(); - if ($parent && $parent->hasExtension(SiteTreeSearchExtension::class)) { - $parent->updateSearchContent(); + //Even though we have the parent page. Lets always get the "live" version. This is so when we update the search content we are not indexing draft/unpublished content + $liveParentPage = Versioned::get_by_stage($parent->ClassName, Versioned::LIVE)->byID($parent->ID); + if ($liveParentPage && $liveParentPage->hasExtension(SiteTreeSearchExtension::class)) { + $liveParentPage->updateSearchContent(); } } } \ No newline at end of file diff --git a/src/SiteTreeSearchExtension.php b/src/SiteTreeSearchExtension.php index 74e839c..73411c4 100644 --- a/src/SiteTreeSearchExtension.php +++ b/src/SiteTreeSearchExtension.php @@ -26,20 +26,11 @@ public function updateCMSFields(FieldList $fields) // $fields->addFieldToTab('Root.test', TextField::create('ElementalSearchContent', 'ElementalSearchContent')); } - public function onBeforeWrite() - { - - parent::onBeforeWrite(); - - //generate search content from elements and save to our search field - $this->collateSearchContent(); - } - /** * Trigger page writes so that we trigger the onBefore write */ - public function updateSearchContent(){ - + public function updateSearchContent() + { $content = $this->collateSearchContent(); $update = SQLUpdate::create(); @@ -50,10 +41,14 @@ public function updateSearchContent(){ ]); $update->execute(); - if($this->owner->isInDB() && $this->owner->isPublished()){ - - $this->owner->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE, true); - + if ($this->owner->isInDB() && $this->owner->isPublished()) { + $update = SQLUpdate::create(); + $update->setTable('"SiteTree_Live"'); + $update->addWhere(['ID' => $this->owner->ID]); + $update->addAssignments([ + '"ElementalSearchContent"' => $content + ]); + $update->execute(); } } @@ -119,6 +114,4 @@ private function collateSearchContentFromElements() return $content; } - - -} \ No newline at end of file +} From fbfd26c94f6b4c03a64614bcf28089393e994bfb Mon Sep 17 00:00:00 2001 From: ebakernz Date: Thu, 15 Sep 2022 12:49:22 +1200 Subject: [PATCH 39/41] php 8 fixes --- src/SearchControllerExtension.php | 7 ++++++- src/SearchPageController.php | 10 ++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/SearchControllerExtension.php b/src/SearchControllerExtension.php index 30f971a..0a9f495 100755 --- a/src/SearchControllerExtension.php +++ b/src/SearchControllerExtension.php @@ -155,7 +155,12 @@ public function AdvancedSearchForm(){ $source = $source->filter($filter['Filters']); } - $fields->push(CheckboxSetField::create($key, $filter['Label'], $source->map('ID','Title','All'), explode(',',$value))->addExtraClass('chosen-select')); + if ($value == null) { + $default = ''; + } else { + $default = explode(',', $value); + } + $fields->push(CheckboxSetField::create($key, $filter['Label'], $source->map('ID','Title','All'), $default)->addExtraClass('chosen-select')); break; } diff --git a/src/SearchPageController.php b/src/SearchPageController.php index a272502..688e6e7 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -161,10 +161,12 @@ public static function get_mapped_filters(){ public static function get_query($mysqlSafe = false){ $query = self::$query; - if( $mysqlSafe ){ - $query = str_replace("'", "\'", $query); - $query = str_replace('"', '\"', $query); - $query = str_replace('`', '\`', $query); + if ($query) { + if ($mysqlSafe) { + $query = str_replace("'", "\'", $query); + $query = str_replace('"', '\"', $query); + $query = str_replace('`', '\`', $query); + } } return $query; } From ef360c83afc0d25ea2a54c6d5c8d7ee636e13b94 Mon Sep 17 00:00:00 2001 From: Kieffer Navarro Date: Wed, 9 Nov 2022 10:09:37 +0800 Subject: [PATCH 40/41] php8 fix for str replace --- src/SearchPageController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SearchPageController.php b/src/SearchPageController.php index 688e6e7..65d6f80 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -163,9 +163,9 @@ public static function get_query($mysqlSafe = false){ $query = self::$query; if ($query) { if ($mysqlSafe) { - $query = str_replace("'", "\'", $query); - $query = str_replace('"', '\"', $query); - $query = str_replace('`', '\`', $query); + $query = str_replace("'", "\'", $query ?? ''); + $query = str_replace('"', '\"', $query ?? ''); + $query = str_replace('`', '\`', $query ?? ''); } } return $query; From b85abd5dad0b2e44612b099f664671ab69f9baf5 Mon Sep 17 00:00:00 2001 From: Kieffer Navarro Date: Thu, 10 Nov 2022 04:29:19 +0800 Subject: [PATCH 41/41] peer review code fix --- src/SearchPageController.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SearchPageController.php b/src/SearchPageController.php index 65d6f80..c7491c4 100755 --- a/src/SearchPageController.php +++ b/src/SearchPageController.php @@ -160,12 +160,12 @@ public static function get_mapped_filters(){ } public static function get_query($mysqlSafe = false){ - $query = self::$query; + $query = self::$query ?? ''; if ($query) { if ($mysqlSafe) { - $query = str_replace("'", "\'", $query ?? ''); - $query = str_replace('"', '\"', $query ?? ''); - $query = str_replace('`', '\`', $query ?? ''); + $query = str_replace("'", "\'", $query); + $query = str_replace('"', '\"', $query); + $query = str_replace('`', '\`', $query); } } return $query;