Rechercher uniquement la langue actuellement active

23

Comment puis-je restreindre les résultats d'une recherche par défaut dans Drupal 7, pour n'apporter que les nœuds qui sont dans la langue actuelle?

Mon site Web a un commutateur en trois langues; l'utilisateur choisit la langue qu'il souhaite utiliser lors de la consultation du site. S'il recherche quelque chose, la page de résultats affiche les résultats d'autres langues. Aujourd'hui, je n'ai que 3 langues activées, mais nous prévoyons de l'étendre à 6 ou plus.

Israel Rodriguez
la source

Réponses:

2

Vous pouvez utiliser le global $languagepour savoir dans quelle langue vous êtes. Dans Views, vous pouvez filtrer en utilisant "content: language -> current user language".

Ahmed
la source
3
comment cela aide-t-il? pourriez-vous remplacer la page de recherche par un nœud? cela a-t-il des inconvénients?
cavalier
25

Il existe une façon très élégante de le faire en utilisant le document apparemment non documenté 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);
  }
}

Remarque: ce code est basé à 100% sur l'excellent module Search Config .

Utilisateur vs langue du contenu

Certains sites peuvent avoir la détection de la langue configurée pour afficher l'interface dans la langue préférée de l'utilisateur, tandis que le contenu de la page est affiché en fonction de l'URL ou de la langue du contenu.

Dans ce cas, envisagez de remplacer

$language = i18n_language_interface();

avec

$language = i18n_language_content();
Alex Weber
la source
Fonctionne parfaitement, mais cela affectera-t-il toute requête sur le site, comme la requête générée à partir du module de vues, ou toute requête drupal basée plutôt que la recherche par défaut / nœud /%?
mohamad salama du
@mohamadsalama, cela affectera toutes les requêtes de recherche qui affectent l'accès aux nœuds; en d'autres termes, la plupart des requêtes de vues doivent être affectées, sauf si vous désactivez spécifiquement les vérifications d'accès aux nœuds dans les paramètres avancés (sur le dessus de ma tête et non confirmés).
Alex Weber
Ce n'est pas un hook non documenté - c'est en fait le hook hook_query_TAG_alter (), où la balise est 'node_access'. Mon propre code vérifie également qu'il n'y a pas déjà de condition de langue dans la requête, mais sinon, il est assez similaire.
John Fiala
4

J'avais les mêmes exigences, et j'ai utilisé le module de recherche personnalisée , qui comprend un sous-module appelé Internationalisation de la recherche personnalisée : " recherche de contenu à partir de toutes les langues ou de la langue actuelle uniquement, et de tous les libellés et sélecteurs de gestion de la traduction " (notez que ce module fournit également plusieurs autres informations utiles fonctionnalités telles que les blocs de recherche personnalisés). Fonctionne parfaitement.

Kojo
la source
0

Je ne suis pas sûr que le noyau de recherche le supporte.

Je vois le projet i18nluceneapi mais il ne prend pas en charge la version 7 pour le moment.

J'utilise searchapi et crée des facettes Language :). Il peut utiliser pour votre cas, créer des facettes et un filtre par défaut sur la page de recherche.

Sang Le Thanh
la source
0

Vous pouvez utiliser le module de la suite d'affichage où vous pouvez choisir l'option Mode d'affichage-> Langue qui donne les résultats de la recherche dans la langue actuelle qui est dans la langue actuelle du site.

Akshay Sawant
la source