creativecodelabs/silverstripe-searchable-dataobjects-innodb

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

1.0 2018-02-13 19:43 UTC

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

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

待办事项

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

建议的模块