creativecodelabs / silverstripe-searchable-dataobjects-innodb
此模块将 DataObjects 添加到前端搜索
Requires
- silverstripe/cms: ^3.2.0
- silverstripe/framework: ^3.2.0
- zirak/htmlpurifier: 1.0.*
This package is not auto-updated.
Last update: 2024-09-29 04:43:16 UTC
README
Searchable DataObjects 是一个模块,允许将 DataObjects 包含到前端搜索中。
简介
页面并不总是实现事物的最佳方式。例如,网站新闻可能迅速增长,第一个副作用可能是一个庞大且难以管理的 SiteTree。DataObjects 有助于保持事物的整洁和直接,但不幸的是,它们不包括在前端搜索中。此模块允许您将 DataObject 插入搜索中。
要求
- SilverStripe 3.2.*
- zirak/htmlpurifier
安装
通过 composer 安装模块
composer require zirak/searchable-dataobjects
composer update
使 DataObject(或页面)实现 Searchable 接口(您需要实现 Link(),getSearchFilter(),getTitleFields(),getContentFields())
注意: getSearchFilterByCallback()
是一个可选的过滤器。如果您不打算计算任何值来确定返回的 true
或 false
值,建议您不要将此函数添加到您的 DataObject
或 Page
类型中。
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'); } }
以下是一个示例页面持有者,需要将 Link() 函数实现到 DataObject 中
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: - SearchableDataObject DoNews: extensions: - SearchableDataObject
运行 dev/build
然后运行 PopulateSearch 任务填充搜索表
sake dev/build "flush=all"
sake dev/tasks/PopulateSearch
享受搜索结果中的新闻 :)
修改
设置每页的搜索结果数量
通过设置 CustomSearch.items_per_page
配置设置,您可以定义每页显示多少个搜索结果。默认为 10
默认情况下,搜索结果显示在相同页面上,因此如果您在 /about-us/ 上进行搜索,结果将显示在 /about-us/SearchForm/?s=foo 上。如果您不喜欢这样,您可以在 CustomSearch.search_controller
设置中定义任何页面或控制器类。如果将此设置设置为 this
,则使用当前页面。默认为 SearchPage
,如果未找到 SearchPage,则回退到当前页面。
CustomSearch: items_per_page: 15 search_controller: SearchPage #page type to show the search
待办事项
- 在配置中添加其他搜索方法
建议的模块
- Linkable DataObjects: http://addons.silverstripe.org/add-ons/zirak/linkable-dataobjects