Zmiana adresu URL odsłoniętego filtra

15

Kiedy użyłem odsłoniętego filtra, wybór filtra jest przekazywany jako para nazwa / wartość w adresie URL, na przykład:

members?field_a=valuea&field_b=valueb

Jak mogę go skonfigurować, aby używał więcej adresów URL w stylu „pathauto”:

members/valuea/valueb
uwe
źródło
Doskonałe pytanie. AFAIK, na razie nie jest możliwe, z wyjątkiem kodu. Znalazłem to, co wydaje się rozwiązać problem, ale jeszcze go nie przetestowałem.
Countzero,
Masz problemy z czystym adresem URL, przeczytaj ten post drupal.org/getting-started/clean-urls
subhojit777
1
Mam włączony czysty adres URL, dla innych stron jest on zapisany w sposób przyjazny dla SEO, ale dla odsłoniętego filtru tylko jego ciąg zapytania, np. Kiedy idę do dowolnego artykułu, URL jest przyjazny dla SEO. Daj mi znać, jeśli czegoś brakuje.
Kalpesh Patel
Widzę, że może to mieć jakiś sens, ale zanim popadnę w kłopoty, faktycznie szukam dowodów. Co jest ważniejsze: „przyjazny dla SEO adres URL” lub treść odpowiadająca typowym wyszukiwaniom? Jeśli strona wyników ma mocny tytuł, podejrzewam, że będzie o wiele cenniejsza niż jej adres URL. W każdym razie z pewnością skoncentrowałbym się na treści.
Alfred Armstrong

Odpowiedzi:

9

Mój kolega już jakiś czas temu stworzył moduł o nazwie dane ścieżki . Jego intencją było rozwiązanie tego samego problemu. Niestety okazało się, że jest ono sprzeczne z regularnych aliasów ścieżek, więc będzie pracować na miejscu jak drupal.org że nie używa aliasy, ale będzie przerwać łącza na ścieżce-alias korzystających z serwisu.

Obecnie uważam, że jedynym ogólnym sposobem rozwiązania tego problemu jest albo manipulowanie adresami URL na warstwie httpd, albo użycie hook_url_inbound_alter i hook_url_outbound_alter . Więcej informacji na temat wspomnianych haczyków można znaleźć w tym pytaniu .

Gdybym jednak sam wykonał kolejną sesję zdjęciową, spróbowałbym zamiast tego zastosować rozwiązanie specyficzne dla Widoku, ponieważ ten problem jest na tyle powszechny, że uzasadnione jest posiadanie modułu do tego.

W hook_views_pre_build można pobrać dane z adresu URL, np. „Członkowie / wartośća / wartośćb”, wcisnąć te wartości do $ _GET ['q'], pozwolić widokom zbudować zapytanie, wyświetlając argumenty „w adresie URL”, a następnie usunąć je ponownie w hook_views_post_build .

Letharion
źródło
dzięki. Nie wygląda to banalnie. Chcę go głównie do celów SEO, ponieważ pająki wyszukiwarek nie czołgają się poza formularzem. Mogę po prostu użyć drugiego widoku z filtrami kontekstowymi i osadzić odsłonięty blok filtrów. Następnie potrzebuję tylko JavaScript, aby odsłonięty filtr został przesłany do mojego oryginalnego widoku.
uwe
hmm, jeśli to zrobię, że mogę użyć javascript, aby zmodyfikować url forma dostać od strony? nazwa1 = wartość1 i nazwa2 = wartość2 do strony / wartosc1 / value2 stackoverflow.com/questions/5815995/... . Jeśli javascript jest wyłączony, mam oryginalny widok jako rezerwowy.
uwe
@letharion: nie widzi żadnego wsparcia dla Drupala 7.
React Developer
4

Istnieje moduł Query Parameters To URL , który niedawno wydałem, który rozwiązuje opisywany przez Ciebie problem:

Ten moduł umożliwia przepisanie parametrów zapytań URL na komponenty Wyczyść URL na określonych ścieżkach.

