4

特定のDataObjects(ニュース)をデフォルトのSearchResultページに表示しようとしています。したがって、結果には通常のページとニュースが表示されます。

Silverstripe 3でそれを達成する簡単な方法はありますか?または、完全にカスタムでコーディングすることをお勧めします-検索リクエストを処理して結果リストを作成するカスタムコントローラー/アクションを意味し、カスタムテンプレートに表示しますか?

私はこれを見つけましたが、明らかに現在検索が無効になっています: https ://github.com/arambalakjian/DataObjects-as-Pages

Thxとよろしく、フロリアン

4

3 に答える 3

8

私は通常、を有効にした後、カスタム検索機能を一緒に使用しますFulltextSearchable。だから_config.php私は

FulltextSearchable::enable();
Object::add_extension('NewsStory', "FulltextSearchable('Name,Content')");

名前コンテンツDBField検索可能にしたいものに置き換えます。そして、各検索可能ファイルDataObjectは、検索インデックスを有効にするためにクラスにこれを持っています(拡張機能を有効にする前に、これを追加してdev / buildを実行する必要があり、MySQL DBでのみ機能します)。

static $create_table_options = array(
  'MySQLDatabase' => 'ENGINE=MyISAM'
);

次にPageController、カスタムのsearchForm関数とresults関数があります。

テンプレート searchで呼び出される検索フォームを返す関数は次のとおりです。$search

public function search()
{       
  if($this->request && $this->request->requestVar('Search')) {
    $searchText = $this->request->requestVar('Search');
  }else{
    $searchText = 'Search';
  }

  $f = new TextField('Search', false, $searchText);

  $fields = new FieldList(
    $f
  );
  $actions = new FieldList(
    new FormAction('results', 'Go')
  );
  $form = new Form(
    $this,
    'search',
    $fields,
    $actions
  );
  //$form->disableSecurityToken();
  $form->setFormMethod('GET');
  $form->setTemplate('SearchForm');

  return $form;
}

resultsそしてここでクエリを処理するカスタム関数...

function results($data, $form, $request)
{   
  $keyword = trim($request->requestVar('Search'));
  $keyword = Convert::raw2sql($keyword);
  $keywordHTML = htmlentities($keyword, ENT_NOQUOTES, 'UTF-8');    

  $pages = new ArrayList();
  $news = new ArrayList();

  $mode = ' IN BOOLEAN MODE';
  //$mode = ' WITH QUERY EXPANSION';
  //$mode = '';

  $siteTreeClasses = array('Page');
  $siteTreeMatch = "MATCH( Title, MenuTitle, Content, MetaTitle, MetaDescription, MetaKeywords ) AGAINST ('$keyword'$mode)
                  + MATCH( Title, MenuTitle, Content, MetaTitle, MetaDescription, MetaKeywords ) AGAINST ('$keywordHTML'$mode)";

  $newsItemMatch = "MATCH( Name, Content ) AGAINST ('$keyword'$mode)
                  + MATCH( Name, Content ) AGAINST ('$keywordHTML'$mode)";

  //Standard pages
  foreach ( $siteTreeClasses as $c )
  {
    $query = DataList::create($c)
      ->where($siteTreeMatch);
    $query = $query->dataQuery()->query();
    $query->addSelect(array('Relevance' => $siteTreeMatch));

    $records = DB::query($query->sql());
    $objects = array();
    foreach( $records as $record )
    {
      if ( in_array($record['ClassName'], $siteTreeClasses) )
        $objects[] = new $record['ClassName']($record);
    }
    $pages->merge($objects);
  }


  //news
  $query = DataList::create('NewsStory')->where($newsItemMatch);
  $query = $query->dataQuery()->query();
  $query->addSelect(array('Relevance' => $newsItemMatch));

  $records = DB::query($query->sql());
  $objects = array();
  foreach( $records as $record ) $objects[] = new $record['ClassName']($record);
  $news->merge($objects);


  //sorting results
  $pages->sort(array(
    'Relevance' => 'DESC',
    'Title' => 'ASC'
  ));      
  $news->sort(array(
    'Relevance' => 'DESC',
    'Date' => 'DESC'
  ));

  //output
  $data = array(
    'Pages' => $pages,
    'News' => $news,
    'Query' => $keyword
  ); 
  return $this->customise($data)->renderWith(array('Search','Page'));
}

検索したいすべてのPageクラスを追加し、それを配列に拡張SiteTreeします。Newsパーツは、検索が必要な他のクラスにほぼコピーできます。$siteTreeClassesDataObject

私はこれが最善の解決策であると言っているわけではなく、これは間違いなく改善することができますが、それは私にとってはうまくいき、これは良い述べ点かもしれません。

于 2013-01-23T21:28:02.953 に答える
2

@colymbaのソリューションをsilverstripeモジュールに適合させました:https ://github.com/burnbright/silverstripe-pagesearch

URLにページタイプを設定できます。

于 2013-11-29T01:13:39.063 に答える
1

実質的に上書きする必要がありますSearchForm->getResults()。を使用しますがDatabase->searchEngine()、それらはクラスに合わせて調整されています。SiteTreePage

「適切な」解決策は、SolrやSphinxなどの検索エンジンにデータをフィードすることです。この目的のために、SS3互換の「fulltextsearch」モジュールがあり ます。https ://github.com/silverstripe-labs/silverstripe-fulltextsearch いくつかの事前設定が必要であり、Solrを自分でホストできる場合にのみ実行可能です。 SaaSプロバイダーに支払う準備ができています。ただし、実行すると、可能性は無限に広がり、優れたツールになります。

于 2013-01-23T21:26:36.507 に答える