簡體   English   中英

Drupal PHP塊可見性規則

[英]Drupal PHP block visibility rules

在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;
  }
?>

我假設這是在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;
}

您只需使用以下代碼:

<?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)將返回“node”,而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]));

不知道,你的論點是什么樣的,但我認為你混淆了兩種類型。 is_nan() 適用於數字。 如果要測試,如果值是數字,

var_dump(is_numeric(arg(1));

is_nan()測試,如果“數字”值是具體值或“非數字”如“無限”或“0/0”等的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM