Как изменить путь URL-адреса Apache Solr по умолчанию с «search / apachesolr_search / term» на что-то другое?
Как изменить путь URL-адреса Apache Solr по умолчанию с «search / apachesolr_search / term» на что-то другое?
Ответы:
Обычно я делаю это для реализации hook_menu_alter (). Затем вы можете настроить URL-адрес точно так, как вы выберете:
/**
* 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. Поскольку это зависит от основного модуля поиска, путь почти жестко закодирован. Это зависит от поиска / {module} /% menu_tail. Если вы посмотрите на search_view () , обратный вызов для поискового модуля, вы обнаружите, что он вызывает search_get_keys () , который ожидает, что ключи поиска находятся в определенной части пути. Модуль поиска apachesolr также использует эту функцию для получения ключей, поэтому реализация простого hook_menu_alter () не будет работать сама по себе.
Как уже упоминалось в другом ответе, если вы можете запустить Views 3.x, лучше всего использовать модуль представлений apachesolr . С помощью этого модуля вы можете легко определить любое количество пользовательских путей для результатов поиска.
Если вы не можете запустить 3.x, вам нужно будет использовать комбинацию изменения формы (в частности, 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
И создайте псевдоним URL для поиска / apachesolr_search /? Filters = tid: 13 like products / tv.html
Найдено через: http://drupal.org/node/783836#comment-4136475
Вы можете использовать Solr просмотров для поиска по сайту.
Проверьте добавление пользовательских путей поиска с помощью hook_menu ребятами из Evolving Web. В нем рассказывается о том, как они написали собственный модуль для создания удобных URL-адресов для своих поисков в Solr. Возможно, вам придется немного его настроить, но это хорошая отправная точка.
Как насчет создания нового обратного вызова меню, подобного следующему, чтобы apachesolr возвращал результаты по этому пути?
$menu['search']['page callback'] = 'apachesolr_search_view';
Или вы можете просто изменить предоставленный модуль, который делает это: Apache Solr Custom Path .
Если вы просто хотите изменить search / apachesolr_search / на что-то другое, например, «инвентарь», вы можете попробовать модуль Global redirect .
Хитрость заключается в том, чтобы создать 2 псевдонима - один для поиска / apachesolr_search / (для граненых элементов), а другой - без косой черты (для главной страницы поиска). Глобальный редирект может отказать в создании 2 псевдонимов для одного и того же места назначения, но вы можете вставить его в базу данных напрямую.