更改暴露的过滤器的网址


15

当我使用暴露的过滤器时,过滤器选择作为名称/值对在url中传递,例如:

members?field_a=valuea&field_b=valueb

如何设置它以使用更多的“ pathauto”样式的网址:

members/valuea/valueb

很好的问题。AFAIK,除代码外,目前尚不可能。发现似乎可以解决问题,但尚未对其进行测试。
Countzero

您在使用干净的URL时遇到问题,请阅读这篇文章drupal.org/getting-started/clean-urls
subhojit777

1
我启用了干净的url,对于其他页面,它采用seo友好表示法,但是仅对于公开的过滤器,它是查询字符串,例如,当我进入任何文章时,URL都是seo友好的。如果我缺少什么,请告诉我。
Kalpesh Patel 2013年

我可以看到这可能有一点意义,但是在进行麻烦之前,我实际上会先寻找证据。更重要的是:“ SEO友好的URL”或与常见搜索相对应的内容?如果结果页的标题很醒目,我怀疑它的价值要比其URL贵得多。无论如何,我当然会首先专注于内容。
2013年

Answers:


9

我的一位同事不久前创建了一个称为路径数据的模块。他的意图是解决这个问题。不幸的是,事实证明,它与常规路径别名冲突,因此它将在不使用别名的drupal.org这样的网站上运行,但中断使用该网站的路径别名上的链接。

目前,我认为解决此问题的唯一通用方法是在httpd层上操纵URL,或者使用hook_url_inbound_alterhook_url_outbound_alter。您可以在这个问题上阅读更多有关上述钩子的信息。

但是,如果我要自己再拍一张,我会尝试使用特定于Views的解决方案,因为这个问题很常见,因此有理由为此提供一个模块。

hook_views_pre_build中,可以从诸如“ members / valuea / valueb”之类的URL中获取数据,将这些值推入$ _GET ['q'],让视图构建它的查询,查看“在URL中”的get参数,然后可能将其删除再次在hook_views_post_build中


谢谢。它看起来并不琐碎。我主要是出于SEO目的,因为搜索引擎蜘蛛不会爬过表单。我可能只是将第二个视图与上下文过滤器一起使用,并嵌入暴露的过滤器块。然后,我只需要一些JavaScript,即可将公开的过滤器提交到我的原始视图。
uwe 2012年

嗯,如果我这样做,我可以使用JavaScript从网页?名1 =值1&2 =值2页/值1 /值2修改形式获取URL stackoverflow.com/questions/5815995/...。如果禁用了javascript,我的原始视图将作为备用。
uwe 2012年

@letharion:是不看为Drupal 7.任何支持
阵营开发者

4

我最近发布了一个模块Query Parameters To URL,用于解决您所描述的问题:

此模块提供将URL查询参数重写为指定路径上的Clean URL组件的功能。

您可以使用简单的正则表达式或通过实现模块挂钩,配置哪些路径应将其查询参数重写为干净的URL组件。

这样,您可以像

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

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

在其下方使用了hook_url_inbound_alter,hook_url_outbound_alter和hook_init,并在必要时进行重定向。


那Drupal 8呢?
InspiredCoder

1

公开的过滤器是表单,这意味着在用户选择任何选项之前,需要知道它们重定向的位置(“动作”属性)。因此,我们无法将他重定向到任何包含有关他的选择的信息的漂亮URL。解决方法:

  1. JavaScript。使用JavaScript根据用户选择的选项即时更改公开的过滤器表单的“操作”属性,并将“操作”设置为配置了适当的上下文过滤器的适当视图的URL。但是我怀疑那将是“ SEO友好的”(如果我错了,请有人纠正我)。

  2. 进行双重重定向。通过使用hook_form_alter,在获取表单后,根据用户的输入将用户重定向到适当视图的url,并配置适当的上下文过滤器。实际上,这可能需要在某些浏览器上进行用户确认,因此可能非常烦人。

在以上两种方法中,您都需要使用https://drupal.org/project/views_expost将这些表单的方法更改为POST,因此变量不会污染用户的URL。

底线是,如果您需要带有暴露的过滤器的漂亮网址,则可能是您做错了什么。因为我认为它们仅用于过滤数据,而不应用于在网站上定义新页面。如果需要-可以创建一个配置为菜单的视图,并在该菜单中创建URL,可以将用户重定向到他现在所在的同一视图,但具有不同的上下文过滤器。


1

从程序角度来看,您始终可以使用hook_url_inbound_alter()hook_url_outbound_alter()挂钩。

您可以尝试将参数查询到URL模块,或者如果您使用的是Search APIFacets,则可以使用Facet API Pretty Paths

您还可以将视图转换为在路径中使用参数并使用重定向模块。

除了上述以外,没有简单的方法可以实现这一点,因为Drupal 8仍然有待处理的功能。请参阅允许URL别名中的查询字符串

当您使用的面板使用视图并且在示例中使用更好的公开过滤器时,您可以进行一些黑客攻击,例如(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']
    }
  }
}

有关更多信息,请参见从面板中的URL传递参数到“视图窗格”或“阻止”

最后,您可以使用hook_menu()定义自定义菜单回调并以编程方式加载视图。


-1

您可以使用以下代码。

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;
}

视图不知道您的解决方案中的新网址!!
prabeen giri 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.