¿Cómo puedo cambiar la ruta de URL predeterminada de Apache Solr de "search / apachesolr_search / term" a otra?
¿Cómo puedo cambiar la ruta de URL predeterminada de Apache Solr de "search / apachesolr_search / term" a otra?
Respuestas:
La forma en que normalmente lo he hecho es implementar hook_menu_alter (). Luego puede personalizar la URL de la manera exacta que elija:
/**
* 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']);
}
}
No es trivial cambiar la ruta de búsqueda si solo está utilizando el módulo de búsqueda apachesolr. Como depende del módulo de búsqueda principal, la ruta está casi codificada. Depende de la búsqueda / {module} /% menu_tail. Si observa search_view () , la devolución de llamada para el módulo de búsqueda, encontrará que llama a search_get_keys () , que espera que las claves de búsqueda estén en una parte particular de la ruta. El módulo de búsqueda apachesolr también usa esta función para obtener claves, por lo que implementar un simple hook_menu_alter () no funcionará por sí solo.
Como se menciona en otra respuesta aquí, si puede ejecutar Views 3.x, entonces su mejor opción es utilizar el módulo de vistas apachesolr . Con este módulo, puede definir fácilmente cualquier número de rutas personalizadas para los resultados de búsqueda.
Si no puede ejecutar 3.x, deberá usar una combinación de formulario alter (específicamente, search_form) y devoluciones de llamada de menú personalizadas para cambiar con éxito la ruta de búsqueda predeterminada.
Esto debería funcionar si lo coloca en 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;
}
}
}
}
Y luego, cuando crea una entrada de menú, coloca el enlace a apache solr: search / apachesolr_search /? Filters = tid: 13
Y cree un alias de url para search / apachesolr_search /? Filters = tid: 13 like products / tv.html
Encontrado a través de: http://drupal.org/node/783836#comment-4136475
Podrías usar vistas solr para la búsqueda de tu sitio.
Consulte Agregar rutas de búsqueda personalizadas con hook_menu por los chicos de Evolving Web. Habla sobre cómo escribieron un módulo personalizado para crear URL amigables para sus búsquedas de Solr. Probablemente necesites modificarlo un poco, pero es un buen punto de partida.
¿Qué pasa con la creación de una nueva devolución de llamada de menú como la siguiente para hacer que apachesolr devuelva resultados en esa ruta?
$menu['search']['page callback'] = 'apachesolr_search_view';
O simplemente puede modificar un módulo contribuido que hace esto: Apache Solr Custom Path .
Si solo desea cambiar search / apachesolr_search / a otra cosa, por ejemplo 'inventario', puede probar el módulo de redireccionamiento global .
El truco consiste en crear 2 alias: uno para búsqueda / apachesolr_search / (para elementos facetados) y otro sin barra diagonal (para la página de búsqueda principal). La redirección global puede negarse a crear 2 alias para el mismo destino, pero puede insertarlo directamente en la base de datos.