В какой переменной взять номер текущей ноды?
Прислано: VladSavitsky
чт, 27/12/2007 - 10:38
Два дня искал, но не нашёл ни на .орг, ни в инете. В книге по Дупалу и в доках по API тоже.
Мне нужно, чтобы в блоке РНР-код мог получить номер ноды, которая будет отображена в центральной части страницы.
1. В какой момент выполняется код блока? До того, как будет собрана страница или после. Может ли быть ситуация, что номер ноды ещё не известен в момент выполнения кода блока?
2. Область видимости переменных. Ничего не нашёл по этому поводу. Модули работают с функциями и локальной видимостью переменных. Они недоступны извне!.. Какие переменные я могу использовать в сниппетах?
3. Почему глобальные массивы типа $_GLOBALS пустые? Есть ли что-то взамен? Или они просто не видны из блоков (сниппетов)?
4. Как мне получить номер ноды?
Спасибо.
- VladSavitsky's blog
- Для комментирования войдите или зарегистрируйтесь
А может передать в блок в переменную массив $_GLOBALS в файле template.php в функции_phptemplate_variables() ?
- Для комментирования войдите или зарегистрируйтесь
function _phptemplate_variables($hook, $vars) {
if ($hook == 'block') {
$vars['myglobal'] = $_GLOBALS;
return $vars;
}
return array();
}
- Для комментирования войдите или зарегистрируйтесь
Нет, сам попробовал- ничего не выдает(пусто).
- Для комментирования войдите или зарегистрируйтесь
<?php
if (arg(0) == 'node' && is_numeric(arg(1)) ) {
echo arg(1);
} else {
echo 'Это не страница ноды.';
}
?>- Для комментирования войдите или зарегистрируйтесь
Как-то так (через URL):
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) { $node = node_load(arg(1)); print $node->nid; }
Обсуждение - здесь http://drupal.org/node/110845
- Для комментирования войдите или зарегистрируйтесь
Нужно понимать, что друпал работает на системе меню и вокруг меню строятся все остальные доступы
1) Блоки собираются на этапе темизации, это описывалось в книге точно. Блок никогда не знает, что выводится и где - его задача вывести заданный сниппет. Ничего не мешает блоку проверить по arg(...) что за пункт меню активен или какой путь в строке адреса. Так что адрес известен всегда!
2) Так как блок ничего не знает о контексте в котором он выводится - ему не передаются никакие переменные. У друпала есть несколько своих глобальных переменных. Например global $user - можно получить доступ к объекту текущего пользователя. Далее типичный сниппет if (arg(0) == 'node' && is_numeric(arg(1)) - проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1)) и проверять if ($node->nid) ... есть ли такой материал на сайте.
3 и 4 - ответы выше
- Для комментирования войдите или зарегистрируйтесь
А почему суперглобальный массив оказался пустым?
Например
global $user;
$_GLOBALS['user'] == $user; // должно выдавать true
Елки зеленые, да просто $_GLOBALS пишется $GLOBALS то есть без подчеркивания.
- Для комментирования войдите или зарегистрируйтесь
Спасибо за помощь. Проблема решена. Обобщу, чтобы закрыть тему.
РЕШЕНИЕ:
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
- Для комментирования войдите или зарегистрируйтесь
проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1))
мне кажется это неправильно - если каждый лишний раз будем делать node_load да еще и в каждом блоке - то база загнется и память кончится - массив $node обычно самый большой какой есть в друпале, наверное более правильно передавать переменные $node из того места где они уже известны.
- Для комментирования войдите или зарегистрируйтесь
проверка, выводится ли в данный момент нода, но обязательно нужно делать $node = node_load(arg(1))
мне кажется это неправильно - если каждый лишний раз будем делать node_load да еще и в каждом блоке - то база загнется и память кончится - массив $node обычно самый большой какой есть в друпале, наверное более правильно передавать переменные $node из того места где они уже известны.
Значение node_load кешируется, т.е. если она отображается в центре экрана, то функция уже минимум один раз отработала и весь массив $node находится в static откуда он и берется при всех последующих вызовах функции node_load() так что ничего страшного в этом нет и никаких дополнительных нагрузок в данной ситуации это не создаст.
- Для комментирования войдите или зарегистрируйтесь
замечено, что если для ноды есть алиас, то все равно в аргументах передается node/18, что есть хорошо
- Для комментирования войдите или зарегистрируйтесь








Комментарии