Làm cách nào để thay đổi URL tìm kiếm Apache Solr?


12

Làm cách nào tôi có thể thay đổi đường dẫn URL Solr mặc định từ "search / apachesolr_search / term" sang thứ khác?


3
thật tệ khi bài đăng của q0rban đã được bình chọn rất nhiều lần, bởi vì nó sẽ không hoạt động - jhedstrom đưa ra một mô tả kỹ lưỡng về lý do tại sao chỉ cần ghi đè lên đường dẫn với hook_menu_alter sẽ bị sập và cháy.
aaronbauman

Câu trả lời:


3

Cách tôi thường làm điều này là triển khai hook_menu_alter (). Sau đó, bạn có thể tùy chỉnh url theo cách chính xác mà bạn chọn:

/**
 * 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']);
  }
}

4

Việc thay đổi đường dẫn tìm kiếm là không tầm thường nếu bạn chỉ sử dụng mô-đun tìm kiếm apachesolr. Vì nó phụ thuộc vào mô-đun tìm kiếm cốt lõi, đường dẫn gần như được mã hóa cứng. Nó phụ thuộc vào tìm kiếm / {module} /% menu_tail. Nếu bạn nhìn vào search_view () , gọi lại cho mô-đun tìm kiếm, bạn sẽ thấy rằng nó gọi search_get_keys () , dự kiến ​​các khóa tìm kiếm nằm trong một phần cụ thể của đường dẫn. Mô-đun tìm kiếm apachesolr cũng sử dụng chức năng này để lấy các khóa, do đó, việc triển khai một hook_menu_alter () đơn giản sẽ không tự hoạt động.

Như đã đề cập trong một câu trả lời khác ở đây, nếu bạn có thể chạy Lượt xem 3.x, thì cách tốt nhất của bạn là sử dụng mô-đun lượt xem apachesolr . Với mô-đun này, bạn có thể dễ dàng xác định bất kỳ số lượng đường dẫn tùy chỉnh nào cho kết quả tìm kiếm.

Nếu bạn không thể chạy 3.x, thì bạn sẽ cần sử dụng kết hợp các thay đổi biểu mẫu (cụ thể là search_form) và các cuộc gọi lại menu tùy chỉnh để thay đổi thành công đường dẫn tìm kiếm mặc định.


4

Điều này sẽ hoạt động nếu bạn đặt nó trong 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;
      }
    }
  }
}

Và sau đó khi bạn tạo một mục menu, bạn đặt liên kết đến apache solr: search / apachesolr_search /? Filter = tid: 13

Và tạo một bí danh url cho tìm kiếm / apachesolr_search /? Filter = tid: 13 like sản phẩm / tv.html

Tìm thấy qua: http://drupal.org/node/783836#comment-4136475


Tôi có cảm giác đây là D6. Có dễ dàng thích nghi cho D7, như câu hỏi được hỏi không?
Pushka

3

Bạn có thể sử dụng lượt xem solr cho tìm kiếm trang web của bạn.

  1. Tạo một cái nhìn solr.
  2. Thêm một màn hình trang với đường dẫn bạn muốn
  3. Thêm văn bản tìm kiếm dưới dạng bộ lọc.
  4. Hình thức tiếp xúc trong khối
  5. Đặt khối nơi bạn muốn hộp tìm kiếm của bạn đi.

Điều này không hoạt động
AnAnD 18/07/13


1

Điều gì về việc tạo một cuộc gọi lại menu mới như sau để làm cho apachesolr trả về kết quả tại đường dẫn đó?

$menu['search']['page callback'] = 'apachesolr_search_view';


0

Nếu bạn chỉ muốn thay đổi tìm kiếm / apachesolr_search / thành một thứ khác, ví dụ như 'hàng tồn kho', bạn có thể thử mô-đun chuyển hướng Toàn cầu .

Mẹo nhỏ là tạo 2 bí danh - một cho tìm kiếm / apachesolr_search / (cho các mục có khía cạnh) và một mục khác không có dấu gạch chéo (cho trang tìm kiếm chính). Chuyển hướng toàn cầu có thể từ chối tạo 2 bí danh cho cùng một đích, nhưng bạn có thể chèn trực tiếp vào db.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.