Suche nur nach der aktuell aktiven Sprache


23

Wie kann ich die Ergebnisse einer Standardsuche in Drupal 7 einschränken, damit nur die Knoten in der aktuellen Sprache angezeigt werden?

Meine Website verfügt über einen dreisprachigen Umschalter. Der Benutzer wählt aus, welche Sprache er beim Anzeigen der Site verwenden möchte. Wenn er etwas sucht, bringt die Ergebnisseite Ergebnisse aus anderen Sprachen. Heute habe ich nur 3 aktivierte Sprachen, aber wir planen, dies auf 6 oder mehr zu erweitern.

Antworten:


2

Sie können das globale verwenden, um $languagezu wissen, in welcher Sprache Sie sich befinden. In Ansichten können Sie nach "Inhalt: Sprache -> aktuelle Benutzersprache" filtern.


3
wie hilft das Könnten Sie die Suchseite durch einen Knoten ersetzen? Hat dies irgendwelche Nachteile?
Jumper

25

Es gibt einen sehr eleganten Weg, dies mit dem scheinbar undokumentierten zu tun 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);
  }
}

Hinweis: Dieser Code basiert zu 100% auf der ausgezeichneten Suchkonfiguration Modul .

Sprache des Benutzers vs. Inhalt

Bei einigen Websites ist die Spracherkennung möglicherweise so konfiguriert, dass die Benutzeroberfläche in der vom Benutzer bevorzugten Sprache angezeigt wird, während der Seiteninhalt anhand der URL oder der Inhaltssprache angezeigt wird.

In diesem Fall sollten Sie eine Ersetzung in Betracht ziehen

$language = i18n_language_interface();

mit

$language = i18n_language_content();

Funktioniert einwandfrei, wirkt sich dies jedoch auf alle Abfragen auf der Website aus, z. B. auf Abfragen, die aus dem Ansichtsmodul generiert wurden, oder auf alle auf Drupal basierenden Abfragen anstelle der Standardeinstellung "search / node /%"?
Mohamad Salama

@mohamadsalama Dies wirkt sich auf alle Suchanfragen aus, die sich auf den Knotenzugriff auswirken. Mit anderen Worten, die meisten Ansichten-Abfragen sollten betroffen sein, es sei denn, Sie deaktivieren die Knotenzugriffsüberprüfungen in den erweiterten Einstellungen ("aus dem Kopf" und "unbestätigt").
Alex Weber

Dies ist kein undokumentierter Hook, sondern der Hook_query_TAG_alter (), bei dem das Tag 'node_access' lautet. Mein eigener Code prüft auch, ob die Abfrage noch keine Sprachbedingung enthält, ansonsten aber ziemlich ähnlich ist.
John Fiala

4

Ich hatte die gleichen Anforderungen und benutzte das Modul Benutzerdefinierte Suche , das ein Untermodul namens Benutzerdefinierte Suche Internationalisierung enthält : " Suche nach Inhalten aus allen oder nur aus der aktuellen Sprache und Übersetzung aller Labels und Selektoren " (beachten Sie, dass dieses Modul auch einige andere nützliche Funktionen bietet Funktionen wie benutzerdefinierte Suchblöcke). Funktioniert perfekt.


0

Ich bin mir nicht sicher, ob der Suchkern dies unterstützt.

Ich sehe das Projekt i18nluceneapi aber es unterstützt momentan Version 7 nicht.

Ich benutze searchapi und erstelle Facetten Sprache :). Es kann für Ihren Fall verwendet werden, um Facetten und Standardfilter auf der Suchseite zu erstellen.


0

Sie können das Display Suite-Modul verwenden, in dem Sie die Option Ansichtsmodus-> Sprache auswählen können, mit der die Suchergebnisse in der aktuellen Sprache der aktuellen Site-Sprache angezeigt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.