Cambio de URL del filtro expuesto


15

Cuando utilicé un filtro expuesto, la selección de filtro se pasa como un par de nombre / valor en la url, por ejemplo:

members?field_a=valuea&field_b=valueb

¿Cómo puedo configurarlo para usar más de una URL de estilo "pathauto":

members/valuea/valueb

Excelente pregunta AFAIK, no es posible a partir de ahora, excepto con el código. Encontré esto que parece resolver el problema, pero aún no lo probé.
Countzero

Tiene problemas con una URL limpia, lea esta publicación drupal.org/getting-started/clean-urls
subhojit777

1
Tengo la URL limpia habilitada, para otras páginas está en notación seo amigable, pero para el filtro expuesto solo es una cadena de consulta, por ejemplo, cuando voy a cualquier artículo, la url es seo amigable. Avísame si me falta algo.
Kalpesh Patel

Puedo ver que puede haber algún punto en esto, pero antes de meterme en el problema realmente buscaría evidencia. ¿Qué es más importante: una "URL amigable para SEO" o contenido que corresponda a búsquedas comunes? Si una página de resultados tiene un título sólido, sospecho que será mucho más valioso que su URL. Sin duda me concentraría en el contenido primero, en cualquier caso.
Alfred Armstrong

Respuestas:


9

Un colega mío creó un módulo llamado datos de ruta hace un tiempo. Su intención era resolver este mismo problema. Por desgracia, ha resultado que entra en conflicto con los alias de ruta normal, por lo que funciona en un sitio como drupal.org que no utiliza los alias, pero será romper enlaces en un camino-alias utilizando el sitio.

Actualmente, creo que la única forma genérica de resolver este problema es manipulando las URL en la capa httpd o utilizando hook_url_inbound_alter y hook_url_outbound_alter . Puede leer un poco más sobre los ganchos mencionados en esta pregunta .

Sin embargo, si tuviera que darle otra oportunidad a mí mismo, intentaría una solución específica de Vistas, ya que este problema es lo suficientemente común como para justificar tener un módulo para esto.

En hook_views_pre_build , uno podría tomar datos de una url como "members / valuea / valueb", insertar estos valores en $ _GET ['q'], permitir que las vistas construyan su consulta viendo los argumentos de obtención "en la url", y luego posiblemente eliminarlos de nuevo en hook_views_post_build .


Gracias. No parece trivial. Principalmente lo quiero para fines de SEO porque las arañas de los motores de búsqueda no se arrastran más allá de un formulario. Podría usar una segunda vista con filtros contextuales e incrustar mi bloque de filtro expuesto. Entonces solo necesito algunos javascript para que el filtro expuesto se envíe a mi vista original.
Uwe

hmm, si hago eso podría usar javascript para modificar el formulario OBTENER URL desde la página? name1 = value1 & name2 = value2 a la página / value1 / value2 stackoverflow.com/questions/5815995/… . Si JavaScript está deshabilitado, tengo mi vista original como alternativa.
Uwe

@letharion: no se ve ningún soporte para Drupal 7.
React Developer

4

Hay un módulo, Parámetros de consulta a URL , que lancé recientemente que aborda el problema que está describiendo:

Este módulo proporciona la capacidad de reescribir parámetros de consulta de URL en componentes de URL limpia en rutas especificadas.

Puede configurar qué rutas deben reescribir sus argumentos de consulta como componentes URL limpios utilizando una expresión regular simple o implementando un enlace de módulo.

De esa manera puede transformar una URL de filtro expuesta Vistas como

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

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

Debajo usa hook_url_inbound_alter, hook_url_outbound_alter y hook_init con redireccionamientos cuando sea necesario.


¿Qué hay de Drupal 8?
InspiredCoder

1

Los filtros expuestos son formularios, lo que significa que el lugar donde se redirige (atributo "acción") debe conocerse antes de que el usuario elija cualquier opción. Por lo tanto, no podemos redirigirlo a ninguna URL bonita que contenga información sobre su elección. Las soluciones alternativas:

  1. JavaScript Use JavaScript para alterar sobre la marcha el atributo "acción" del formulario de filtro expuesto según las opciones que elija el usuario, y establezca "acción" en la URL de la vista adecuada con los filtros contextuales adecuados configurados. Pero dudo que sea "SEO amigable" (por favor, alguien me corrija si me equivoco).

  2. Haz doble redireccionamiento. Al usar hook_form_alter, después de obtener el formulario, redirija al usuario a la URL de la vista adecuada, con los filtros contextuales configurados, en función de su entrada. Esto puede necesitar una confirmación del usuario en algunos navegadores, por lo que puede ser extremadamente molesto.

En los dos métodos anteriores, deberá usar https://drupal.org/project/views_expost para cambiar el método de esos formularios a POST, de modo que las variables no contaminen la URL de los usuarios.

La conclusión es que si necesita tener URL bonitas con filtros expuestos, probablemente esté haciendo algo mal. Porque creo que son solo para filtrar datos y no deberían usarse para definir nuevas páginas en el sitio web. Si lo necesita, puede crear una vista configurada para ser un menú, y las URL en ese menú redirigen al usuario a la misma vista que es ahora, pero con diferentes filtros contextuales.


1

Desde el punto de vista programático, siempre puedes usar hook_url_inbound_alter () y hook_url_outbound_alter () para eso.

Puede intentar consultar el módulo Parámetros de consulta a URL o si está utilizando Search API y Facets , puede usar Facet API Pretty Paths .

También puede convertir su vista para usar argumentos en su ruta y usar el módulo Redirigir .

Aparte de lo anterior, no hay una manera fácil de lograrlo, ya que todavía hay una característica pendiente para Drupal 8; consulte Permitir cadenas de consulta en alias de URL .

Cuando usa paneles que usan vistas y, por ejemplo, mejores filtros expuestos, puede hacer algunos trucos como (ejemplo de 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']
    }
  }
}

Para obtener más información, consulte Pasar argumento desde la URL en el Panel para ver el Panel o Bloquear .

Finalmente, puede usar hook_menu () para definir sus devoluciones de llamada de menú personalizadas y cargar su vista mediante programación.


-1

Puedes usar el siguiente código.

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 no conoce la nueva URL con tu solución!
prabeen giri
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.