Mengubah url filter yang terbuka


15

Ketika saya menggunakan filter terbuka, pemilihan filter dilewatkan sebagai pasangan nama / nilai di url, misalnya:

members?field_a=valuea&field_b=valueb

Bagaimana saya mengaturnya untuk menggunakan lebih banyak url gaya "pathauto":

members/valuea/valueb

Pertanyaan yang sangat bagus AFAIK, itu tidak mungkin sampai sekarang, kecuali dengan kode. Menemukan ini yang tampaknya menyelesaikan masalah, tetapi belum mengujinya.
Countzero

Anda mengalami masalah dengan URL bersih, baca posting ini drupal.org/getting-started/clean-urls
subhojit777

1
Saya telah mengaktifkan url bersih, untuk halaman lain itu dalam notasi ramah seo, tetapi untuk filter terbuka hanya string kueri misalnya ketika saya pergi ke artikel apa pun, url ramah terhadap seo. Tolong beri tahu saya jika saya kehilangan sesuatu.
Kalpesh Patel

Saya bisa melihat mungkin ada beberapa poin untuk ini, tetapi sebelum pergi ke masalah saya benar-benar mencari bukti. Apa yang lebih penting: "URL ramah SEO" atau konten yang sesuai dengan pencarian umum? Jika halaman hasil memiliki judul yang kuat saya kira itu akan jauh lebih berharga daripada URL-nya. Saya tentu saja berkonsentrasi pada konten terlebih dahulu.
Alfred Armstrong

Jawaban:


9

Seorang kolega saya membuat modul yang disebut data jalur beberapa waktu lalu. Niatnya adalah untuk memecahkan masalah ini. Sayangnya ternyata bertentangan dengan alias path biasa, jadi ini akan berfungsi pada situs seperti drupal.org yang tidak menggunakan alias, tetapi akan memutus tautan pada path-alias menggunakan situs.

Saat ini, keyakinan saya bahwa satu-satunya cara umum untuk mengatasi masalah ini adalah memanipulasi URL di lapisan httpd, atau menggunakan hook_url_inbound_alter dan hook_url_outbound_alter . Anda dapat membaca lebih banyak tentang kait yang disebutkan di pertanyaan ini .

Namun, jika saya memberikan pemotretan ini sendiri, saya akan mencoba solusi khusus Views, karena masalah ini cukup umum sehingga dapat dibenarkan untuk memiliki modul untuk ini.

Di hook_views_pre_build , seseorang dapat mengambil data dari url seperti "anggota / valuea / valueb", mendorong nilai-nilai ini ke $ _GET ['q'], biarkan tampilan membangun kueri itu dengan melihat argumen get "di url", lalu mungkin menghapusnya lagi di hook_views_post_build .


Terima kasih. Itu tidak terlihat sepele. Saya terutama menginginkannya untuk keperluan SEO karena spider mesin pencari tidak merangkak melewati formulir. Saya mungkin hanya menggunakan tampilan kedua dengan filter kontekstual dan menanamkan blok filter terbuka saya. Maka saya hanya perlu beberapa javascript untuk mendapatkan filter terbuka untuk tampilan asli saya.
uwe

hmm, jika saya melakukan itu saya bisa menggunakan javascript untuk mengubah bentuk DAPATKAN url dari halaman? name1 = value1 & name2 = value2 ke halaman / value1 / value2 stackoverflow.com/questions/5815995/… . Jika javascript dinonaktifkan, saya memiliki tampilan asli sebagai cadangan.
uwe

@letharion: tidak melihat dukungan untuk Drupal 7.
Bereaksi Pengembang

4

Ada modul, Parameter Parameter ke URL , yang baru-baru ini saya rilis yang membahas masalah yang Anda uraikan:

Modul ini memberikan kemampuan untuk menulis ulang parameter kueri URL menjadi komponen Bersihkan URL pada jalur yang ditentukan.

Anda bisa mengonfigurasi jalur mana yang harus memiliki argumen kueri ditulis ulang sebagai komponen URL bersih menggunakan ekspresi reguler sederhana, atau dengan menerapkan kait modul.

Dengan begitu Anda dapat mengubah URL filter yang terpapar Views

http://example-site.com/events?field_category_id[0[=100&field_category_id 1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe

ke dalam http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/field_author_surname/0__Doe

