directlease/silverstripe-algolia-page-sync-module
一个基于配置将页面同步到Algolia索引的模块
Requires
Requires (Dev)
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: ^3.0
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"