Cerca solo per la lingua attualmente attiva


23

Come posso limitare i risultati da una ricerca predefinita in Drupal 7, per portare solo i nodi che sono nella lingua corrente?

Il mio sito Web ha un commutatore in tre lingue; l'utente sceglie quale lingua desidera utilizzare durante la visualizzazione del sito. Se cerca qualcosa, la pagina dei risultati porta risultati da altre lingue. Oggi ho solo 3 lingue abilitate, ma prevediamo di estenderlo a 6 o più.

Risposte:


2

Puoi usare il globale $languageper sapere in quale lingua sei. In Views, puoi filtrare usando "content: language -> lingua dell'utente corrente".


3
come aiuta questo? potresti sostituire la pagina di ricerca con un nodo? ci sono degli svantaggi?
maglione

25

C'è un modo davvero elegante per farlo usando l'apparentemente non documentato 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: questo codice è basato al 100% sull'eccellente modulo Search Config .

Lingua dell'utente vs contenuto

Alcuni siti potrebbero avere il rilevamento della lingua configurato per mostrare l'interfaccia nella lingua preferita dell'utente, mentre il contenuto della pagina viene mostrato in base all'URL o alla lingua del contenuto.

In tal caso, considerare la sostituzione

$language = i18n_language_interface();

con

$language = i18n_language_content();

Funziona perfettamente, ma influenzerà qualsiasi query sul sito, come la query generata dal modulo views, o qualsiasi query drupal basata anziché la "ricerca / nodo /%" predefinita?
Mohamad Salama,

@mohamadsalama questo influenzerà tutte le query di ricerca che influenzano l'accesso al nodo; in altre parole, la maggior parte delle query sulle viste dovrebbe essere influenzata a meno che non si disabiliti specificamente i controlli di accesso ai nodi nelle impostazioni avanzate (fuori dalla mia testa e non confermate).
Alex Weber,

Questo non è un hook non documentato - è in realtà l'hook hook_query_TAG_alter (), dove il tag è 'node_access'. Il mio codice verifica anche che non ci sia già una condizione linguistica nella query, ma per il resto è abbastanza simile.
John Fiala,

4

Avevo gli stessi requisiti e ho usato il modulo di ricerca personalizzato , che include un sottomodulo chiamato internazionalizzazione della ricerca personalizzata : " cerca contenuti da tutte o solo la lingua corrente e tutta la gestione della traduzione di etichette e selettori " (nota che questo modulo fornisce anche molti altri utili funzioni come blocchi di ricerca personalizzati). Funziona perfettamente.


0

Non sono sicuro che il core di ricerca lo supporti.

Vedo il progetto i18nluceneapi ma al momento non supporta la versione 7.

Sto usando searchapi e creo sfaccettature Lingua :). Può utilizzare per il tuo caso, creare sfaccettature e filtro predefinito nella pagina di ricerca.


0

È possibile utilizzare il modulo Suite display in cui è possibile scegliere l'opzione Visualizza modalità-> Lingua che fornisce i risultati della ricerca nella lingua corrente che si trova nella lingua corrente del sito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.