directlease/silverstripe-algolia-page-sync-module

一个基于配置将页面同步到Algolia索引的模块

0.9.1 2023-05-08 12:01 UTC

README

本模块通过SilverStripe的BuildTask将页面同步到Algolia,并跟踪SiteTree以只同步更改。它使用内置的SilverStripe "ShowInSearch"来确定页面是否需要同步。

工作原理

通过任务和某些ORM对象,可以管理SiteTree和Algolia的状态。PageAlgoliaExtension在Page类上挂钩以跟踪已删除的页面。创建了3个ORM对象以跟踪状态

  • DeletedPageAlgoliaObjectIDHolder中的已删除页面
  • PageAlgoliaObjectIDHolder中的已同步页面
  • AlgoliaSyncLog中的最后同步日期,这还包含一些来自同步任务的有用信息

现在可以同步三种条件:添加、删除和更新的页面。AlgoliaIndexTask负责此操作。如果您想每12小时更新一次Algolia索引的搜索结果,可以每12小时调度此任务。任务提供了fullsync参数以进行完全同步(而不是仅处理更改)。

通过配置可以添加要同步到Algolia索引的字段/图片URL。

如果您使用Fluent,可以添加本地化数据。通过配置,可以添加要在本地对象中添加到Algolia对象的字段/图片URL。这使得可以使用带有搜索属性的Algolia搜索。例如,您可以添加搜索属性:Locales.nl_NL,该对象将包含数据。Algolia足够智能,可以包含该对象中的所有变量。

它将记录到SilverStripe.log(根据配置)并在数据库中创建一个记录,任务成功运行后。有关silverstripe日志的更多信息:[https://docs.silverstripe.org/en/4/developer_guides/debugging/error_handling/](https://docs.silverstripe.org/en/4/developer_guides/debugging/error_handling/)

要求

  • SilverStripe ^4.0

Fluent支持

安装

composer require directlease/silverstripe-algolia-page-sync-module

许可证

请参阅许可证

如何运行

如果尚未运行同步,将发生完全同步。您可以为此任务安排任何给定时间间隔以保持Algolia数据最新。

通过浏览器

仅推送更改的同步

https://mysite.nl/dev/tasks/AlgoliaSyncModuleDirectLease-AlgoliaIndexTask # A sync that only pushes the changes

完全同步

https://mysite.nl/dev/tasks/AlgoliaSyncModuleDirectLease-AlgoliaIndexTask?fullsync=1 # For a full sync

通过终端

仅推送更改的同步

php vendor/silverstripe/framework/cli-script.php /dev/tasks/AlgoliaSyncModuleDirectLease-AlgoliaIndexTask

完全同步

php vendor/silverstripe/framework/cli-script.php /dev/tasks/AlgoliaSyncModuleDirectLease-AlgoliaIndexTask fullsync=1

配置

通过配置,将在Page类上设置一个扩展。这将添加一个onBeforeDelete操作以跟踪已删除/未发布的页面。通过配置,可以添加要同步到Algolia的字段。如果字段或图片存在于页面上,无论页面类型如何,都会添加。

将添加的默认值是

  • 标题
  • 菜单标题
  • 页面类
  • URL

可以添加自己的DBFields/函数,用于本地化或非本地化字段。如果DataObject与该图像有关联关系,还可以添加本地化或非本地化的图像。如果您想通过方法返回自己的数据,也可以将其添加到字段配置中(例如:通过名为getMyAwesomeCustomLogic的方法)。

AlgoliaSyncFieldsLocalised & AlgoliaSyncFieldsNonLocalised

一个数组,包含要同步到Algolia的字段。本地化和非本地化键之间的区别是:如果安装了Fluent,它将数据放在本地化对象中。Algolia中的本地化对象将是Locales->Locale->Key = Value,而非本地化将导致Key = Value。

还可以提供自己的数据。如果您创建了自己的返回所需数据的函数,则需要使用“get”前缀。例如,如果添加到配置中,则可以访问名为getMyCustomData()的函数。

  • "MyCustomData"

如果“getMyCustomData()”函数的返回值可用/非空,它将被添加到Algolia对象中。对于本地化对象,Locales->Locale->MyCustomData = Value,而非本地化将导致MyCustomData = Value。

AlgoliaSyncImagesLocalised & AlgoliaSyncImagesNonLocalised

一个数组,包含要同步到Algolia的$has_one图像关系的名称。如果页面有一个图像关系,并且图像已发布,则Link()返回将保存在Algolia中。本地化和非本地化键之间的区别是:如果安装了Fluent,它将数据放在本地化对象中。Algolia中的本地化对象将是Locales->Locale->MyImage = URL,而非本地化将导致MyImage = URL。

  • 'MyImage'

示例配置

基本配置

---
name: 'my overide'
After:
  - '#algoliapagesyncmoduleconfig'
---
Page:
  extensions:
    - AlgoliaSyncModuleDirectLease\PageAlgoliaExtension
AlgoliaKeys:
  adminApiKey: '' # Algolia Admin API KEY
  applicationId: '' # Algolia App ID
  indexName: 'sitecontent' # default name of the index the pages will be synced in 
AlgoliaSyncFieldsLocalised:
AlgoliaSyncFieldsNonLocalised:
AlgoliaSyncImagesLocalised:
AlgoliaSyncImagesNonLocalised:

支持Fluent的配置

---
name: 'my overide'
After:
  - '#algoliapagesyncmoduleconfig'
---
Page:
 extensions:
  - AlgoliaSyncModuleDirectLease\PageAlgoliaExtension
AlgoliaKeys:
  adminApiKey: '' # Algolia Admin API KEY
  applicationId: '' # Algolia App ID
  indexName: 'sitecontent' # default name of the index the pages will be synced in 
AlgoliaSyncFieldsLocalised:
 - "MyAwesomeSearchTextHolder"
 - "MyAwesomeSearchTextHolder2"
AlgoliaSyncFieldsNonLocalised:
 - "MyAwesomeSearchTextHolderNonLocalised"
AlgoliaSyncImagesLocalised:
 - "MyAwesomeImage"
AlgoliaSyncImagesNonLocalised:
 - "MyAwesomeImageButNonLocalised"

不支持Fluent的配置

---
name: 'my overide'
After:
  - '#algoliapagesyncmoduleconfig'
---
Page:
 extensions:
  - AlgoliaSyncModuleDirectLease\PageAlgoliaExtension
AlgoliaKeys:
  adminApiKey: '' # Algolia Admin API KEY
  applicationId: '' # Algolia App ID
  indexName: 'sitecontent' # default name of the index the pages will be synced in 
AlgoliaSyncFieldsLocalised:
AlgoliaSyncFieldsNonLocalised:
 - "MyAwesomeSearchTextHolder"
AlgoliaSyncImagesLocalised:
AlgoliaSyncImagesNonLocalised:
 - "MyAwesomeImage"
 - "MyAwesomeImage2"