Ändern der URL des freigelegten Filters


15

Wenn ich einen exponierten Filter verwendet habe, wird die Filterauswahl als Name / Wert-Paar in der URL übergeben, zum Beispiel:

members?field_a=valuea&field_b=valueb

Wie kann ich es einrichten, um mehr von einer "Pathauto" -Stil-URL zu verwenden:

members/valuea/valueb

Hervorragende Frage. AFAIK, es ist ab sofort nicht möglich, außer mit Code. Ich habe dies gefunden, was das Problem zu lösen scheint, es aber noch nicht getestet.
Countzero

Sie haben Probleme mit sauberer URL, lesen Sie diesen Beitrag drupal.org/getting-started/clean-urls
subhojit777

1
Ich habe saubere URL aktiviert, für andere Seiten ist sie in SEO-freundlicher Notation, aber für exponierte Filter ist sie nur eine Abfragezeichenfolge, z. B. wenn ich zu einem Artikel gehe, ist URL SEO-freundlich. Bitte lassen Sie mich wissen, wenn ich etwas vermisse.
Kalpesh Patel

Ich kann sehen, dass es irgendwann einen Grund dafür gibt, aber bevor ich mich den Problemen zuwende, suche ich nach Beweisen. Was zählt mehr: eine "SEO-freundliche URL" oder Inhalte, die häufigen Suchanfragen entsprechen? Wenn eine Ergebnisseite einen starken Titel hat, ist dieser vermutlich weitaus wertvoller als die URL. Ich würde mich auf jeden Fall zuerst auf den Inhalt konzentrieren.
Alfred Armstrong

Antworten:


9

Ein Kollege von mir hat vor einiger Zeit ein Modul namens Pfaddaten erstellt . Seine Absicht war es, genau dieses Problem zu lösen. Leider hat sich herausgestellt, dass es mit regelmäßigen Weg Aliase in Konflikt, so dass es auf einer Website wie drupal.org arbeiten , die keine Aliasnamen verwenden, sondern wird auf einem Pfad-Alias brechen Links verwenden Website.

Derzeit bin ich der Meinung, dass die einzige generische Möglichkeit zur Behebung dieses Problems darin besteht, die URLs auf der httpd-Ebene zu manipulieren oder hook_url_inbound_alter und hook_url_outbound_alter zu verwenden . Zu den genannten Haken können Sie bei dieser Frage etwas mehr lesen .

Wenn ich dies jedoch selbst noch einmal versuchen würde, würde ich stattdessen eine ansichtsspezifische Lösung versuchen, da dieses Problem so häufig auftritt, dass es gerechtfertigt sein könnte, ein Modul dafür zu haben.

In hook_views_pre_build könnte man Daten von einer URL wie "members / valuea / valueb" nehmen, diese Werte in $ _GET ['q'] verschieben, Views ihre Abfrage erstellen lassen und die get-Argumente "in der URL" sehen und sie dann möglicherweise entfernen nochmal in hook_views_post_build .


Vielen Dank. Es sieht nicht trivial aus. Ich möchte es hauptsächlich für SEO-Zwecke, weil Suchmaschinen-Spinnen nicht an einem Formular vorbeischleichen. Ich verwende möglicherweise nur eine zweite Ansicht mit Kontextfiltern und binde meinen freigelegten Filterblock ein. Dann brauche ich nur etwas Javascript, damit der belichtete Filter meiner ursprünglichen Ansicht entspricht.
Uwe

hmm, wenn ich das tun würde, könnte ich Javascript verwenden, um die URL des Formulars GET von Seite? Name1 = Wert1 & Name2 = Wert2 zu Seite / Wert1 / Wert2 zu ändern . stackoverflow.com/questions/5815995/… . Wenn Javascript deaktiviert ist, habe ich meine ursprüngliche Ansicht als Fallback.
uwe

@letharion: Drupal 7 wird nicht unterstützt.
React Developer

4

Es gibt ein Modul, Abfrageparameter für URL , das ich kürzlich veröffentlicht habe und das das von Ihnen beschriebene Problem behebt:

