gpt4 book ai didi

content-management-system - 可搜索的银条数据对象

转载 作者:行者123 更新时间:2023-12-04 08:45:03 24 4
gpt4 key购买 nike

我正在尝试在默认搜索结果页面中显示某些数据对象(新闻)。所以结果应该显示正常的页面和新闻。

在 Silverstripe 3 中是否有一种简单的方法可以实现这一点?
或者是否建议对其进行完全自定义的编码 - 我的意思是一个自定义 Controller /操作,它处理搜索请求并创建一个结果列表,然后我将其显示在自定义模板中?

我找到了这个,但显然现在搜索被禁用了:
https://github.com/arambalakjian/DataObjects-as-Pages

谢谢和问候,
弗洛里安

最佳答案

我通常在启用 FulltextSearchable 后使用自定义搜索功能。所以在 _config.php 我会有

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

用您想要搜索的任何 DBField 替换 Name 和 Content。并且每个可搜索的 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 扩展到 $siteTreeClasses 数组中,并且几乎可以复制新闻部分以用于我需要搜索的任何其他 DataObject

我并不是说这是最好的解决方案,这绝对可以改进,但它对我有用,这可能是一个很好的说明点。

关于content-management-system - 可搜索的银条数据对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14483880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com