Вывод блока по типу содержимого

Главные вкладки

Аватар пользователя Funtik44 Funtik44 31 марта 2011 в 11:00

Гуру, подскажите, я создал блок и мне его необходимо вывести только на страницах определенного типа содержимого. Я делаю следующее - в настройках блока, в области "Показывать блок на определенных страницах:" я выбираю "Показывать, если данный PHP-код возвращает TRUE (PHP-режим, только для экспертов)." и вбиваю следующий код (без тега 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?

Комментарии

Аватар пользователя VasyOK VasyOK 31 марта 2011 в 11:08

У меня так и все работает:

<?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-ке это стандартная функция Smile

Аватар пользователя Cypher Cypher 31 марта 2011 в 16:13

VasyOK wrote:
У меня так и все работает:

<?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-ке это стандартная функция :)

Ваш код отрабатывает на ура! Smile
Спасибо. Решило мою аналогичную проблему.

Модуль, о котором вы говорите, называется context. Чертовски хороший модуль. Работает по тому же принципу, что и "показывать блок если", только более функционален и с годным UI. Но моя самописная тема с ним не подружилась. По этому еще раз спасибо Wink

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 31 марта 2011 в 11:10

1му комментарию не верить - он неверный.
Попробуйте вместо строчки
$match |= in_array($type, $types);
Написать просто:
return in_array($type, $types);

Если не поможет - вписывайте эхи в код, определяйте, где затык.

Аватар пользователя G.A. Vinogradov G.A. Vinogradov 31 марта 2011 в 11:34

Вписывать эхи, т.е. добавлять вывод отладочной информации.
Держите два примера:
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;

    

$match |= in_array($type$types);
  }
 
  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($nodetrue));
    
$type $node->type;
  
    
fwrite($f"Type = " $type);

    

$match |= in_array($type$types);
  }
  
fclose($f);
  return 
$match;
?>
Аватар пользователя alexxrin alexxrin 31 марта 2011 в 12:02

Подобные вещи делал используя комплексный подход.
Ставил pathauto , устанавливал для необходимого типа материала автоматические синонимы типа material/nid.
После того, как синонимы на месте можно прописать для блока отображать только на страницах material/*

Аватар пользователя VasyOK VasyOK 31 марта 2011 в 17:03

Не, там еще какойто модуль есть специально под этот "отдельный чих"
Вы там вдвоем, возле компьютера?

Это от Ани код.

Аватар пользователя Cypher Cypher 31 марта 2011 в 20:16

VasyOK wrote:
Не, там еще какойто модуль есть специально под этот "отдельный чих"

Вспомните, отпишитесь Smile

VasyOK wrote:
Вы там вдвоем, возле компьютера?

Если вопрос на половину ко мне, то нет :). Да и ни с кем из сообщества не знаком. Зелен еще Smile

VasyOK wrote:
Это от Ани код.
Ане спасибо! Smile