Come posso cambiare il percorso URL predefinito di Apache Solr da "search / apachesolr_search / term" a qualcos'altro?
Come posso cambiare il percorso URL predefinito di Apache Solr da "search / apachesolr_search / term" a qualcos'altro?
Risposte:
Il modo in cui l'ho fatto di solito è implementare hook_menu_alter (). È quindi possibile personalizzare l'URL esattamente come si sceglie:
/**
* 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']);
}
}
Modificare il percorso di ricerca non è banale se si utilizza solo il modulo di ricerca apachesolr. Poiché dipende dal modulo di ricerca principale, il percorso è quasi codificato. Dipende da search / {module} /% menu_tail. Se guardi search_view () , il callback per il modulo di ricerca, scoprirai che chiama search_get_keys () , che si aspetta che le chiavi di ricerca si trovino in una parte particolare del percorso. Anche il modulo di ricerca apachesolr usa questa funzione per ottenere le chiavi, quindi implementare un semplice hook_menu_alter () non funzionerà da solo.
Come menzionato in un'altra risposta qui, se sei in grado di eseguire Views 3.x, la soluzione migliore è utilizzare il modulo views di apachesolr . Con questo modulo, è possibile definire facilmente qualsiasi numero di percorsi personalizzati per i risultati della ricerca.
Se non riesci a eseguire 3.x, dovrai utilizzare una combinazione di form alter (in particolare, search_form) e callback di menu personalizzati per modificare correttamente il percorso di ricerca predefinito.
Questo dovrebbe funzionare se lo metti in 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;
}
}
}
}
E poi quando crei una voce di menu, inserisci il link in apache solr: search / apachesolr_search /? Filters = tid: 13
E crea un alias URL per search / apachesolr_search /? Filters = tid: 13 like products / tv.html
Trovato via: http://drupal.org/node/783836#comment-4136475
È possibile utilizzare le visualizzazioni solr per la ricerca del sito.
Scopri Aggiungere percorsi di ricerca personalizzati con hook_menu dai ragazzi di Evolving Web. Parla di come hanno scritto un modulo personalizzato per creare URL amichevoli per le loro ricerche Solr. Probabilmente dovrai modificarlo un po ', ma è un buon punto di partenza.
Che ne dici di creare un nuovo callback di menu come il seguente per fare in modo che apachesolr restituisca risultati in quel percorso?
$menu['search']['page callback'] = 'apachesolr_search_view';
Oppure puoi semplicemente modificare un modulo contributivo che fa questo: Apache Solr Custom Path .
Se vuoi solo cambiare ricerca / apachesolr_search / in qualcos'altro, ad esempio "inventario", puoi provare il modulo di reindirizzamento globale .
Il trucco è creare 2 alias: uno per search / apachesolr_search / (per gli elementi sfaccettati) e un altro senza barra (per la pagina di ricerca principale). Il reindirizzamento globale potrebbe rifiutare di creare 2 alias per la stessa destinazione, ma è possibile inserirlo direttamente nel db.