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
Antworten:
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 .
quelle
Es gibt ein Modul, Abfrageparameter für URL , das ich kürzlich veröffentlicht habe und das das von Ihnen beschriebene Problem behebt:
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.
quelle
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:
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).
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.
quelle
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):
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.
quelle
Sie können den folgenden Code verwenden.
quelle