Drupal PHP块可见性规则

时间:2011-08-25 19:00:43

标签: drupal drupal-blocks

在Drupal块的页面可见性设置中,我想阻止某个块显示路径中的第二个值是否为数字。这对我来说似乎没有用。欢呼声。

仅在参数为:

时显示块

domain.com/video/one(arg 0为'video'且arg 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;
  }
?>

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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()。 您报告的代码也包含其他错误:empty()只能用于变量,如PHP documentation中所述。

  

empty(trim($name))仅检查变量,因为其他任何内容都会导致解析错误。换句话说,以下操作无效:<?php $arg1 = arg(1); return (arg(0) == 'video' && !empty($arg1) && !is_numeric($arg1)); ?>

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

arg()

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

这是因为Drupal在其引导期间使用以下代码初始化 // 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]));
{{1}}

答案 2 :(得分:0)

不知道,你的论点是什么样的,但我认为你混淆了两种类型。 is_nan() 只有才能使用数字。如果要测试,如果值是数字,

var_dump(is_numeric(arg(1));

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