您在這裡

用php控制區塊的顯示?

hanamizuki's 的頭像
hanamizuki 在 2009-05-06 (三) 14:02 發表

因為版型設計的關係,常常會需要「A區塊顯示在A內容類型」、「B區塊顯示在B內容類型」,
之前我會用pathauto,把A內容類型的路徑統一,
但現在有點想直接用php控制,但一直弄不好,以下是我的寫法:

在區塊->特定頁面的顯示設定->選「如果以下的PHP程式碼傳回TRUE則顯示」


<?php
global $node;
if($node->type==journey){return TRUE;}

?>

這邊有解:
http://drupal1.kiev1.org/Drupal_Controlling_block_visibility_with_PHP.html

應該是這樣

<?php
$match = FALSE;
$types = array('story' => 1, 'page' => 1);
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
if (isset($types[$type])) {
$match = TRUE;
}
}
return $match;
?>

一定要這樣複雜嗎?(我不太會PHP)


<?php
global $node;
if($node->type==journey){return TRUE;}
?>

這個寫法是有問題的
第一是在 block 的樣板裡沒有 $node 的資料可以用
第二是頁面裡面可能不只讀取一篇 node,所以不可能用 global $node ,而且也沒有判斷是不是在單一 node 的頁面
第三是journey這個字串沒有用引號包起來


<?php
$match = FALSE;
$types = array('story' => 1, 'page' => 1);
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
$node = node_load(array('nid' => $nid));
$type = $node->type;
if (isset($types[$type])) {
$match = TRUE;
}
}
return $match;
?>

這一段主要是讓區塊在 node/[nid] 路徑底下
凡是遇到 nodetype 屬於 story 或 page 的時候都顯示區塊

如果只需要單一某種 nodetype 才顯示

<?php
if (arg(0) == 'node' && is_numeric(arg(1))) {
$node = node_load(array('nid' => arg(1)));
if($node->type == '[node_type_A]') return TRUE;
//}
}
return FALSE;
?>

這樣子就可以了
B區塊 就把 [node_type_A] 改成 [node_type_B]