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
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
Respostas:
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 .
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
Embaixo, ele usa hook_url_inbound_alter, hook_url_outbound_alter e hook_init com redirecionamentos, quando necessário.
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:
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).
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.
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.
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;
}