g4b0/searchable-dataobjects
Composer 安装命令:
composer require g4b0/searchable-dataobjects
包简介
This module adds DataObjects to frontend search
README 文档
README
Searchable DataObjects is a module that permit to include DataObjects into frontend search.
Introduction
Pages are not always the better way to implement things. For example site news can grow rapidly and the first side effect would be a big and difficult to manage SiteTree. DataObjects help maintaining things clean and straight, but unfortunately they are not included in frontend search. This module let you insert DataObject in search.
Requirements
- SilverStripe 4.1
- g4b0/htmlpurifier
For SilverStripe 3.1 usage please referr to version 3.0 and below. For SilverStripe >3.1 & <4.0 usage please referr to version 4.x.
Installation
Install the module through composer:
composer require g4b0/searchable-dataobjects
composer update
Make the DataObject (or Pages) implement Searchable interface (you need to implement Link(), getSearchFilter(), getTitleFields(), getContentFields()):
Note: getSearchFilterByCallback() is an optional filter. If you don't plan on calculating any value to determine a returned true or false value it is suggested you don't add this function to your DataObject or Page type.
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'); } }
Here you are a sample page holder, needed to implement the Link() function into the 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'); } } }
Extend Page and the desired DataObjects through the following yaml:
Page: extensions: - g4b0\SearchableDataObjects\SearchableDataObject DoNews: extensions: - g4b0\SearchableDataObjects\SearchableDataObject
Run a dev/build and then populate the search table running PopulateSearch task:
sake dev/build "flush=all"
sake dev/tasks/PopulateSearch
Enjoy the news into the search results :)
Modifying
Set the number of search results per page
Setting the g4b0\SearchableDataObjects\CustomSearch.items_per_page config setting you can define, how many search results per page are shown. Default is 10
By default the search result is shown at the same page, so if you're searching e.g. on the /about-us/, the results are
shown on /about-us/SearchForm/?s=foo. If you don't like that, you can define any Page or Controller class in the
g4b0\SearchableDataObjects\CustomSearch.search_controller setting. If you set this setting to this, the current page will be used. Defaults to SearchPage
and falls back to the current page if no SearchPage is found.
g4b0\SearchableDataObjects\CustomSearch: items_per_page: 15 search_controller: g4b0\SearchableDataObjects\SearchPage #page type to show the search
Note
Searchable DataObjects module use Mysql NATURAL LANGUAGE MODE search method, so during your tests be sure not to have all DataObjetcs with the same content, since words that are present in 50% or more of the rows are considered common and do not match.
From MySQL manual entry [http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html]:
A natural language search interprets the search string as a phrase in natural human language (a phrase in free text). There are no special operators. The stopword list applies. In addition, words that are present in 50% or more of the rows are considered common and do not match. Full-text searches are natural language searches if the IN NATURAL LANGUAGE MODE modifier is given or if no modifier is given.
TODO
- Add other search method in configuration
Suggested modules
- Linkable DataObjects: http://addons.silverstripe.org/add-ons/g4b0/linkable-dataobjects
g4b0/searchable-dataobjects 适用场景与选型建议
g4b0/searchable-dataobjects 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 4.92k 次下载、GitHub Stars 达 25, 最近一次更新时间为 2018 年 05 月 11 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「search」 「silverstripe」 「dataobject」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 g4b0/searchable-dataobjects 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 g4b0/searchable-dataobjects 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 g4b0/searchable-dataobjects 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel package to retrieve data from Google Search Console
Pimcore 6.x Relation-Fields for DataObjects and Documents
Indexed Search Autocomplete - Extends the TYPO3 Core Extension Indexed_Search searchform with an autocomplete feature.
DataExtension that easily allows a DataObject to be viewed like a Page
Silverstripe Translatable extension for DataObjects
Abstraction Layer to index and search entities
统计信息
- 总下载量: 4.92k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 25
- 点击次数: 3
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: GPL-2.0-only
- 更新时间: 2018-05-11