Buscar solo el idioma activo actualmente

23

¿Cómo puedo restringir los resultados de una búsqueda predeterminada en Drupal 7, para traer solo los nodos que están en el idioma actual?

Mi sitio web tiene un conmutador de tres idiomas; el usuario elige qué idioma quiere usar cuando ve el sitio. Si busca algo, la página de resultados traerá resultados de otros idiomas. Hoy solo tengo 3 idiomas habilitados, pero planeamos expandir esto a 6 o más.

Israel Rodriguez
fuente

Respuestas:

2

Puede usar el global $languagepara saber en qué idioma se encuentra. En Vistas, puede filtrar usando "contenido: idioma -> idioma del usuario actual".

Ahmed
fuente
3
¿Cómo ayuda esto? ¿podría reemplazar la página de búsqueda con un nodo? ¿Tiene esto algún inconveniente?
puente
25

Hay una forma realmente elegante de hacer esto usando el aparentemente indocumentado hook_query_node_access_alter():

function yourmodule_query_node_access_alter(QueryAlterableInterface $query) {
  $search = FALSE;
  $node = FALSE;

  // Even though we know the node alias is going to be "n", by checking for the
  // search_index table we make sure we're on the search page. Omitting this step will
  // break the default admin/content page.
  foreach ($query->getTables() as $alias => $table) {
    if ($table['table'] == 'search_index') {
      $search = $alias;
    }
    elseif ($table['table'] == 'node') {
      $node = $alias;
    }
  }

  // Make sure we're on the search page.
  if ($node && $search) {
    $db_and = db_and();
    // I guess you *could* use global $language here instead but this is safer.
    $language = i18n_language_interface();
    $lang = $language->language;

    $db_and->condition($node . '.language', $lang, '=');
    $query->condition($db_and);
  }
}

Nota: este código se basa 100% en el excelente módulo de configuración de búsqueda .

Lenguaje de usuario vs contenido

Algunos sitios pueden tener la detección de idioma configurada para mostrar la interfaz en el idioma preferido del usuario, mientras que el contenido de la página se muestra en función de la URL o el idioma del contenido.

En ese caso, considere reemplazar

$language = i18n_language_interface();

con

$language = i18n_language_content();
Alex Weber
fuente
Funciona perfecto, pero ¿afectará cualquier consulta en el sitio, como la consulta generada desde el módulo de vistas o cualquier consulta basada en drupal en lugar de la "búsqueda / nodo /%" predeterminada?
mohamad salama
@mohamadsalama esto afectará todas las consultas de búsqueda que afecten el acceso a los nodos; en otras palabras, la mayoría de las consultas de vistas deberían verse afectadas a menos que desactive específicamente las comprobaciones de acceso a nodos en la configuración avanzada (fuera de mi cabeza y sin confirmar).
Alex Weber
Este no es un enlace indocumentado: en realidad es el enlace hook_query_TAG_alter (), donde la etiqueta es 'node_access'. Mi propio código también verifica que no haya una condición de idioma en la consulta, pero por lo demás es bastante similar.
John Fiala
4

Tenía los mismos requisitos, y utilicé el módulo de búsqueda personalizada , que incluye un submódulo llamado Internacionalización de búsqueda personalizada : " buscar contenido de todo o solo el idioma actual, y todo el manejo de la traducción de etiquetas y selectores " (tenga en cuenta que este módulo también proporciona varios otros útiles características como bloques de búsqueda personalizados). Funciona perfectamente.

Kojo
fuente
0

No estoy seguro de que el núcleo de búsqueda lo soporte.

Veo el proyecto i18nluceneapi pero no es compatible con la versión 7 en este momento.

Estoy usando searchapi y creo facetas Language :). Se puede usar para su caso, crear facetas y filtro predeterminado en la página de búsqueda.

Sang Le Thanh
fuente
0

Puede usar el módulo de la suite de visualización donde puede elegir la opción Modo de visualización-> Idioma que proporciona los resultados de búsqueda en el idioma actual que está en el idioma actual del sitio.

Akshay Sawant
fuente