Açıkta kalan bir filtre kullandığımda, filtre seçimi url'de ad / değer çifti olarak geçirilir, örneğin:
members?field_a=valuea&field_b=valueb
Nasıl daha "pathauto" tarzı bir url kullanmak için ayarlayabilirsiniz:
members/valuea/valueb
Açıkta kalan bir filtre kullandığımda, filtre seçimi url'de ad / değer çifti olarak geçirilir, örneğin:
members?field_a=valuea&field_b=valueb
Nasıl daha "pathauto" tarzı bir url kullanmak için ayarlayabilirsiniz:
members/valuea/valueb
Yanıtlar:
Bir meslektaşım bir süre önce yol verisi adlı bir modül oluşturdu . Niyeti bu sorunu çözmekti. Ne yazık ki bu drupal.org adlar kullanmayan Böyle bir sitede çalışacaktır ancak bu yüzden, düzenli yol isimleriniz ile çakışan ortaya çıkmıştır edecek siteyi kullanarak bir yol-takma bağlantıları bölünürler.
Şu anda, bu sorunu çözmenin tek genel yolunun httpd katmanındaki URL'leri değiştirmek veya hook_url_inbound_alter ve hook_url_outbound_alter kullanmak olduğuna inanıyorum . Bu soruda belirtilen kancalar hakkında biraz daha bilgi edinebilirsiniz .
Ancak, bunu kendim başka bir çekim yapacak olsaydım, Görünümler'e özel bir çözüm denerdim, çünkü bu sorun bunun için bir modülün haklı gösterilebileceği kadar yaygın.
In hook_views_pre_build , bir, "üyeler / DEĞERİa KESİNLİK / VALUE Milyar" gibi bir url verileri ele geçirebilir $ _GET [ 'q'] bu değerleri itin görünümler 's sorgu "url" olsun argümanları görerek oluşsun, sonra muhtemelen bunları kaldırmak tekrar hook_views_post_build içinde .
Kısa bir süre önce açıkladığınız sorunu gideren URL'ye Sorgu Parametreleri modülü var :
Bu modül, URL sorgu parametrelerini belirtilen yollardaki URL'leri Temizle bileşenlerine yeniden yazma olanağı sağlar.
Hangi yolların sorgu bağımsız değişkenlerini basit bir normal ifade kullanarak veya bir modül kancası uygulayarak temiz URL bileşenleri olarak yeniden yazılması gerektiğini yapılandırabilirsiniz.
Bu şekilde, Views açıklamalı filtre URL'sini
http://example-site.com/events?field_category_id[0 Cialis=100&field_category_id 1 = 101 & field_author_name [0] = John ve field_author_surname [0] = Doe
Altında hook_url_inbound_alter, hook_url_outbound_alter ve gerektiğinde yönlendirmelerle hook_init kullanılır.
Açıkta kalan filtreler formlardır, yani yönlendirme yaptıkları yerin ("eylem" özniteliği) kullanıcı herhangi bir seçeneği seçmeden önce bilinmesi gerekir. Bu yüzden onu, seçimi hakkında bilgi içeren güzel bir URL'ye yönlendiremeyiz. Geçici çözümler:
JavaScript. Kullanıcının seçtiği seçeneklere bağlı olarak, açıkta kalan filtre formunun anında "action" özelliğini değiştirmek için JavaScript kullanın ve uygun bağlamsal filtreler yapılandırılmış olarak uygun görünümün URL'sine "action" seçeneğini ayarlayın. Ama o zaman "SEO dostu" olacağını şüpheliyim (yanlış biri varsa lütfen beni düzeltmek).
Çift yönlendirme yapın. Hook_form_alter kullanarak, formu aldıktan sonra, girdisini temel alarak uygun bağlamsal filtreler yapılandırılmış olarak kullanıcıyı uygun görünümün URL'sine yönlendirin. Bu aslında bazı tarayıcılarda bir kullanıcı onayı gerektirebilir, bu yüzden son derece can sıkıcı olabilir.
Yukarıdaki her iki yöntemde de, bu formların yöntemini POST olarak değiştirmek için https://drupal.org/project/views_expost kullanmanız gerekir , böylece değişkenler kullanıcıların URL'sini kirletmez.
Sonuç olarak, açık filtrelerle güzel URL'lere ihtiyacınız varsa - muhtemelen yanlış bir şey yapıyorsunuzdur. Çünkü sadece verileri filtrelemek için olduğunu ve web sitesinde yeni sayfalar tanımlamak için kullanılmaması gerektiğini düşünüyorum. Buna ihtiyacınız varsa - bir menü olarak yapılandırılmış bir görünüm oluşturabilir ve bu menüdeki URL'ler, kullanıcıyı şu anki görünümüne, ancak farklı bağlamsal filtrelerle yönlendirir.
Programlı bakış açısından, bunun için her zaman hook_url_inbound_alter () ve hook_url_outbound_alter () kancalarını kullanabilirsiniz.
Parametreleri URL modülüne Sorgulamayı deneyebilirsiniz veya Arama API'sı ve Özelliklerini kullanıyorsanız, Faset API'si Güzel Yolları'nı kullanabilirsiniz .
Ayrıca görünümünüzü yolunuzdaki bağımsız değişkenleri kullanmaya ve Yönlendirme modülünü kullanmaya dönüştürebilirsiniz .
Yukarıdakilerin dışında, Drupal 8 için hala bekleyen bir özellik olduğu için bunu başarmanın kolay bir yolu yoktur; bkz . URL takma adlarında sorgu dizelerine izin verme .
Görünümler kullanan ve örneğin daha iyi pozlanmış filtreler kullanan paneller kullanırken, (URL örneği: / panel_url? Category = 123) gibi birkaç saldırı yapabilirsiniz:
/**
* 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']
}
}
}
Daha fazla bilgi için, bkz. Argüman'ı Paneldeki URL'den Görüntüleme Bölmesine veya Engellemeye Geçme .
Son olarak, özel menü geri çağrılarınızı tanımlamak ve görünümünüzü programlı olarak yüklemek için hook_menu () kullanabilirsiniz .
Aşağıdaki kodu kullanabilirsiniz.
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;
}