g4b0 / searchable-dataobjects
此模块将 DataObjects 添加到前端搜索
Requires
- g4b0/htmlpurifier: ~2.0
- silverstripe/cms: ^4.0
- silverstripe/framework: ^4.0
README
Searchable DataObjects 是一个模块,允许将 DataObjects 包含到前端搜索中。
简介
页面并不总是实现事物的最佳方式。例如,网站新闻可能迅速增长,第一个副作用就是庞大的、难以管理的 SiteTree。DataObjects 有助于保持事物的整洁和直观,但遗憾的是,它们并未包含在前端搜索中。此模块允许您将 DataObject 插入搜索。
要求
- SilverStripe 4.1
- g4b0/htmlpurifier
对于 SilverStripe 3.1 的使用,请参考版本 3.0 及以下。对于 SilverStripe >3.1 且 <4.0 的使用,请参考 4.x 版本。
安装
通过 composer 安装模块
composer require g4b0/searchable-dataobjects
composer update
使 DataObject(或页面)实现 Searchable 接口(您需要实现 Link()、getSearchFilter()、getTitleFields()、getContentFields())
注意: getSearchFilterByCallback()
是一个可选的过滤器。如果您不计划计算任何值来确定返回的 true
或 false
值,建议您不要将此函数添加到您的 DataObject
或 Page
类型。
use g4b0\SearchableDataObjects\Searchable; class DoNews extends DataObject implements Searchable { private static $db = array( 'Title' => 'Varchar', 'Subtitle' => 'Varchar', 'News' => 'HTMLText', 'Date' => 'Date', ); private static $has_one = array( 'Page' => 'PghNews' ); /** * Link to this DO * @return string */ public function Link() { return $this->Page()->Link() . 'read/' . $this->ID; } /** * Filter array * eg. array('Disabled' => 0); * @return array */ public static function getSearchFilter() { return array(); } /** * FilterAny array (optional) * eg. array('Disabled' => 0, 'Override' => 1); * @return array */ public static function getSearchFilterAny() { return array(); } /** * FilterByCallback function (optional) * eg. function($object){ * return ($object->StartDate > date('Y-m-d') || $object->isStillRecurring()); * }; * @return array */ public static function getSearchFilterByCallback() { return function($object){ return true; }; } /** * Fields that compose the Title * eg. array('Title', 'Subtitle'); * @return array */ public function getTitleFields() { return array('Title'); } /** * Fields that compose the Content * eg. array('Teaser', 'Content'); * @return array */ public function getContentFields() { return array('Subtitle', 'Content'); } }
以下是一个示例页面持有者,您需要将其实现到 DataObject 中的 Link() 函数
class PghNews extends Page { private static $has_many = array( 'News' => 'DoNews' ); public function getCMSFields() { $fields = parent::getCMSFields(); /* News */ $gridFieldConfig = GridFieldConfig_RelationEditor::create(100); // Remove unlink $gridFieldConfig->removeComponentsByType('GridFieldDeleteAction'); // Add delete $gridFieldConfig->addComponents(new GridFieldDeleteAction()); // Remove autocompleter $gridFieldConfig->removeComponentsByType('GridFieldAddExistingAutocompleter'); $field = new GridField('Faq', 'Faq', $this->News(), $gridFieldConfig); $fields->addFieldToTab('Root.News', $field); return $fields; } } class PghNews_Controller extends Page_Controller { private static $allowed_actions = array( 'read' ); public function read(SS_HTTPRequest $request) { $arguments = $request->allParams(); $id = $arguments['ID']; // Identifico la faq dall'ID $Object = DataObject::get_by_id('DoNews', $id); if ($Object) { //Popolo l'array con il DataObject da visualizzare $Data = array($Object->class => $Object); $this->data()->Title = $Object->Title; $retVal = $this->Customise($Data); return $retVal; } else { //Not found return $this->httpError(404, 'Not found'); } } }
通过以下 yaml 扩展 Page 和所需的 DataObjects
Page: extensions: - g4b0\SearchableDataObjects\SearchableDataObject DoNews: extensions: - g4b0\SearchableDataObjects\SearchableDataObject
运行 dev/build
,然后运行 PopulateSearch 任务来填充搜索表
sake dev/build "flush=all"
sake dev/tasks/PopulateSearch
享受搜索结果中的新闻 :)
修改
设置每页搜索结果数量
通过设置 g4b0\SearchableDataObjects\CustomSearch.items_per_page
配置设置,您可以定义每页显示多少个搜索结果。默认值为 10
默认情况下,搜索结果显示在同一页上,所以如果您在 /about-us/ 上进行搜索,结果将显示在 /about-us/SearchForm/?s=foo 上。如果您不喜欢这样,您可以在 g4b0\SearchableDataObjects\CustomSearch.search_controller
设置中定义任何页面或控制器类。如果将此设置设置为 this
,则使用当前页面。默认值为 SearchPage
,如果找不到 SearchPage,则回退到当前页面。
g4b0\SearchableDataObjects\CustomSearch: items_per_page: 15 search_controller: g4b0\SearchableDataObjects\SearchPage #page type to show the search
注意
Searchable DataObjects 模块使用 Mysql NATURAL LANGUAGE MODE 搜索方法,因此在进行测试时,请确保不要让所有 DataObjetcs 都有相同的内容,因为存在于 50% 或更多行中的单词被认为是常见的,并且不匹配。
来自 MySQL 手册条目 [https://dev.mysqlserver.cn/doc/refman/5.1/en/fulltext-search.html]
自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。没有特殊操作符。停止词列表适用。此外,存在于 50% 或更多行中的单词被认为是常见的,不匹配。如果给出了 IN NATURAL LANGUAGE MODE 修饰符或未给出修饰符,则全文搜索是自然语言搜索。
待办事项
- 在配置中添加其他搜索方法
建议的模块
- Linkable DataObjects: http://addons.silverstripe.org/add-ons/g4b0/linkable-dataobjects