Drupal路径通配符,但不是所有级别

时间:2013-06-08 13:03:07

标签: drupal drupal-7 drupal-views drupal-theming drupal-contextual-filters

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

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

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

无论如何在所有路径工作/公司名称中包含此块,但不是更深层次吗?

2 个答案:

答案 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不支持开箱即用。

在现代的全球化实现中,*可以匹配除/以外的任何字符,而**可以匹配包括/的任何字符。

要实现这一支持,需要:

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

请注意,此代码仅添加了额外的令牌替换**并更改了*令牌的功能(/以外的任何字符)。