0

我创建了一个视图页面,默认情况下显示所有工作项目缩略图,然后页面上包含一个块来过滤视图(但不使用 ajax)它只是将公司名称添加到 url 并使用上下文过滤器进行过滤. 网格中的缩略图将您带到项目节点页面。我想在 www.sitename.com/work 下的所有 url 上包含过滤器侧边栏块,所以 work & work/companyname/ 但不在 www.sitename.com/work/companyname/projectname 的节点页面上。

我已经尝试了在路径字段中执行此操作的所有可能方法。

work
work/*
work/*/~
work/*/~/
work/*/~/~

无论如何在所有路径工作/公司名称上都包含这个块,但不是更深?

4

2 回答 2

0

您可以启用核心 PHP 过滤器模块。然后您可以使用 php 设置块可见性,例如使用 preg_match()。

如果您不确定正则表达式,请查看http://www.regextester.com/

EG 在 admin 和 admin/structure 中显示块,但不显示 admin/structure/blocks 等:

<?php 
  return preg_match('/^admin(\/structure)?(\/)?$/', $_GET['q']);;
?>
于 2013-06-10T10:27:42.377 回答
0

您正在寻找的是对通配符的支持(https://github.com/begin/globbing#wildcards)。不幸的是,Drupal 不支持开箱即用的 globbing。

在现代通配符实现中,*将匹配除 之外的任何字符/**并将匹配任何字符,包括/.

为了实施这种支持,需要:

  1. 看看PathMatchercore/lib/Drupal/Core/Path/PathMatcher.php)服务如何匹配路径。

  2. 将其扩展到自己的自定义服务中,只会matchPath()被覆盖。

  3. 用下面的代码替换 的内容matchPath()(这是原件的副本,matchPath()有一些改动)。

  4. 更改包含的服务以使用您的自定义路径匹配(仅用于块或整个站点)。

  5. 更新块的配置以**用于完整路径匹配和*仅用于子路径。

/**
 * {@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);
}   

请注意,此代码仅添加额外的标记替换**并更改*标记的作用(除 之外的任何字符/)。

于 2019-09-23T12:05:02.590 回答