Za pomocą prostego wyrażenia regularnego lub za pomocą haka modułu można skonfigurować, które ścieżki powinny zostać przepisane jako czyste komponenty URL.

W ten sposób możesz przekształcić URL odsłoniętego filtru Wyświetlenia

http://example-site.com/events?field_category_id[0]=100&field_category_id 1 = 101 i nazwa_autora_pola [0] = John i nazwa_autora_pola [0] = Łania

na http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/field_author_sename/0__Doe

Pod nim używa hook_url_inbound_alter, hook_url_outbound_alter i hook_init z przekierowaniami, jeśli to konieczne.

Placinta
źródło
Co z Drupalem 8?
InspiredCoder
1

Odsłonięte filtry to formularze, co oznacza, że ​​miejsce, do którego przekierowują (atrybut „akcji”), musi być znane, zanim użytkownik wybierze jakąkolwiek opcję. Nie możemy więc przekierowywać go do żadnego ładnego adresu URL zawierającego informacje o jego wyborze. Obejścia:

  1. JavaScript. Użyj JavaScript, aby zmieniać na bieżąco atrybut „akcji” odsłoniętej formy filtra w oparciu o opcje, które wybrał użytkownik, i ustaw „akcję” na adres URL odpowiedniego widoku z skonfigurowanymi odpowiednimi filtrami kontekstowymi. Ale wątpię, czy byłoby to „przyjazne SEO” (proszę, popraw mnie, jeśli się mylę).

  2. Wykonaj podwójne przekierowanie. Korzystając z hook_form_alter, po uzyskaniu formularza przekieruj użytkownika na adres URL odpowiedniego widoku, z skonfigurowanymi właściwymi filtrami kontekstowymi, na podstawie jego danych wejściowych. Może to wymagać potwierdzenia użytkownika w niektórych przeglądarkach, więc może być bardzo irytujące.

W obu powyższych metodach należy użyć https://drupal.org/project/views_expost, aby zmienić metodę tych formularzy na POST, aby zmienne nie zanieczyszczały adresów URL użytkowników.

Najważniejsze jest to, że jeśli potrzebujesz ładnych adresów URL z widocznymi filtrami - prawdopodobnie robisz coś złego. Ponieważ uważam, że służą one wyłącznie do filtrowania danych i nie powinny być używane do definiowania nowych stron w witrynie. Jeśli potrzebujesz - możesz utworzyć widok skonfigurowany jako menu, a adresy URL w tym menu przekierowują użytkownika do tego samego widoku, którym jest teraz, ale z różnymi filtrami kontekstowymi.

Łukasz Zaroda
źródło
1

Z perspektywy programowej zawsze możesz do tego użyć hook_url_inbound_alter () i hook_url_outbound_alter () .

Możesz wypróbować parametry zapytania do modułu URL lub jeśli korzystasz z interfejsu API wyszukiwania i aspektów , możesz użyć ładnych ścieżek interfejsu API Facet .

Możesz także przekonwertować widok, aby użyć argumentów na swojej ścieżce i użyć modułu Przekierowanie .

Poza powyższym nie ma łatwego sposobu na osiągnięcie tego, ponieważ Drupal 8 wciąż czeka na udostępnienie; zobacz Zezwalaj na ciągi zapytań w aliasach URL .

Kiedy używasz paneli, które używają widoków, a na przykład lepiej widocznych filtrów, możesz zrobić kilka hacków takich jak (przykład URL: / panel_url? Category = 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']
    }
  }
}

Aby uzyskać więcej informacji, zobacz Przekazywanie argumentów z adresu URL w panelu do okienka lub bloku .

Na koniec możesz użyć hook_menu (), aby zdefiniować własne wywołania zwrotne menu i załadować programowo widok.

kenorb
źródło
-1

Możesz użyć następującego kodu.

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;
}
Mahipal Purohit
źródło
Widoki nie są świadome nowego adresu URL z Twoim rozwiązaniem !!
prabeen giri