pixelpoems / silverstripe-search
Silverstripe Search-模块包括加载搜索结果js API请求。
Requires
- php: >=7.4
- silverstripe/cms: ^4
- silverstripe/framework: ^4.0
- silverstripe/vendor-plugin: ^1.0
Requires (Dev)
- phpunit/phpunit: ^5.7
This package is auto-updated.
Last update: 2024-09-21 10:27:27 UTC
README
此模块提供了一种使用ajax和可配置索引的silverstripe搜索。您可以使用它与Silverstripe Elemental 和 Fluent 结合使用。有关Elemental和Fluent配置,请参阅以下指定文档。
需求
- Silverstripe CMS >=4.0
- Silverstripe 框架 >=4.0
- 版本化管理 >=1.0
安装
composer require pixelpoems/silverstripe-search
此模块包括
填充搜索任务
- 创建或更新搜索索引的任务搜索页面
- 独立的搜索页面内联搜索
- 模板包含
配置
在没有特殊配置的情况下,所有已勾选“显示在搜索中”复选框的页面及其子类都将被索引。对于索引,您必须运行PopulateSearch
任务(更多信息: 填充任务)。
以下变量可用于配置您的搜索索引
Pixelpoems\Search\Services\SearchConfig: index_keys: # Default keys witch will be populated within the json index file - title # Title will be added by default if nothing else is defined - content # Additional index key
这些键仅用于在索引中分隔数据(更多或更少地用于您自己的结构 - 这些键不会在搜索结果中显示!搜索根据键优先考虑内容 - 在这种情况下,title
具有最高优先级,因此也首先显示在结果中。
默认情况下,您的索引文件名为index.json
,将放置在项目根目录下的/search/
中。将/search
添加到您的.gitignore
中,以防止索引文件被推送到您的git仓库。
要基于类更新或设置索引键,可以扩展该类并使用以下方法设置值。如果您在这里设置额外的值,它们不会被js逻辑注意到。只有预定义的键会被识别。$data
将包含所有预配置的键。
public function updateSearchIndexData(array &$data) { $data['content'] = $this->owner->Content; }
例如,在一个新的PageType上更新数据而不扩展,您可以在您的新的Page Type中添加以下函数,其中包含您要索引的自定义列表
public function getList() { return DataObject::get(); } public function addSearchData($data) { $tags[] = $this->getList()->map()->values(); // Make sure other tags do not get overwritten by this function if($data['tags']) $data['tags'] = array_merge($data['tags'], $tags); else $data['tags'] = $tags; return $data; }
要添加多个值,例如标签或类似的东西,您可以这样做
public function addSearchData($data) { $tags = []; // Add Name of an HasOne relation if($this->HasOneID) { $tags[] = $this->HasOne()->Name; } // Add Names of an HasMany relations if($this->HasMany()->exists()) { foreach ($this->HasMany() as $item) { $tags[] = $item->Name; } } // Make sure other tags do not get overwritten by this function if($data['tags']) $data['tags'] = array_merge($data['tags'], $tags); else $data['tags'] = $tags; return $data; }
您可以使用SearchService::escapeHTML($string)
函数在将内容添加到索引之前对其进行转义。
填充任务
要创建或更新搜索索引,请使用“搜索填充”任务
/dev/tasks/search-populate
php vendor/silverstripe/framework/cli-script.php dev/tasks/search-populate
此任务将根据您的配置创建一个index.json
和一个index-elemental.json
(如果启用了elemental)或locale.json
和locale-elemental.json
(如果启用了fluent)。
您可以扩展搜索填充并添加额外的数据,如下所示
Pixelpoems\Search\Services\PopulateService: extensions: - Namespace\PopulateSearchExtension
public function populateAdditionalData($pageIndexFileName, $locale, &$additionalData) { $dataObjects = ClassInfo::subclassesFor(DataObject::class); foreach ($dataObjects as $dataObject) { $additionalData = $this->owner->getData($dataObject, $locale); $this->owner->log('Data Entities (DataObject / '. $dataObject . '): ' . count($additionalData)); // Add your additional data to the given array to return this data! $additionalData = array_merge($additionalData, $additionalData); } $this->owner->log($pageIndexFileName . "\n"); }
您的数据将被保存在index.json
或locale.json
中
注意:确保您的DataObject具有Link函数,以便可以在搜索结果中链接它。
如果您想在没有DataObject的情况下填充自定义数据,您可以在您的自定义数组中添加一个“link”键。
public function populateAdditionalData($pageIndexFileName, $locale, &$additionalData) { $additionalData[] = [ 'title' => 'Title', 'id' => 123456789, # Make sure to add an identifier here 'content' => 'Content', 'link' => '/link-to-your-site', ]; $this->owner->log($pageIndexFileName . "\n"); }
这将根据您的上下文生成一个自定义数组数据 - 在理想情况下,该数组包含键 id
、link
和您定义的 index_keys
。
覆盖模板文件
要覆盖默认的搜索模板,您可以在项目的模板中创建一个 Pixelpoems/Search
文件夹。
Pixelpoems/Search/Ajax/SearchResultList.ss
用于渲染搜索结果。Pixelpoems/Search/Includes/InlineSearch.ss
用于内联搜索输出。Pixelpoems/Search/Pages/Layout/SearchPage.ss
用于您的自定义搜索页面。
注意:如果您覆盖了模板,请确保模板中包含了所需的js文件,或者将通过控制器包含它们,并且CSS类和ID也在其中。请确保内联搜索被包裹在一个具有类 search-holder inline-search-holder
的元素中,并在搜索页面模板中包含 search-holder
类!
如果您需要在 Pixelpoems/Search/Ajax/SearchResultList.ss
模板中添加额外的变量,您可以扩展 Pixelpoems/Search/Controllers/SearchController
并使用以下钩子更新数据
public function updateAjaxTemplateData(&$data) { $additionalList = ArrayList::create(); $data['AdditionalBool'] = true; $data['AdditionalList'] = $additionalList }
在此处添加的所有变量都可以在您的自定义 Ajax/SerachList.ss
中访问。
内联搜索
此模块包含一个内联搜索。内联搜索列表将显示最多十个搜索结果和一个“查看更多...”项,该项可导航到显示所有搜索结果列表的搜索页面。
在您的模板中包含 InlineSearch 模板
<% include Pixelpoems\Search\Includes\InlineSearch %>
在DataObjects上启用搜索
如果您想添加 DataObject 的数据,可以像在 配置 部分描述的那样添加文本,索引一个页面或一个元素。您可以在单个页面的索引过程中添加例如 title
和 content
,以及其他所有对象。
public function addSearchData($data) { $data = []; foreach (DataObject::get() as $dataObject) { $data[] = $dataObject->Title . ' '. $dataObject->Content; } $data['dataObjects'] = implode(' ', $data); return $data; }
配置以启用Elemental
要启用元素索引,请将以下内容添加到您的配置 yml 中
Pixelpoems\Search\Services\SearchConfig: enable_elemental: true
此外,您可以使用 exclude_elements_from_index
防止索引特定的元素类
Pixelpoems\Search\Services\SearchConfig: exclude_elements_from_index: - Namespace\Elements\Element
并将 SearchIndexExtension
添加到 Base Element Model
DNADesign\Elemental\Models\BaseElement: extensions: - Pixelpoems\Search\Extensions\SearchIndexExtension
添加扩展后,您可以使用 updateSearchIndexData
钩子来指定索引数据。
启用虚拟元素索引
如果您使用 DNADesign 的虚拟元素并希望索引该元素的关联数据,可以将以下扩展添加到基类 "ElementVirtual",这将处理使用“链接元素”数据的默认索引。
DNADesign\ElementalVirtual\Model\ElementVirtual: extensions: - Pixelpoems\Search\Extensions\ElementVirtualExtension
配置以启用Fluent
要在内联和搜索过程中启用流畅,请将以下内容添加到您的配置 yml 中
Pixelpoems\Search\Services\SearchConfig: enable_fluent: true
如果您通过配置启用了 fluent,则 Populate Search Task
将为每个区域创建一个索引文件。要防止索引一个区域,您可以将区域标题添加到静态变量 exclude_locale_from_index
中,如下所示
Pixelpoems\Search\Services\SearchConfig: exclude_locale_from_index: - 'de_AT' - 'de_DE'
默认情况下,您的索引文件名为 {locale}.json
,例如 de_AT.json
。
修改搜索结果
在将生成的列表发送到模板之前,有多个钩子可以修改搜索结果
向 SearchService 添加扩展
Pixelpoems\Search\Services\SearchService: extensions: - Namespace\Extensions\SearchServiceExtension
在限制结果之前修改列表
例如,使用钩子 updateSearchResultBeforeLimit
过滤特定 Mulitsite 的结果,如果您使用的是例如 https://github.com/symbiote/silverstripe-multisites
public function updateSearchResultBeforeLimit(&$list): void { $currentSiteID = Multisites::inst()->getCurrentSiteId(); $list = $list->filter(['SiteID' => $currentSiteID]); }
列表的限制(对于内联搜索)将在钩子之后添加。
在限制结果之后修改列表
例如,使用钩子 updateSearchResultAfterLimit
在将限制添加到列表后过滤结果。
public function updateSearchResultAfterLimit(&$list): void { // Do some extra filter or attachment here }
此钩子只会在由内联搜索发起的请求上调用!如果您想在内联搜索的限制之后修改结果,并且在使用搜索页面时也修改结果,请使用钩子 updateSearchResult
public function updateSearchResult(&$list): void { // Do some extra filter or attachment here }
可用配置变量
每个配置都可以通过 Pixelpoems\Search\Services\SearchConfig
类来实现
--- Name: my-search-config --- Pixelpoems\Search\Services\SearchConfig: enable_default_style: false # Disables default styles index_keys: - title - content enable_fluent: true exclude_locale_from_index: - 'de_AT' - 'de_DE' enable_elemental: true exclude_elements_from_index: - 'Namespace\Elements\Element' max_results_inline: 10
报告问题
请为任何您发现的错误或缺少的功能 创建一个 issue。
致谢
搜索和关闭图标来自 Feather Icons - https://feathericons.com/