当我使用暴露的过滤器时,过滤器选择作为名称/值对在url中传递,例如:
members?field_a=valuea&field_b=valueb
如何设置它以使用更多的“ pathauto”样式的网址:
members/valuea/valueb
当我使用暴露的过滤器时,过滤器选择作为名称/值对在url中传递,例如:
members?field_a=valuea&field_b=valueb
如何设置它以使用更多的“ pathauto”样式的网址:
members/valuea/valueb
Answers:
我的一位同事不久前创建了一个称为路径数据的模块。他的意图是解决这个问题。不幸的是,事实证明,它与常规路径别名冲突,因此它将在不使用别名的drupal.org这样的网站上运行,但会中断使用该网站的路径别名上的链接。
目前,我认为解决此问题的唯一通用方法是在httpd层上操纵URL,或者使用hook_url_inbound_alter和hook_url_outbound_alter。您可以在这个问题上阅读更多有关上述钩子的信息。
但是,如果我要自己再拍一张,我会尝试使用特定于Views的解决方案,因为这个问题很常见,因此有理由为此提供一个模块。
在hook_views_pre_build中,可以从诸如“ members / valuea / valueb”之类的URL中获取数据,将这些值推入$ _GET ['q'],让视图构建它的查询,查看“在URL中”的get参数,然后可能将其删除再次在hook_views_post_build中。
我最近发布了一个模块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
在其下方使用了hook_url_inbound_alter,hook_url_outbound_alter和hook_init,并在必要时进行重定向。
公开的过滤器是表单,这意味着在用户选择任何选项之前,需要知道它们重定向的位置(“动作”属性)。因此,我们无法将他重定向到任何包含有关他的选择的信息的漂亮URL。解决方法:
JavaScript。使用JavaScript根据用户选择的选项即时更改公开的过滤器表单的“操作”属性,并将“操作”设置为配置了适当的上下文过滤器的适当视图的URL。但是我怀疑那将是“ SEO友好的”(如果我错了,请有人纠正我)。
进行双重重定向。通过使用hook_form_alter,在获取表单后,根据用户的输入将用户重定向到适当视图的url,并配置适当的上下文过滤器。实际上,这可能需要在某些浏览器上进行用户确认,因此可能非常烦人。
在以上两种方法中,您都需要使用https://drupal.org/project/views_expost将这些表单的方法更改为POST,因此变量不会污染用户的URL。
底线是,如果您需要带有暴露的过滤器的漂亮网址,则可能是您做错了什么。因为我认为它们仅用于过滤数据,而不应用于在网站上定义新页面。如果需要-可以创建一个配置为菜单的视图,并在该菜单中创建URL,可以将用户重定向到他现在所在的同一视图,但具有不同的上下文过滤器。
从程序角度来看,您始终可以使用hook_url_inbound_alter()和hook_url_outbound_alter()挂钩。
您可以尝试将参数查询到URL模块,或者如果您使用的是Search API和Facets,则可以使用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()定义自定义菜单回调并以编程方式加载视图。
您可以使用以下代码。
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;
}