Jak mogę zmienić adres URL wyszukiwania Apache Solr?

12

Jak mogę zmienić domyślną ścieżkę URL Apache Solr z „search / apachesolr_search / term” na coś innego?

markdorison
źródło
3
szkoda, że ​​post q0rban był tak często głosowany, ponieważ nie zadziała - jhedstrom podaje dokładny opis tego, dlaczego po prostu przesłonięcie ścieżki za pomocą hook_menu_alter ulegnie awarii i spaleniu.
aaronbauman

Odpowiedzi:

3

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']);
  }
}
q0rban
źródło
4

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.

jhedstrom
źródło
4

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

realityloop
źródło
Mam wrażenie, że dotyczy to D6. Czy można go łatwo dostosować do D7, zgodnie z pytaniem?
pushka
3

Możesz użyć widoków Solr do wyszukiwania w witrynie.

  1. Utwórz widok solr.
  2. Dodaj wyświetlanie strony z żądaną ścieżką
  3. Dodaj szukany tekst jako filtr.
  4. Odsłonięta forma w bloku
  5. Umieść blok w miejscu, w którym ma się znajdować pole wyszukiwania.
Jeremy French
źródło
To nie działa
AnAnD
1

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';
markdorison
źródło
0

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.

gansbrest
źródło