Comment puis-je changer l'URL de recherche d'Apache Solr?


12

Comment puis-je changer le chemin d'URL par défaut d'Apache Solr de "search / apachesolr_search / term" en autre chose?


3
il est dommage que le message de q0rban ait été voté autant de fois, car cela ne fonctionnera pas - jhedstrom donne une description détaillée de la raison pour laquelle le fait de remplacer le chemin avec hook_menu_alter plantera et brûlera.
aaronbauman

Réponses:


3

La façon dont j'ai généralement fait cela est d'implémenter hook_menu_alter (). Vous pouvez ensuite personnaliser l'URL de la manière exacte que vous choisissez:

/**
 * 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

Il n'est pas trivial de changer le chemin de recherche si vous utilisez uniquement le module de recherche apachesolr. Comme cela dépend du module de recherche principal, le chemin est presque codé en dur. Cela dépend de la recherche / {module} /% menu_tail. Si vous regardez search_view () , le rappel du module de recherche, vous constaterez qu'il appelle search_get_keys () , qui s'attend à ce que les clés de recherche se trouvent dans une partie particulière du chemin. Le module de recherche apachesolr utilise également cette fonction pour obtenir des clés, donc l'implémentation d'un simple hook_menu_alter () ne fonctionnera pas de lui-même.

Comme mentionné dans une autre réponse ici, si vous pouvez exécuter Views 3.x, alors votre meilleur pari est d'utiliser le module de vues apachesolr . Avec ce module, vous pouvez facilement définir n'importe quel nombre de chemins personnalisés pour les résultats de recherche.

Si vous ne pouvez pas exécuter 3.x, vous devrez utiliser une combinaison de modifications de formulaire (en particulier, search_form) et de rappels de menus personnalisés pour modifier avec succès le chemin de recherche par défaut.


4

Cela devrait fonctionner si vous le placez dans 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;
      }
    }
  }
}

Et puis quand vous créez une entrée de menu, vous mettez le lien vers apache solr: search / apachesolr_search /? Filters = tid: 13

Et créez un alias d'URL pour la recherche / apachesolr_search /? Filters = tid: 13 comme les produits / tv.html

Trouvé via: http://drupal.org/node/783836#comment-4136475


J'ai le sentiment que c'est pour D6. Est-il facilement adapté pour D7, comme la question posée?
pushka

3

Vous pouvez utiliser des vues solr pour votre recherche sur le site.

  1. Créez une vue solr.
  2. Ajoutez un affichage de page avec le chemin souhaité
  3. Ajoutez du texte de recherche en tant que filtre.
  4. Forme exposée en bloc
  5. Placez le bloc là où vous souhaitez que votre boîte de recherche aille.

Cela ne fonctionne pas
AnAnD


1

Qu'en est-il de la création d'un nouveau rappel de menu comme le suivant pour que apachesolr renvoie des résultats sur ce chemin?

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


0

Si vous voulez simplement changer la recherche / apachesolr_search / en quelque chose d'autre, par exemple 'inventaire', vous pouvez essayer le module de redirection globale .

L'astuce consiste à créer 2 alias - un pour la recherche / apachesolr_search / (pour les éléments à facettes) et un autre sans barre oblique (pour la page de recherche principale). La redirection globale peut refuser de créer 2 alias pour la même destination, mais vous pouvez l'insérer directement dans la base de données.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.