Answers:
我通常这样做的方法是实现hook_menu_alter()。然后,您可以按照选择的确切方式自定义网址:
/**
* Implements hook_menu_alter().
*/
function example_menu_alter(&$menu) {
// Ensure Apache Solr is the default and that the menu item exists.
if (variable_get('apachesolr_search_make_default', 0) && isset($menu['search/apachesolr/%menu_tail'])) {
$menu['search/%menu_tail'] = $menu['search/apachesolr/%menu_tail'];
unset($menu['search/apachesolr/%menu_tail']);
}
}
如果仅使用apachesolr搜索模块,则更改搜索路径并非易事。由于它取决于核心搜索模块,因此路径几乎是硬编码的。这取决于search / {module} /%menu_tail。如果查看search_view()(搜索模块的回调),您会发现它调用search_get_keys(),它期望搜索键位于路径的特定部分。apachesolr搜索模块也使用此函数来获取密钥,因此实现简单的hook_menu_alter()不能单独工作。
如此处另一个答案所述,如果您能够运行Views 3.x,那么最好的选择是使用apachesolr views模块。使用此模块,您可以轻松定义搜索结果的任意数量的自定义路径。
如果您无法运行3.x,则需要使用表单alter(特别是search_form)和自定义菜单回调的组合来成功更改默认搜索路径。
如果将其放置在settings.php中,则应该可以使用:
function custom_url_rewrite_outbound(&$path, &$options, $original_path) {
// Filter to get only the apache solr links with filters so it doesn't launch it for every link of our website
if ($path == 'search/apachesolr_search/' && strpos($options['query'], 'filters') !== FALSE) {
$new_path = $path.'?'.urldecode($options['query']);
// See if we have a url_alias for our new path
$sql = 'SELECT dst FROM {url_alias} WHERE src="%s"';
$row = db_result(db_query($sql, $new_path));
// If there is a dst url_alia, we change the path to it and erase the query
if ($row) {
$path = $row;
$options['query'] = '';
}
}
}
function custom_url_rewrite_inbound(&$result, $path, $path_language) {
// See if we have a url_alias for our new path
$sql = 'SELECT src FROM {url_alias} WHERE dst="%s"';
$row = db_result(db_query($sql, $path));
if ($row) {
// We found a source path
$parts = preg_split('/[\?\&]/', $row);
if (count($parts) > 1) {
$result = array_shift($parts);
// That's important because on my website, it doesn't work with the / at the end of result
if ($result[strlen($result) - 1] == '/') {
$result = substr($result, 0, strlen($result) - 1);
}
// Create the $_GET with the filter
foreach ($parts as $part) {
list($key, $value) = explode('=', $part);
$_GET[$key] = $value;
// Add this because the pager use the $_REQUEST variable to be set
$_REQUEST[$key] = $value;
}
}
}
}
然后在创建菜单项时,将链接放置到apache solr:search / apachesolr_search /?filters = tid:13
并为search / apachesolr_search /?filters = tid:13创建一个URL别名,例如products / tv.html
您可以使用solr视图进行站点搜索。
看看Evolving Web上的伙计们使用hook_menu添加自定义搜索路径。它讨论了他们如何编写一个自定义模块来为其Solr搜索创建友好的URL。您可能需要稍微调整一下,但这是一个很好的起点。