Açıkta kalan filtrenin URL'sini değiştirme


15

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

Mükemmel soru. AFAIK, şu an için mümkün değil, kod hariç. Bulunan bu sorunu çözmek için bir tavır sergileyen ancak henüz test etmedi.
Countzero

Temiz URL ile ilgili sorunlarınız var, bu
yazıyı

1
Temiz url etkin, diğer sayfalar için seo dostu gösterimde, ancak maruz kalan filtre için sadece herhangi bir makaleye gitmek, örneğin url seo dostu sorgu dize. Bir şey eksik olup olmadığımı lütfen bize bildirin.
Kalpesh Patel

Bunun bir anlamı olabileceğini görebiliyorum, ama belaya gitmeden önce aslında kanıt ararım. Daha da önemlisi: "SEO dostu bir URL" veya yaygın aramalara karşılık gelen içerik? Bir sonuç sayfasının güçlü bir başlığı varsa, bunun URL'sinden çok daha değerli olacağını düşünüyorum. Her halükarda, öncelikle içeriğe konsantre olurdum.
Alfred Armstrong

Yanıtlar:


9

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 .


Teşekkürler. Önemsiz görünmüyor. Arama motoru örümcekleri bir formu geçmiş tarama çünkü esas olarak SEO amaçlı istiyorum. Bağlamsal filtrelerle ikinci bir görünüm kullanabilir ve açıkta kalan filtre bloğumu gömebilirim. Sonra maruz kalan filtre orijinal görünümüme göndermek için sadece bazı javascript gerekir.
Uwe

hmm, bunu yaparsam, sayfa? isim1 = değer1 & ad2 = değer2 sayfa / değer1 / değer2 stackoverflow.com/questions/5815995/… GET url biçimini değiştirmek için javascript kullanabilirsiniz . Javascript devre dışı bırakıldıysa, orijinal görünümümü yedek olarak görüyorum.
uwe

@letharion: Drupal 7 için herhangi bir destek görmüyor
React Developer

4

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

içine http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/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.


Drupal 8 ne olacak?
InspiredCoder

1

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:

  1. 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).

  2. Ç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.


1

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 .


-1

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;
}

Views sizin çözüm ile yeni url farkında değil !!
prabeen giri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.