web-dev-qa-db-fra.com

Changer l'URL du filtre exposé

Lorsque j'ai utilisé un filtre exposé, la sélection du filtre est transmise sous forme de paire nom/valeur dans l'URL, par exemple:

members?field_a=valuea&field_b=valueb

Comment puis-je le configurer pour utiliser plus d'une URL de style "pathauto":

members/valuea/valueb
15
uwe

Un de mes collègues a créé un module appelé données de chemin il y a quelque temps. Son intention était de résoudre ce problème même. Malheureusement, il s'est avéré qu'il est en conflit avec les alias de chemin réguliers, donc cela fonctionnera sur un site comme drupal.org qui n'utilise pas d'alias, mais le fera rompre les liens sur un alias de chemin à l'aide du site.

Actuellement, je pense que la seule façon générique de résoudre ce problème consiste à manipuler les URL au niveau de la couche httpd ou à utiliser hook_url_inbound_alter et hook_url_outbound_alter . Vous pouvez lire un peu plus sur les crochets mentionnés à cette question .

Cependant, si je devais donner à moi-même une autre séance photo, j'essaierais plutôt une solution spécifique à Views, car ce problème est assez courant pour qu'il soit justifié d'avoir un module pour cela.

Dans hook_views_pre_build , on pourrait prendre les données d'une URL comme "members/valuea/valueb", pousser ces valeurs dans $ _GET ['q'], laisser les vues construire sa requête en voyant les arguments get "dans le url ", puis éventuellement les supprimer à nouveau dans hook_views_post_build .

9
Letharion

Il y a un module, Query Parameters To URL , que j'ai récemment publié et qui résout le problème que vous décrivez:

Ce module offre la possibilité de réécrire les paramètres de requête d'URL dans les composants Clean URL sur des chemins spécifiés.

Vous pouvez configurer quels chemins doivent voir leurs arguments de requête réécrits en tant que composants d'URL propres à l'aide d'une simple expression régulière ou en implémentant un hook de module.

De cette façon, vous pouvez transformer une URL de filtre exposée Views comme

http://example-site.com/events?field_category_id [0] = 100 & field_category_id1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe

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

En dessous, il utilise hook_url_inbound_alter, hook_url_outbound_alter et hook_init avec des redirections si nécessaire.

4
Placinta

Les filtres exposés sont des formulaires, ce qui signifie que l'endroit où ils redirigent (attribut "action"), doit être connu avant que l'utilisateur ne choisisse une option. Nous ne pouvons donc pas le rediriger vers une jolie URL contenant des informations sur son choix. Les solutions:

  1. JavaScript. Utilisez JavaScript pour modifier à la volée l'attribut "action" du formulaire de filtre exposé en fonction des options choisies par l'utilisateur, et définissez "action" sur l'URL de la vue appropriée avec les filtres contextuels appropriés configurés. Mais je doute que ce soit "SEO friendly" (alors corrigez-moi si je me trompe).

  2. Faites une double redirection. En utilisant hook_form_alter, après avoir obtenu le formulaire, redirigez l'utilisateur vers l'URL de la bonne vue, avec les filtres contextuels appropriés configurés, en fonction de son entrée. Cela peut en fait nécessiter une confirmation de l'utilisateur sur certains navigateurs, donc cela peut être extrêmement ennuyeux.

Dans les deux méthodes ci-dessus, vous devez utiliser https://drupal.org/project/views_expost pour changer la méthode de ces formulaires en POST, afin que les variables ne polluent pas l'URL des utilisateurs.

L'essentiel est que si vous avez besoin d'avoir de jolies URL avec des filtres exposés - vous faites probablement quelque chose de mal. Parce que je pense qu'ils sont juste pour filtrer les données et ne doivent pas être utilisés pour définir de nouvelles pages sur le site Web. Si vous en avez besoin - vous pouvez créer une vue configurée pour être un menu, et les URL dans ce menu, redirigeraient l'utilisateur vers la même vue qu'il est maintenant, mais avec des filtres contextuels différents.

1
Łukasz Zaroda

Du point de vue de la programmation, vous pouvez toujours utiliser hook_url_inbound_alter () et hook_url_outbound_alter () hooks pour cela.

Vous pouvez essayer le module Query Parameters To URL ou si vous utilisez Search API and Facets , vous pouvez utiliser API Facet Pretty Paths .

Vous pouvez également convertir votre vue pour utiliser des arguments dans votre chemin et utiliser le module Redirect .

En dehors de ce qui précède, il n'y a pas de moyen facile d'y parvenir, car il existe encore une fonctionnalité en attente pour Drupal 8; voir Autoriser les chaînes de requête dans les alias d'URL .

Lorsque vous utilisez des panneaux qui utilisent des vues et, par exemple, des filtres mieux exposés, vous pouvez faire quelques hacks comme (exemple d'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']
    }
  }
}

Pour plus d'informations, veuillez consulter Passer l'argument de l'URL dans le panneau vers le volet ou le bloc d'affichage .

Enfin, vous pouvez utiliser hook_menu () pour définir vos rappels de menu personnalisés et charger votre vue par programme.

1
kenorb