在我的模块中,我有this实现,其中我有一个hook_search_execute()
函数,可用于重写/扩展默认的Drupal搜索。此函数调用executeFirstPass()
方法,并向查询添加以下$first->addExpression('SUM(i.score * t.count)', 'calculated_score');
当我尝试将我的排序添加为$query->orderBy('calculated_score', 'ASC');
后,我出错了。
但是,如果我添加$query->orderBy('n.title', 'ASC');
或$query->orderBy('n.created', 'ASC');
,一切都很好,并按照应有的顺序排序。
有没有人知道为什么会这样?
答案 0 :(得分:0)
经过我所有的研究,我只得到了这个糟糕的解决方案。
在modules/search/search.extender.inc
文件中,我们在第437行中有以下代码(取决于Drupal版本)。
....
// Convert scores to an expression.
$this->addExpression('SUM(' . implode(' + ', $this->scores) . ')', 'calculated_score', $this->scoresArguments);
if (count($this->getOrderBy()) == 0) {
// Add default order after adding the expression.
$this->orderBy('calculated_score', 'DESC');
}
....
我将此代码转换为:
....
// Convert scores to an expression.
$this->addExpression('SUM(' . implode(' + ', $this->scores) . ')', 'calculated_score', $this->scoresArguments);
if (count($this->getOrderBy()) == 0) {
if ($_GET['orderby'] == 'relevance' && $_GET['orderdir'] == 'ASC') {
$dir = 'ASC';
}
else {
$dir = 'DESC';
}
// Add default order after adding the expression.
$this->orderBy('calculated_score', $dir);
}
....
请随意提出清洁解决方案。