2011-08-25 94 views
0

在Drupal块的页面可见性设置我想阻止显示某个块,如果路径中的第二个值是一个数字。这似乎不适合我。干杯。Drupal的PHP块可见性规则

显示块,只有当参数是:

domain.com/video/one(ARG 0是 '视频' 和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; 
    } 
?> 
+0

什么不工作?参数变量包含什么? –

+0

你在哪里使用该代码?您是在钩子实现中使用它,还是将它用作决定何时显示模块的PHP代码?你在期待网址是什么? – kiamlaluno

+0

道歉,这是针对“页面特定的可见性设置”下的块 参数:/ video/video1应该显示块,/ video/1/video/1/...不应显示块 – atb

回答

0

不知道,什么ÿ我们的论点看起来像,但我认为你混合了两种类型。 is_nan()只有适用于数字。如果你想测试,如果值是一个数字,

var_dump(is_numeric(arg(1)); 

is_nan()测试,如果一个“数字”值是一个具体的数值或者“非数字”喜欢“无限”或结果“0/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; 
} 
+0

返回的值应该必须显示块时为'TRUE'。 – kiamlaluno

+0

根据原始帖子,当不应显示块时,应返回“TRUE”。 – Clive

+0

我确实这么认为,因此我对原始代码的评论是:“你确定你应该在这里返回TRUE吗?” – Clive

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 documentation中所报告。

empty()只检查变量,否则会导致分析错误。换句话说,以下内容不起作用:empty(trim($name))

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

<?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])); 
+0

我想在第二个参数不是数字时显示该块。 – atb

+0

仍然无法正常工作... – atb