Dieses Modul bietet die Möglichkeit, URL-Abfrageparameter in Clean URL-Komponenten auf angegebenen Pfaden umzuschreiben.

Sie können konfigurieren, für welche Pfade die Abfrageargumente mithilfe eines einfachen regulären Ausdrucks oder durch Implementierung eines Modul-Hooks als saubere URL-Komponenten umgeschrieben werden sollen.

Auf diese Weise können Sie eine sichtbare Filter-URL wie "Views" transformieren

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

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

Darunter werden hook_url_inbound_alter, hook_url_outbound_alter und hook_init mit erforderlichen Weiterleitungen verwendet.


1

Ausgestellte Filter sind Formulare. Dies bedeutet, dass der Ort, an den sie umgeleitet werden (Attribut "action"), bekannt sein muss, bevor der Benutzer eine Option auswählt. Wir können ihn also nicht zu einer hübschen URL weiterleiten, die Informationen zu seiner Wahl enthält. Die Problemumgehungen:

  1. JavaScript. Verwenden Sie JavaScript, um das Attribut "action" der angezeigten Filterform basierend auf den vom Benutzer ausgewählten Optionen zu ändern, und setzen Sie "action" auf die URL der richtigen Ansicht, wobei die richtigen Kontextfilter konfiguriert sind. Aber ich bezweifle, dass es dann "SEO-freundlich" wäre (bitte korrigiert mich jemand, wenn ich falsch liege).

  2. Führen Sie eine doppelte Umleitung durch. Indem Sie hook_form_alter verwenden, leiten Sie den Benutzer nach dem Abrufen des Formulars zur URL der richtigen Ansicht um, wobei die richtigen Kontextfilter auf der Grundlage seiner Eingabe konfiguriert werden. In einigen Browsern ist möglicherweise eine Benutzerbestätigung erforderlich, was sehr ärgerlich sein kann.

Bei beiden oben genannten Methoden müssten Sie https://drupal.org/project/views_expost verwenden , um die Methode dieser Formulare in POST zu ändern, damit Variablen die URL der Benutzer nicht verschmutzen.

Das Fazit ist, dass Sie wahrscheinlich etwas falsch machen, wenn Sie hübsche URLs mit exponierten Filtern benötigen. Weil ich denke, dass sie nur zum Filtern von Daten dienen und nicht zum Definieren neuer Seiten auf einer Website verwendet werden sollten. Wenn Sie dies benötigen, können Sie eine Ansicht erstellen, die als Menü konfiguriert ist. Über die URLs in diesem Menü wird der Benutzer zu der Ansicht weitergeleitet, die er jetzt ist, jedoch mit unterschiedlichen Kontextfiltern.


1

Aus programmatischer Sicht können Sie hierfür immer hook_url_inbound_alter () und hook_url_outbound_alter () verwenden .

Sie können versuchen, das Modul " Abfrageparameter an URL" zu verwenden. Wenn Sie die Such-API und Facetten verwenden , können Sie auch die hübschen Pfade der Facetten-API verwenden .

Sie können Ihre Ansicht auch konvertieren, um Argumente in Ihrem Pfad zu verwenden und das Umleitungsmodul zu verwenden .

Abgesehen davon gibt es keine einfache Möglichkeit, dies zu erreichen, da für Drupal 8 noch eine Funktion aussteht. Siehe Zulassen von Abfragezeichenfolgen in URL-Aliasen .

Wenn Sie Panels verwenden, die Ansichten und beispielsweise besser belichtete Filter verwenden, können Sie einige Hacks ausführen, wie z. B. (URL-Beispiel: / 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']
    }
  }
}

Weitere Informationen finden Sie unter Übergeben eines Arguments von der URL im Bedienfeld an den Ansichtsbereich oder -block .

Schließlich können Sie mit hook_menu () Ihre benutzerdefinierten Menü-Rückrufe definieren und Ihre Ansicht programmgesteuert laden.


-1

Sie können den folgenden Code verwenden.

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 ist die neue URL mit Ihrer Lösung nicht bekannt !!
Prabeen Giri
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.