Szukaj tylko aktualnie aktywnego języka

23

Jak mogę ograniczyć wyniki wyszukiwania domyślnego w Drupal 7, aby wyświetlać tylko te węzły, które są w bieżącym języku?

Moja strona ma przełącznik trzech języków; użytkownik wybiera język, którego chce używać podczas przeglądania strony. Jeśli czegoś szuka, strona wyników przynosi wyniki z innych języków. Dzisiaj mam tylko 3 włączone języki, ale planujemy rozszerzyć to do 6 lub więcej.

Israel Rodriguez
źródło

Odpowiedzi:

2

Możesz użyć globalnego, $languageaby wiedzieć, w jakim języku jesteś. W Widokach możesz filtrować, używając „content: language -> current language language”.

Ahmed
źródło
3
jak to pomaga? czy możesz zamienić stronę wyszukiwania na węzeł? czy ma to jakieś wady?
skoczek
25

Istnieje naprawdę elegancki sposób na zrobienie tego za pomocą pozornie nieudokumentowanej 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);
  }
}

Uwaga: ten kod jest w 100% oparty na doskonałym module Search Config .

Język użytkownika a treść

Niektóre witryny mogą mieć skonfigurowane wykrywanie języka, aby wyświetlać interfejs w preferowanym języku użytkownika, podczas gdy zawartość strony jest wyświetlana na podstawie adresu URL lub języka treści.

W takim przypadku rozważ wymianę

$language = i18n_language_interface();

z

$language = i18n_language_content();
Alex Weber
źródło
Działa idealnie, ale czy wpłynie na każde zapytanie na stronie, takie jak zapytanie wygenerowane z modułu widoków, lub dowolne oparte zapytanie drupal, zamiast domyślnego „search / node /%”?
mohamad salama
@mohamadsalama wpłynie to na wszystkie zapytania, które wpływają na dostęp do węzła; innymi słowy, powinno to wpłynąć na większość widoków, chyba że wyraźnie wyłączysz sprawdzanie dostępu do węzła w ustawieniach zaawansowanych (z góry mojej głowy i niepotwierdzone).
Alex Weber
To nie jest nieudokumentowany hook - to właściwie hook_query_TAG_alter () hook, w którym znacznikiem jest „node_access”. Mój własny kod sprawdza również, czy w zapytaniu nie ma już warunku językowego, ale poza tym jest całkiem podobny.
John Fiala
4

Miałem te same wymagania i korzystałem z niestandardowego modułu wyszukiwania , który zawiera podmoduł o nazwie Niestandardowa wyszukiwarka internacjonalizacji : „ przeszukuj treść ze wszystkich lub tylko bieżącego języka oraz wszystkie funkcje tłumaczenia etykiet i selektorów ” (zwróć uwagę, że moduł ten zawiera również kilka innych pomocnych funkcje takie jak niestandardowe bloki wyszukiwania). Działa świetnie.

Kojo
źródło
0

Nie wiem, czy wyszukiwarka obsługuje to.

Widzę projekt i18nluceneapi, ale obecnie nie obsługuje on wersji 7.

Używam searchapi i tworzę aspekty Język :). Może używać dla twojego przypadku, tworzyć aspekty i domyślny filtr na stronie wyszukiwania.

Śpiewał Le Thanh
źródło
0

Możesz użyć modułu wyświetlacza, w którym możesz wybrać opcję Tryb widoku-> Język, który daje wyniki wyszukiwania w bieżącym języku, który jest w bieżącym języku strony.

Akshay Sawant
źródło