pixelpoems/silverstripe-search

Silverstripe Search-模块包括加载搜索结果js API请求。

安装: 161

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:silverstripe-vendormodule

1.0.3 2023-09-04 07:26 UTC

This package is auto-updated.

Last update: 2024-09-21 10:27:27 UTC


README

stability-beta

此模块提供了一种使用ajax和可配置索引的silverstripe搜索。您可以使用它与Silverstripe ElementalFluent 结合使用。有关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.jsonlocale-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.jsonlocale.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");
}

这将根据您的上下文生成一个自定义数组数据 - 在理想情况下,该数组包含键 idlink 和您定义的 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 的数据,可以像在 配置 部分描述的那样添加文本,索引一个页面或一个元素。您可以在单个页面的索引过程中添加例如 titlecontent,以及其他所有对象。

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/