Jak mogę zmienić domyślną ścieżkę URL Apache Solr z „search / apachesolr_search / term” na coś innego?
Jak mogę zmienić domyślną ścieżkę URL Apache Solr z „search / apachesolr_search / term” na coś innego?
Odpowiedzi:
Zwykle robię to za pomocą hook_menu_alter (). Następnie możesz dostosować adres URL w dokładnie taki sposób, jaki wybierzesz:
/**
* 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']);
}
}
Zmiana ścieżki wyszukiwania nie jest trywialna, jeśli używasz tylko modułu wyszukiwania apachesolr. Ponieważ zależy to od głównego modułu wyszukiwania, ścieżka jest prawie zakodowana na stałe. To zależy od wyszukiwania / {module} /% menu_tail. Jeśli spojrzysz na search_view () , wywołanie zwrotne dla modułu wyszukiwania, przekonasz się, że wywołuje funkcję search_get_keys () , która oczekuje, że klucze wyszukiwania znajdują się w określonej części ścieżki. Moduł wyszukiwania apachesolr również używa tej funkcji do pobierania kluczy, więc implementacja prostego hook_menu_alter () nie zadziała sama.
Jak wspomniano w innej odpowiedzi tutaj, jeśli jesteś w stanie uruchomić Views 3.x, najlepszym rozwiązaniem jest skorzystanie z modułu wyświetleń apachesolr . Za pomocą tego modułu możesz łatwo zdefiniować dowolną liczbę niestandardowych ścieżek dla wyników wyszukiwania.
Jeśli nie możesz uruchomić 3.x, musisz użyć kombinacji form alter (w szczególności search_form) i niestandardowych wywołań menu, aby pomyślnie zmienić domyślną ścieżkę wyszukiwania.
Powinno to działać, jeśli umieścisz go w ustawieniach. 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;
}
}
}
}
A następnie, gdy tworzysz pozycję menu, umieszczasz link do apache solr: search / apachesolr_search /? Filter = tid: 13
I utwórz alias adresu URL dla wyszukiwania / apachesolr_search /? Filtry = tid: 13 podobnych produktów / tv.html
Znalezione przez: http://drupal.org/node/783836#comment-4136475
Możesz użyć widoków Solr do wyszukiwania w witrynie.
Sprawdź Dodawanie niestandardowych ścieżek wyszukiwania z hook_menu przez facetów z Evolving Web. Mówi o tym, jak napisali niestandardowy moduł do tworzenia przyjaznych adresów URL dla wyszukiwań Solr. Prawdopodobnie będziesz musiał go trochę ulepszyć, ale to dobry punkt wyjścia.
Co powiesz na utworzenie nowego wywołania zwrotnego menu, takiego jak poniżej, aby apachesolr zwrócił wyniki dla tej ścieżki?
$menu['search']['page callback'] = 'apachesolr_search_view';
Lub możesz po prostu zmodyfikować moduł, który to robi: Ścieżka niestandardowa Apache Solr .
Jeśli chcesz tylko zmienić search / apachesolr_search / na coś innego, na przykład „ekwipunek”, możesz wypróbować moduł Global redirect .
Sztuczka polega na utworzeniu 2 aliasów - jednego dla wyszukiwania / apachesolr_search / (dla elementów fasetowanych) i drugiego bez końcowego ukośnika (dla głównej strony wyszukiwania). Globalne przekierowanie może odmówić utworzenia 2 aliasów dla tego samego miejsca docelowego, ale możesz wstawić go bezpośrednio do bazy danych.