Гуру, подскажите, я создал блок и мне его необходимо вывести только на страницах определенного типа содержимого. Я делаю следующее - в настройках блока, в области "Показывать блок на определенных страницах:" я выбираю "Показывать, если данный PHP-код возвращает TRUE (PHP-режим, только для экспертов)." и вбиваю следующий код (без тега php):
// Only show if $match is true
$match = false;
// Which node types
$types = array('og_material', 'og_publication' );
// Match current node type with array of types
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
$match |= in_array($type, $types);
}
return $match;
?>
Но блок не выводится, что я делаю не правильно? Может нужно где-то глобально разрешить PHP?
Комментарии
неверный, плохой советУ меня так и все работает:
$match = false;
$types = array('book', 'story', 'forum' );
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
$match |= in_array($type, $types);
}
return $match;
?>
Еще модуль в D6 для этого есть какой-то название не помню.
А в 7-ке это стандартная функция
Ваш код отрабатывает на ура!
Спасибо. Решило мою аналогичную проблему.
Модуль, о котором вы говорите, называется context. Чертовски хороший модуль. Работает по тому же принципу, что и "показывать блок если", только более функционален и с годным UI. Но моя самописная тема с ним не подружилась. По этому еще раз спасибо
Не совсем понял где настраивается первое и где второе?
1му комментарию не верить - он неверный.
Попробуйте вместо строчки
$match |= in_array($type, $types);
Написать просто:
return in_array($type, $types);
Если не поможет - вписывайте эхи в код, определяйте, где затык.
А что значит вписывать эхи, приведите пример?
Вписывать эхи, т.е. добавлять вывод отладочной информации.
Держите два примера:
1. Выводим на экран
<?php
// Only show if $match is true
$match = false;
// Which node types
$types = array('og_material', 'og_publication' );
// Match current node type with array of types
echo "arg(0) = " . arg(0) . "; arg(1) = " . arg(1). "\n";
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
echo "Type = " . $type;
}
return $match;
?>
2. Выводим в лог-файл. (Вообще, за такой вывод в логи нужно заставлять срать патефонными иголками, так что сразу после отладки эти логи и этот код НЕОБХОДИМО удалить)
<?php
// Only show if $match is true
$match = false;
$f = fopen("log.txt", "a+");
// Which node types
$types = array('og_material', 'og_publication' );
// Match current node type with array of types
fwrite($f, "arg(0) = " . arg(0) . "; arg(1) = " . arg(1). "\n");
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
fwrite($f, "Node = " . print_r($node, true));
$type = $node->type;
fwrite($f, "Type = " . $type);
}
fclose($f);
return $match;
?>
Подобные вещи делал используя комплексный подход.
Ставил pathauto , устанавливал для необходимого типа материала автоматические синонимы типа material/nid.
После того, как синонимы на месте можно прописать для блока отображать только на страницах material/*
Не, там еще какойто модуль есть специально под этот "отдельный чих"
Вы там вдвоем, возле компьютера?
Это от Ани код.
Вспомните, отпишитесь
Если вопрос на половину ко мне, то нет :). Да и ни с кем из сообщества не знаком. Зелен еще Ане спасибо!
нашел, модуль называется Block Node Visibility