В какой переменной взять номер текущей ноды?

Прислано: VladSavitsky

чт, 27/12/2007 - 10:38

Другие статьи по теме:

Два дня искал, но не нашёл ни на .орг, ни в инете. В книге по Дупалу и в доках по API тоже.
Мне нужно, чтобы в блоке РНР-код мог получить номер ноды, которая будет отображена в центральной части страницы.
1. В какой момент выполняется код блока? До того, как будет собрана страница или после. Может ли быть ситуация, что номер ноды ещё не известен в момент выполнения кода блока?
2. Область видимости переменных. Ничего не нашёл по этому поводу. Модули работают с функциями и локальной видимостью переменных. Они недоступны извне!.. Какие переменные я могу использовать в сниппетах?
3. Почему глобальные массивы типа $_GLOBALS пустые? Есть ли что-то взамен? Или они просто не видны из блоков (сниппетов)?
4. Как мне получить номер ноды?

Спасибо.

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано gorr в чт, 27/12/2007 - 10:46.

А может передать в блок в переменную массив $_GLOBALS в файле template.php в функции_phptemplate_variables() ?


Опубликовано gorr в чт, 27/12/2007 - 10:52.

function _phptemplate_variables($hook, $vars) {
if ($hook == 'block') {
$vars['myglobal'] = $_GLOBALS;
return $vars;
}
return array();
}


Опубликовано gorr в чт, 27/12/2007 - 11:06.

Нет, сам попробовал- ничего не выдает(пусто).


Опубликовано ultraboy@drupal.org в чт, 27/12/2007 - 11:21.

<?php

if (arg(0) == 'node' && is_numeric(arg(1))  ) {
  echo 
arg(1);
} else {
  echo 
'Это не страница ноды.';


?>


Опубликовано vadbars@drupal.org в чт, 27/12/2007 - 11:28.

Как-то так (через URL):

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  $node = node_load(arg(1));
 print $node->nid;
}

Обсуждение - здесь http://drupal.org/node/110845


Опубликовано andypost@drupal.org в чт, 27/12/2007 - 11:28.

Нужно понимать, что друпал работает на системе меню и вокруг меню строятся все остальные доступы
1) Блоки собираются на этапе темизации, это описывалось в книге точно. Блок никогда не знает, что выводится и где - его задача вывести заданный сниппет. Ничего не мешает блоку проверить по arg(...) что за пункт меню активен или какой путь в строке адреса. Так что адрес известен всегда!
2) Так как блок ничего не знает о контексте в котором он выводится - ему не передаются никакие переменные. У друпала есть несколько своих глобальных переменных. Например global $user - можно получить доступ к объекту текущего пользователя. Далее типичный сниппет if (arg(0) == 'node' && is_numeric(arg(1)) - проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1)) и проверять if ($node->nid) ... есть ли такой материал на сайте.
3 и 4 - ответы выше


Опубликовано gorr в сб, 29/12/2007 - 08:15.

А почему суперглобальный массив оказался пустым?
Например
global $user;
$_GLOBALS['user'] == $user; // должно выдавать true

Елки зеленые, да просто $_GLOBALS пишется $GLOBALS то есть без подчеркивания.


Опубликовано VladSavitsky в чт, 27/12/2007 - 13:10.

Спасибо за помощь. Проблема решена. Обобщу, чтобы закрыть тему.

РЕШЕНИЕ:

1. Блоки собираются на этапе темизации, это описывалось в книге точно. Блок никогда не знает, что выводится и где - его задача вывести заданный сниппет. Ничего не мешает блоку проверить по arg(...) что за пункт меню активен или какой путь в строке адреса. Так что адрес известен всегда! (andypost@drupal.org)

2. Так как блок ничего не знает о контексте в котором он выводится - ему не передаются никакие переменные. У друпала есть несколько своих глобальных переменных. Например global $user - можно получить доступ к объекту текущего пользователя. Далее типичный сниппет if (arg(0) == 'node' && is_numeric(arg(1)) - проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1)) и проверять if ($node->nid) ... есть ли такой материал на сайте. (andypost@drupal.org)

3. Ответ выше (andypost@drupal.org)

4. vadbars@drupal.org и ultraboy@drupal.org:

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
  $node = node_load(arg(1));
  print $node->nid;
}
?>

Обсуждение - здесь http://drupal.org/node/110845


Опубликовано kiev1 в сб, 19/04/2008 - 10:44.

проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1))

мне кажется это неправильно - если каждый лишний раз будем делать node_load да еще и в каждом блоке - то база загнется и память кончится - массив $node обычно самый большой какой есть в друпале, наверное более правильно передавать переменные $node из того места где они уже известны.


Опубликовано glu2006 в вт, 28/04/2009 - 05:18.

kiev1 написал(а):

проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1))

мне кажется это неправильно - если каждый лишний раз будем делать node_load да еще и в каждом блоке - то база загнется и память кончится - массив $node обычно самый большой какой есть в друпале, наверное более правильно передавать переменные $node из того места где они уже известны.

Значение node_load кешируется, т.е. если она отображается в центре экрана, то функция уже минимум один раз отработала и весь массив $node находится в static откуда он и берется при всех последующих вызовах функции node_load() так что ничего страшного в этом нет и никаких дополнительных нагрузок в данной ситуации это не создаст.


Опубликовано orangeudav в чт, 18/02/2010 - 13:18.

замечено, что если для ноды есть алиас, то все равно в аргументах передается node/18, что есть хорошо


Новое на сайте