我创建了一个视图页面,默认显示所有工作项目缩略图,然后页面上包含一个过滤视图的块(但不使用ajax),它只是将公司名称添加到URL中并过滤使用上下文过滤器。网格中的缩略图将您带到项目节点页面。我想在www.sitename.com/work上的所有网址中加入过滤器侧边栏块,以便工作和工作。 work / companyname /但不在节点页面www.sitename.com/work/companyname/projectname。
我已经在路径字段中尝试了所有可能的方法。
work
work/*
work/*/~
work/*/~/
work/*/~/~
无论如何在所有路径工作/公司名称中包含此块,但不是更深层次吗?
答案 0 :(得分:0)
您可以启用核心PHP过滤器模块。然后你可以使用php设置块可见性,例如使用preg_match()。
如果您对正则表达式不确定,请查看http://www.regextester.com/。
EG在admin和admin / structure中显示块,但不显示admin / structure / blocks等:
<?php
return preg_match('/^admin(\/structure)?(\/)?$/', $_GET['q']);;
?>
答案 1 :(得分:0)
您要寻找的是对glob(https://github.com/begin/globbing#wildcards)的支持。不幸的是,Drupal不支持开箱即用。
在现代的全球化实现中,*
可以匹配除/
以外的任何字符,而**
可以匹配包括/
的任何字符。
要实现这一支持,需要:
查看PathMatcher
(core/lib/Drupal/Core/Path/PathMatcher.php)服务如何与路径匹配。
将其扩展到自己的自定义服务中,其中仅matchPath()
将被覆盖。
用下面的代码替换matchPath()
的内容(这是原始matchPath()
的副本,但有一些改动)。
更改了包含的服务以使用您的自定义路径匹配(仅适用于阻止网站或整个网站)。
更新块的配置,以将**
用于完整路径匹配,将*
仅用于子路径。
/**
* {@inheritdoc}
*/
public function matchPath($path, $patterns) {
if (!isset($this->regexes[$patterns])) {
// Convert path settings to a regular expression.
$to_replace = [
// Replace newlines with a logical 'or'.
'/(\r\n?|\n)/',
'/\\\\\*\\\\\*/',
// Quote asterisks.
'/\\\\\*/',
// Quote <front> keyword.
'/(^|\|)\\\\<front\\\\>($|\|)/',
];
$replacements = [
'|',
'.*',
'[^\/]*',
'\1' . preg_quote($this->getFrontPagePath(), '/') . '\2',
];
$patterns_quoted = preg_quote($patterns, '/');
$this->regexes[$patterns] = '/^(' . preg_replace($to_replace, $replacements, $patterns_quoted) . ')$/';
}
return (bool) preg_match($this->regexes[$patterns], $path);
}
请注意,此代码仅添加了额外的令牌替换**
并更改了*
令牌的功能(/
以外的任何字符)。