Alteração do URL do filtro exposto

15

Quando usei um filtro exposto, a seleção do filtro é passada como par de nome / valor no URL, por exemplo:

members?field_a=valuea&field_b=valueb

Como posso configurá-lo para usar mais um URL de estilo "pathauto":

members/valuea/valueb
uwe
fonte
Excelente pergunta. AFAIK, não é possível a partir de agora, exceto com o código. Encontrei isso que parece resolver o problema, mas ainda não o testou.
Countzero
Você está tendo problemas com URL limpo, leia este post drupal.org/getting-started/clean-urls
subhojit777
11
Eu tenho o URL limpo ativado, para outras páginas é uma notação amigável seo, mas para o filtro exposto apenas a string de consulta, por exemplo, quando vou a qualquer artigo, o URL é amigável. Informe-me se estiver faltando alguma coisa.
Kalpesh Patel
Eu posso ver que pode haver algum ponto para isso, mas antes de começar o problema, eu realmente procurava evidências. O que importa mais: um "URL otimizado para SEO" ou conteúdo que corresponda a pesquisas comuns? Se uma página de resultados tiver um título forte, suspeito que será muito mais valioso que o URL. Eu certamente me concentraria no conteúdo primeiro, em qualquer caso.
Alfred Armstrong

Respostas:

9

Um colega meu criou um módulo chamado path data há um tempo. Sua intenção era resolver esse mesmo problema. Infelizmente, revelou-se que está em conflito com aliases de caminho regulares, por isso vai trabalhar em um site como drupal.org que não usa aliases, mas vai quebrar ligações em um caminho-alias usando site.

Atualmente, acredito que a única maneira genérica de resolver esse problema é manipular os URLs na camada httpd ou usar hook_url_inbound_alter e hook_url_outbound_alter . Você pode ler um pouco mais sobre os ganchos mencionados nesta pergunta .

No entanto, se eu mesmo tentasse fazer outra tentativa, tentaria uma solução específica para o Views, pois esse problema é comum o suficiente para justificar a existência de um módulo para isso.

Em hook_views_pre_build , pode-se obter dados de uma URL como "members / valuea / valueb", inserir esses valores em $ _GET ['q'], permitir que as visualizações construam sua consulta, vendo os argumentos get "na url" e possivelmente removê-los novamente em hook_views_post_build .

Letharion
fonte
obrigado. Não parece trivial. Eu o quero principalmente para fins de SEO, porque as aranhas dos mecanismos de pesquisa não passam por um formulário. Eu poderia apenas usar uma segunda exibição com filtros contextuais e incorporar meu bloco de filtro exposto. Então, só preciso de algum javascript para que o filtro exposto seja submetido à minha visualização original.
Uwe
hmm, se eu fizer isso, eu poderia usar o javascript para modificar o formulário GET url da página? nome1 = valor1 & nome2 = valor2 para a página / valor1 / valor2 stackoverflow.com/questions/5815995/… . Se o javascript estiver desativado, tenho minha visão original como substituta.
Uwe
@letharion: é não ver qualquer apoio para Drupal 7.
Reagir desenvolvedor
4

Há um módulo, Query Parameters To URL , lançado recentemente, que aborda o problema que você está descrevendo:

Este módulo fornece a capacidade de reescrever os parâmetros de consulta da URL em componentes de URL limpa nos caminhos especificados.

Você pode configurar quais caminhos devem ter seus argumentos de consulta reescritos como componentes de URL limpos usando uma expressão regular simples ou implementando um gancho de módulo.

Dessa forma, você pode transformar um URL de filtro exposto do Views, como

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

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

Embaixo, ele usa hook_url_inbound_alter, hook_url_outbound_alter e hook_init com redirecionamentos, quando necessário.

Placinta
fonte
E o Drupal 8?
InspiredCoder
1

Filtros expostos são formulários, o que significa que o local para o qual eles estão redirecionando (atributo "ação") precisa ser conhecido antes que o usuário escolha qualquer opção. Portanto, não podemos redirecioná-lo para qualquer URL bonita que contenha informações sobre sua escolha. As soluções alternativas:

  1. JavaScript. Use JavaScript para alterar o atributo "action" instantâneo do formulário de filtro exposto com base nas opções escolhidas pelo usuário e defina "action" como URL da visualização adequada com os filtros contextuais adequados configurados. Mas eu duvido que seria "SEO amigável" então (por favor, alguém me corrija se eu estiver errado).

  2. Redirecione duas vezes. Usando hook_form_alter, depois de obter o formulário, redirecione o usuário para o URL da visualização adequada, com os filtros contextuais adequados configurados, com base em sua entrada. Isso pode realmente precisar de uma confirmação do usuário em alguns navegadores, por isso pode ser extremamente irritante.

Nos dois métodos acima, você precisaria usar https://drupal.org/project/views_expost para alterar o método desses formulários para POST, para que as variáveis ​​não poluam a URL dos usuários.

O ponto principal é que, se você precisa ter URLs bonitas com filtros expostos - provavelmente está fazendo algo errado. Porque acho que são apenas para filtrar dados e não devem ser usados ​​para definir novas páginas no site. Se você precisar disso - poderá criar uma visualização configurada para ser um menu e os URLs nesse menu redirecionarão o usuário para a mesma visualização que ele é agora, mas com filtros contextuais diferentes.

Łukasz Zaroda
fonte
1

Da perspectiva programática, você sempre pode usar os ganchos hook_url_inbound_alter () e hook_url_outbound_alter () para isso.

Você pode tentar Query Parameters To URL module ou se estiver usando a API de pesquisa e as facetas , poderá usar os Caminhos bonitos da API de faceta .

Você também pode converter sua visualização para usar argumentos em seu caminho e usar o módulo Redirecionar .

Além do exposto, não há uma maneira fácil de conseguir isso, pois ainda existe um recurso pendente para o Drupal 8; consulte Permitir cadeias de consulta em aliases de URL .

Ao usar painéis que usam visualizações e, por exemplo, filtros melhor expostos, você pode fazer alguns hacks como (exemplo 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 obter mais informações, consulte Passando argumento de URL no painel para exibir painel ou bloco .

Por fim, você pode usar hook_menu () para definir seus retornos de chamada de menu personalizados e carregar sua visualização programaticamente.

kenorb
fonte
-1

Você pode usar o seguinte 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;
}
Mahipal Purohit
fonte
O Views não conhece o novo URL da sua solução!
Prabeen giri 17/07/2014