it-swarm.com.de

URL des exponierten Filters ändern

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

members?field_a=valuea&field_b=valueb

Wie kann ich es so einrichten, dass es eher eine URL im "Pathauto" -Stil verwendet:

members/valuea/valueb
15
uwe

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 regulären Pfad-Aliasen in Konflikt steht, sodass es auf einer Site wie drupal.org funktioniert, die keine Aliase verwendet, aber Unterbrechen von Links auf einem Pfadalias mithilfe der Site.

Derzeit glaube ich, dass die einzige generische Möglichkeit, dieses Problem zu lösen, darin besteht, entweder die URLs auf der httpd-Ebene zu manipulieren oder hook_url_inbound_alter und hook_url_outbound_alter zu verwenden. Sie können etwas mehr über die genannten Hooks lesen bei dieser Frage .

Wenn ich dies jedoch selbst noch einmal fotografieren würde, würde ich stattdessen eine Views-spezifische Lösung versuchen, da dieses Problem häufig genug ist, 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/valueea/valueb" übernehmen. Schieben Sie diese Werte in $ _GET ['q'] url ", dann entfernen Sie sie möglicherweise wieder in hook_views_post_build .

9
Letharion

Es gibt ein Modul Query Parameters To URL , das ich kürzlich veröffentlicht habe und das das von Ihnen beschriebene Problem behebt:

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

Sie können konfigurieren, für welche Pfade die Abfrageargumente als saubere URL-Komponenten neu geschrieben werden sollen, indem Sie einen einfachen regulären Ausdruck verwenden oder einen Modul-Hook implementieren.

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

http://example-site.com/events?field_category_id [0] = 100 & field_category_id1 = 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 Weiterleitungen verwendet, falls erforderlich.

4
Placinta

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

  1. JavaScript. Verwenden Sie JavaScript, um das Attribut "Aktion" des exponierten Filterformulars basierend auf den vom Benutzer ausgewählten Optionen im laufenden Betrieb zu ändern, und setzen Sie "Aktion" 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. Wenn Sie hook_form_alter verwenden, leiten Sie den Benutzer nach dem Abrufen des Formulars zur URL der richtigen Ansicht um, wobei die richtigen Kontextfilter basierend auf seiner Eingabe konfiguriert sind. In einigen Browsern ist möglicherweise eine Benutzerbestätigung erforderlich, sodass dies äußerst ärgerlich sein kann.

In 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 des Benutzers 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 der Website verwendet werden sollten. Wenn Sie dies benötigen, können Sie eine Ansicht erstellen, die als Menü konfiguriert ist, und URLs in diesem Menü leiten den Benutzer zu derselben Ansicht um, die er jetzt ist, jedoch mit unterschiedlichen Kontextfiltern.

1
Łukasz Zaroda

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

Sie können versuchen, das Modul Parameter zu URL abfragen zu testen, oder wenn Sie Such-API und Facetten verwenden, können Sie Facet API Pretty Paths .

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

Abgesehen davon gibt es keine einfache Möglichkeit, dies zu erreichen, da die Funktion für Drupal 8; siehe Abfragezeichenfolgen in URL-Aliasen zulassen noch aussteht.

Wenn Sie Panels verwenden, die Ansichten und beispielsweise besser exponierte Filter verwenden, können Sie einige Hacks ausführen, 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 des Arguments von der URL im Bedienfeld an das Ansichtsfenster oder den Block .

Schließlich können Sie hook_menu () verwenden, um Ihre benutzerdefinierten Menürückrufe zu definieren und Ihre Ansicht programmgesteuert zu laden.

1
kenorb