Cari hanya untuk bahasa yang saat ini aktif

23

Bagaimana saya bisa membatasi hasil dari pencarian default di Drupal 7, hanya untuk membawa node yang ada dalam bahasa saat ini?

Situs web saya memiliki pengalih tiga bahasa; pengguna memilih bahasa apa yang ingin dia gunakan saat melihat situs. Jika dia mencari sesuatu, halaman hasil membawa hasil dari bahasa lain. Hari ini saya hanya memiliki 3 bahasa yang diaktifkan, tetapi kami berencana untuk memperluas ini ke 6 atau lebih.

Israel Rodriguez
sumber

Jawaban:

2

Anda dapat menggunakan global $languageuntuk mengetahui bahasa Anda. Di Tampilan, Anda dapat memfilter menggunakan "konten: bahasa -> bahasa pengguna saat ini."

Ahmed
sumber
3
bagaimana ini membantu? Bisakah Anda mengganti halaman pencarian dengan node? apakah ini memiliki kekurangan?
jumper
25

Ada cara yang sangat elegan untuk melakukan ini menggunakan dokumen yang tampaknya tidak berdokumen 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);
  }
}

Catatan: kode ini 100% berdasarkan pada modul Konfigurasi Pencarian yang sangat baik .

Bahasa Pengguna vs. Konten

Beberapa situs mungkin memiliki deteksi bahasa yang dikonfigurasi untuk menunjukkan antarmuka dalam bahasa pilihan pengguna, sementara konten halaman ditampilkan berdasarkan URL atau bahasa konten.

Dalam hal itu, pertimbangkan untuk mengganti

$language = i18n_language_interface();

dengan

$language = i18n_language_content();
Alex Weber
sumber
Berfungsi sempurna, tetapi apakah itu akan memengaruhi kueri di situs, seperti kueri yang dihasilkan dari modul tampilan, atau kueri drupal apa pun alih-alih "pencarian / simpul /%" default?
mohamad salama
@mohamadsalama ini akan memengaruhi semua permintaan pencarian yang memengaruhi akses node; dengan kata lain sebagian besar permintaan tampilan akan terpengaruh kecuali jika Anda secara khusus menonaktifkan pemeriksaan akses node di pengaturan lanjutan (dari atas kepala saya & belum dikonfirmasi).
Alex Weber
Ini bukan kait tidak berdokumen - ini sebenarnya hook_query_TAG_alter () hook, di mana tagnya adalah 'node_access'. Kode saya sendiri juga memeriksa untuk memastikan tidak ada kondisi bahasa dalam kueri, tetapi sebaliknya sangat mirip.
John Fiala
4

Saya memiliki persyaratan yang sama, dan saya menggunakan modul pencarian Kustom , yang mencakup submodule yang disebut Internasionalisasi Pencarian Kustom : " konten pencarian dari semua atau hanya bahasa saat ini, dan semua penanganan terjemahan label dan penyeleksi " (perhatikan modul ini juga menyediakan beberapa bantuan lainnya fitur seperti blok pencarian khusus). Bekerja dengan sempurna.

Kojo
sumber
0

Saya tidak yakin inti pencarian mendukungnya.

Saya melihat proyek i18nluceneapi tetapi tidak mendukung versi 7 saat ini.

Saya menggunakan searchapi dan membuat aspek Bahasa :). Ini dapat digunakan untuk kasus Anda, membuat aspek dan filter default pada halaman pencarian.

Sang Le Thanh
sumber
0

Anda dapat menggunakan modul Display suite di mana Anda dapat memilih opsi Lihat Mode-> Bahasa yang memberikan hasil pencarian dalam bahasa saat ini yang ada dalam bahasa situs saat ini.

Akshay Sawant
sumber