0

在 Drupal 块的页面可见性设置中,如果路径中的第二个值是数字,我想阻止某个块显示。这似乎对我不起作用。干杯。

仅当参数为:

domain.com/video/one(参数 0 是“视频”,参数 1 存在,而不是数字)

不显示:

domain.com/video

domain.com/video/1

<?php
  if (arg(0) == 'video' && is_nan(arg(1)) && empty(arg(2))) {
    return TRUE; 
  }
  else {
    return FALSE;
  }
?>
4

3 回答 3

1

我假设这是在 hook_block/hook_block_view 函数中?您可以尝试不同的方法:

if (preg_match('/^video\/[0-9]+$/', $_GET['q'])) {
  // Path has matched, don't show the block. Are you sure you should be returning TRUE here?
  return TRUE; 
}
else {
  // Path has matched, go ahead and show the block  
  return FALSE;
}
于 2011-08-25T19:35:23.887 回答
1

您可以简单地使用以下代码:

<?php
  $arg1 = arg(1);
  $arg2 = arg(2);
  // Check arg(1) is not empty, or is_numeric() returns TRUE for NULL.
  return (arg(0) == 'video' && !empty($arg1) && !is_numeric($arg1) && empty($arg2));
?>

正如 KingCrunch 已经说过的,当它的参数是一个数字时is_nan()不会返回。TRUE您报告的代码还包含另一个错误:empty()只能与变量一起使用,如PHP 文档中所述。

empty()仅检查变量,因为其他任何内容都会导致解析错误。换句话说,以下内容将不起作用:empty(trim($name)).

我报告的代码显示了“video/video1”等路径的块;如果您还想为“video/video1/edit”等路径显示块,则应使用以下代码。

<?php
  $arg1 = arg(1);
  return (arg(0) == 'video' && !empty($arg1) && !is_numeric($arg1));
?>

如果您要查找的路径是路径别名,则使用arg()不起作用。假设“video/video1”是“node/10”的路径别名;在这种情况下,arg(0)将返回“节点”,arg(1)并将返回“10”。这同样适用$_GET['q']于“node/10”。

这是因为 Drupal 在其引导过程$_GET['q']中使用以下代码进行初始化:

  // Drupal 6.
  if (!empty($_GET['q'])) {
    $_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/'));
  }
  else {
    $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node'));
  }
  // Drupal 7.
  if (!empty($_GET['q'])) {
    $_GET['q'] = drupal_get_normal_path($_GET['q']);
  }
  else {
    $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node'));
  }

如果您正在检查的是路径别名,那么您应该使用以下代码:

// Drupal 6.
$arg = explode('/', drupal_get_path_alias($_GET['q']);
return (arg[0] == 'video' && !empty($arg[1]) && !is_numeric(arg[1]) && empty($arg[2]));
// Drupal 7.
$arg = explode('/', drupal_get_path_alias();
return (arg[0] == 'video' && !empty($arg[1]) && !is_numeric(arg[1]) && empty($arg[2]));
于 2011-08-25T20:23:57.773 回答
0

不知道,你的论点是什么样的,但我假设你混合了两种类型。is_nan() 适用于数字。如果要测试,如果一个值是一个数字,

var_dump(is_numeric(arg(1));

is_nan()测试,如果“数字”值是具体值或“非数字”,如“无限”或“0/0”等的结果。

于 2011-08-25T19:12:14.667 回答