Правила видимости блока Drupal PHP

В настройках видимости страницы блока Drupal я бы хотел, чтобы определенный блок не отображался, если второе значение в пути является числом. Кажется, это не работает для меня. Ваше здоровье.

Показывать блок ТОЛЬКО, когда аргументы:

domain.com/video/one (аргумент 0 — это «видео», а аргумент 1 присутствует, а НЕ число)

Не показывать:

домен.com/видео

домен.com/video/1

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

person Allan Thomas    schedule 25.08.2011    source источник
comment
Что именно не работает? Что содержат переменные-аргументы?   -  person Pekka    schedule 25.08.2011
comment
Где вы используете этот код? Используете ли вы его в реализации хука или используете его как PHP-код, который решает, когда следует показывать модуль? Что вы ожидаете от URL-адреса?   -  person apaderno    schedule 25.08.2011
comment
Приносим извинения, это для блока в разделе «Настройки видимости страницы». Аргументы: /video/video1 должен показывать блок, /video/1 /video/1/... не должен показывать блок   -  person Allan Thomas    schedule 31.08.2011


Ответы (3)


Я предполагаю, что это функция 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;
}
person Clive    schedule 25.08.2011
comment
Возвращаемое значение должно быть TRUE, когда блок должен быть показан. - person apaderno; 07.09.2011
comment
Согласно исходному сообщению, TRUE должно быть возвращено, когда блок не должен отображаться. - person Clive; 07.09.2011
comment
Я действительно так думал, поэтому мой комментарий к исходному коду: Вы уверены, что должны возвращать TRUE здесь? - person Clive; 07.09.2011
comment
Третий параметр для блока Показать на определенных страницах говорит Показать, если следующий код PHP возвращает TRUE (режим PHP, только для экспертов). Когда код возвращает FALSE, блок не отображается. Это вариант, который использует OP, и на который он ссылается, говоря о настройках видимости для конкретной страницы. - person apaderno; 07.09.2011
comment
Это по-прежнему показывает блок на /video/1 и не показывает блок на /video/one - person Allan Thomas; 08.09.2011

Вы можете просто использовать следующий код:

<?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'], который будет равен «узел/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]));
person apaderno    schedule 25.08.2011
comment
Я хочу показать блок, когда второй аргумент не является числом. - person Allan Thomas; 31.08.2011

Не знаю, как выглядят ваши аргументы, но я предполагаю, что вы перепутали два типа типов. is_nan() только работает с числами. Если вы хотите проверить, является ли значение числом,

var_dump(is_numeric(arg(1));

is_nan() проверяет, является ли «числовое» значение конкретным значением или «не числом», например «бесконечным», или результатом «0/0» или подобным.

person KingCrunch    schedule 25.08.2011