zirak/searchable-dataobjects

此包已被废弃,不再维护。作者建议使用 g4b0/searchable-dataobjects 包。

此模块将 DataObjects 添加到前端搜索

安装数: 2,795

依赖项: 0

推荐者: 0

安全性: 0

星标: 24

关注者: 4

分支: 23

开放问题: 2

类型:silverstripe-vendormodule

5.0.0 2018-05-10 21:53 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:35:11 UTC


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() 是一个可选的过滤器。如果您不打算计算任何值以确定返回 truefalse 的值,建议您不要将此函数添加到您的 DataObjectPage 类型中。

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');
    }
}

以下是一个示例页面持有者,需要将 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:
    - 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 自然语言搜索方法,因此在测试过程中,请确保不要让所有 DataObjetcs 都具有相同的内容,因为存在于 50% 或更多行中的单词被视为常见且不匹配。

请参阅 MySQL 手册条目 [https://dev.mysqlserver.cn/doc/refman/5.1/en/fulltext-search.html]

自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。没有特殊操作符。应用停用词列表。此外,存在于50%或更多行中的单词被认为是常见的,不匹配。如果给出“IN NATURAL LANGUAGE MODE”修改符或未给出修改符,全文搜索是自然语言搜索。

待办事项

  • 在配置中添加其他搜索方法

建议模块