ฉันจะเปลี่ยน URL การค้นหา Apache Solr ได้อย่างไร


12

ฉันจะเปลี่ยนพา ธ URL ของ Apache Solr เริ่มต้นจาก "search / apachesolr_search / term" เป็นอย่างอื่นได้อย่างไร


3
มันเลวร้ายเกินไปที่โพสต์ของ q0rban ได้รับการโหวตหลายครั้งเพราะมันจะไม่ทำงาน - jhedstrom ให้คำอธิบายอย่างละเอียดว่าทำไมเพียงเอาชนะเส้นทางด้วย hook_menu_alter จะพังและเผาไหม้
aaronbauman

คำตอบ:


3

วิธีที่ฉันทำโดยทั่วไปคือการใช้ 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']);
  }
}

4

มันไม่สำคัญที่จะเปลี่ยนพา ธ การค้นหาหากคุณใช้โมดูลการค้นหา apachesolr เท่านั้น เนื่องจากขึ้นอยู่กับโมดูลการค้นหาหลักเส้นทางจึงเกือบจะได้รับการเข้ารหัสยาก ขึ้นอยู่กับการค้นหา / {โมดูล} /% menu_tail หากคุณดูที่search_view ()หมายถึงการโทรกลับสำหรับโมดูลการค้นหาคุณจะพบว่ามันเรียกว่าsearch_get_keys ()ซึ่งคาดว่าคีย์การค้นหาจะอยู่ในส่วนใดส่วนหนึ่งของพา ธ โมดูลการค้นหา apachesolr ยังใช้ฟังก์ชั่นนี้เพื่อรับกุญแจดังนั้นการใช้ hook_menu_alter () แบบธรรมดาก็ไม่สามารถใช้งานได้ด้วยตัวเอง

ตามที่ระบุไว้ในคำตอบที่นี่อีกถ้าคุณมีความสามารถในการทำงานชม 3.x แล้วทางออกที่ดีที่สุดของคุณคือการใช้โมดูลมุมมอง apachesolr ด้วยโมดูลนี้คุณสามารถกำหนดจำนวนเส้นทางที่กำหนดเองได้อย่างง่ายดายสำหรับผลการค้นหา

หากคุณไม่สามารถเรียกใช้ 3.x ได้คุณจะต้องใช้การรวมกันของแบบฟอร์มการเปลี่ยนแปลง (โดยเฉพาะ search_form) และการเรียกกลับเมนูที่กำหนดเองเพื่อเปลี่ยนเส้นทางการค้นหาเริ่มต้นสำเร็จ


4

สิ่งนี้จะทำงานได้ถ้าคุณวางไว้ใน 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


ฉันมีความรู้สึกว่านี่สำหรับ D6 มันดัดแปลงได้ง่ายสำหรับ D7 ตามที่ถามหรือไม่
pushka

3

คุณสามารถใช้มุมมอง solrสำหรับการค้นหาไซต์ของคุณ

  1. สร้างมุมมอง solr
  2. เพิ่มการแสดงหน้าด้วยเส้นทางที่คุณต้องการ
  3. เพิ่มข้อความค้นหาเป็นตัวกรอง
  4. รูปแบบเปิดเผยในบล็อก
  5. ใส่บล็อกที่คุณต้องการให้ช่องค้นหาของคุณไป

สิ่งนี้ไม่ทำงาน
AnAnD

2

ตรวจสอบการเพิ่มเส้นทางการค้นหาที่กำหนดเองด้วย hook_menuโดยพวกที่ Evolving Web มันพูดถึงวิธีที่พวกเขาเขียนโมดูลที่กำหนดเองเพื่อสร้าง URL ที่จำง่ายสำหรับการค้นหา Solr ของพวกเขา คุณอาจต้องปรับแต่งเล็กน้อย แต่เป็นจุดเริ่มต้นที่ดี


1

สิ่งที่เกี่ยวกับการสร้างการโทรกลับเมนูใหม่ดังต่อไปนี้เพื่อให้ apachesolr ส่งคืนผลลัพธ์ที่เส้นทางนั้น

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


0

หากคุณต้องการเปลี่ยนการค้นหา / apachesolr_search / เป็นอย่างอื่นเช่น 'คลังโฆษณา' คุณสามารถลองใช้โมดูลการเปลี่ยนเส้นทางทั่วโลก

เคล็ดลับคือการสร้าง 2 นามแฝง - หนึ่งสำหรับการค้นหา / apachesolr_search / (สำหรับรายการประกอบ) และอีกหนึ่งโดยไม่ต้องต่อท้ายทับ (สำหรับหน้าค้นหาหลัก) การเปลี่ยนเส้นทางทั่วโลกอาจปฏิเสธที่จะสร้าง 2 นามแฝงสำหรับปลายทางเดียวกัน แต่คุณสามารถแทรกลงใน db โดยตรง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.