Di bawahnya menggunakan hook_url_inbound_alter, hook_url_outbound_alter, dan hook_init dengan pengalihan jika diperlukan.


Bagaimana dengan Drupal 8?
InspiredCoder

1

Filter terbuka adalah formulir, yang berarti bahwa tempat mereka mengarahkan ulang (atribut "aksi"), perlu diketahui sebelum pengguna akan memilih opsi apa pun. Jadi kami tidak dapat mengalihkannya ke URL cantik yang berisi informasi tentang pilihannya. Penanganannya:

  1. JavaScript. Gunakan JavaScript untuk mengubah atribut "aksi" cepat dari formulir filter terbuka berdasarkan pilihan yang dipilih pengguna, dan atur "aksi" ke URL tampilan yang tepat dengan konfigurasi filter kontekstual yang tepat. Tapi saya ragu itu akan "SEO friendly" kalau begitu (tolong seseorang koreksi saya jika saya salah).

  2. Lakukan pengalihan ganda. Dengan menggunakan hook_form_alter, setelah mendapatkan formulir, redirect pengguna ke url tampilan yang tepat, dengan filter kontekstual yang tepat dikonfigurasi, berdasarkan inputnya. Ini mungkin sebenarnya memerlukan konfirmasi pengguna pada beberapa browser, sehingga mungkin sangat menjengkelkan.

Dalam kedua metode di atas, Anda perlu menggunakan https://drupal.org/project/views_expost untuk mengubah metode formulir-formulir tersebut menjadi POST, sehingga variabel tidak akan mencemari URL pengguna.

Intinya adalah bahwa jika Anda perlu memiliki url cantik dengan filter terbuka - Anda mungkin melakukan sesuatu yang salah. Karena saya pikir mereka hanya untuk memfilter data, dan tidak boleh digunakan untuk mendefinisikan halaman baru di situs web. Jika Anda memerlukannya - Anda dapat membuat tampilan yang dikonfigurasikan menjadi menu, dan url di menu itu, akan mengarahkan pengguna ke tampilan yang sama seperti sekarang, tetapi dengan filter kontekstual yang berbeda.


1

Dari perspektif pemrograman , Anda selalu dapat menggunakan hook_url_inbound_alter () dan hook_url_outbound_alter () kait untuk itu.

Anda dapat mencoba modul Query Parameters To URL atau jika Anda menggunakan API Pencarian dan Aspek , Anda dapat menggunakan Facet API Cukup Paths .

Anda juga dapat mengonversi tampilan Anda untuk menggunakan argumen di jalur Anda dan menggunakan Redirect modul .

Selain di atas, tidak ada cara mudah untuk mencapai itu, karena masih ada fitur yang tertunda untuk Drupal 8; lihat Izinkan string kueri dalam alias URL .

Saat Anda menggunakan panel yang menggunakan tampilan dan dalam contoh filter yang lebih baik, Anda dapat melakukan beberapa peretasan seperti (contoh URL: / panel_url? Kategori = 123):

/**
 * Implements hook_url_inbound_alter().
 */
function foo_url_outbound_alter(&$path, &$options, $original_path) {
  if (arg(0) == 'panel_url') {
    // Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
    $path_info = parse_url($path);
    switch (@$path_info['path']) {
      case 'panel_url/term_name':
      case 'panel_url/term_name2':
        $path = 'panel_url/all'; // Convert loopy urls into base url
    }
    if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
      list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
      $term_name = strtolower(taxonomy_term_load((int)$tid)->name);
      $path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
    }
  }
}

Untuk informasi lebih lanjut, silakan lihat Melewati Argumen dari URL di Panel untuk Lihat Panel atau Blokir .

Terakhir, Anda dapat menggunakan hook_menu () untuk menentukan panggilan balik menu khusus dan memuat tampilan Anda secara terprogram.


-1

Anda dapat menggunakan kode berikut.

function hook_form_alter(&$form, &$form_state, $form_id) {   
  if ($form_id == "abcd") {
    $form['#submit'] = array('custom_search_redirect');
  }
}


function custom_search_redirect($form, &$form_state) {  
  $form_state['redirect'] = "members/valuea/valueb;
}

Tampilan tidak mengetahui url baru dengan solusi Anda !!
prabeen giri
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.