Changer l'url du filtre exposé

15

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
uwe
la source
Excellente question. AFAIK, ce n'est pas possible pour l'instant, sauf avec le code. J'ai trouvé cela qui semble résoudre le problème, mais je ne l'ai pas encore testé.
Countzero
Vous rencontrez des problèmes avec une URL propre, lisez cet article drupal.org/getting-started/clean-urls
subhojit777
1
J'ai l'URL propre activée, pour les autres pages, elle est en notation conviviale pour le référencement, mais pour le filtre exposé, seule sa chaîne de requête, par exemple lorsque je vais à un article, l'URL est conviviale pour le référencement. Veuillez me faire savoir si je manque quelque chose.
Kalpesh Patel
Je peux voir qu'il peut y avoir un certain point à cela, mais avant d'aller vers le pétrin, je chercherais en fait des preuves. Qu'est-ce qui compte le plus: une "URL SEO-friendly" ou un contenu qui correspond aux recherches courantes? Si une page de résultats a un titre fort, je soupçonne que ce sera beaucoup plus précieux que son URL. Je me concentrerais certainement d'abord sur le contenu, en tout cas.
Alfred Armstrong

Réponses:

9

Un de mes collègues a créé un module appelé données de chemin . Son intention était de résoudre ce problème même. Malheureusement , il est avéré qu'il est en conflit avec des alias de chemin réguliers, il travaillera sur un site comme drupal.org qui n'utilise pas des alias, mais va rompre les liens sur un chemin alias en utilisant le 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 l'url", puis éventuellement les supprimer à nouveau dans hook_views_post_build .

Létharion
la source
Merci. Ça n'a pas l'air banal. Je le veux principalement à des fins de référencement, car les araignées des moteurs de recherche ne rampent pas devant un formulaire. Je pourrais simplement utiliser une deuxième vue avec des filtres contextuels et intégrer mon bloc de filtres exposé. Ensuite, j'ai juste besoin de javascript pour que le filtre exposé soit soumis à ma vue d'origine.
uwe
hmm, si je fais cela, je pourrais utiliser javascript pour modifier le formulaire GET url de la page? name1 = value1 & name2 = value2 à page / value1 / value2 stackoverflow.com/questions/5815995/… . Si javascript est désactivé, j'ai ma vue d'origine comme solution de rechange.
2012
@letharion: ne voit aucun support pour Drupal 7.
React Developer
4

Il y a un module, Query Parameters To URL , que j'ai récemment publié, 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 des 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 expression régulière simple 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_id 1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe

sur 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.

Placinta
la source
Et Drupal 8?
InspiredCoder
1

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 (veuillez me corriger 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.

Łukasz Zaroda
la source
1

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

Vous pouvez essayer les paramètres de requête dans le module URL ou si vous utilisez l' API de recherche et les facettes , vous pouvez utiliser les jolis chemins de l'API de facette .

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

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 un argument à partir d'une URL dans le panneau pour afficher le volet ou le bloc .

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

Kenorb
la source
-1

Vous pouvez utiliser le code suivant.

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
la source
Views n'a pas connaissance de la nouvelle URL avec votre solution !!
prabeen giri